<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Blended Cocoa]]></title>
  <link href="http://www.blendedcocoa.com/atom.xml" rel="self"/>
  <link href="http://www.blendedcocoa.com/"/>
  <updated>2014-06-12T14:27:42+08:00</updated>
  <id>http://www.blendedcocoa.com/</id>
  <author>
    <name><![CDATA[Matthew Robinson]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[__FILE__, __FUNCTION__, __LINE__ and __COLUMN__ as defaults in Swift]]></title>
    <link href="http://www.blendedcocoa.com/blog/2014/06/12/file-function-etc-as-defaults-in-swift/"/>
    <updated>2014-06-12T10:35:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2014/06/12/file-function-etc-as-defaults-in-swift</id>
    <content type="html"><![CDATA[<p>I was experimenting with methods of debug logging in Swift and came across an interesting find.  If you use the <code>__FILE__</code>, <code>__FUNCTION__</code>, <code>__LINE__</code> and <code>__COLUMN__</code> &ldquo;macros&rdquo; as default function parameter values in Swift the value is set to the file, function etc of the caller rather than the details of the called functions location.</p>

<p>This means you can automatically pass information about a calling function by providing default values.  For example:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>func DLog(message: String, file: String = __FUNCTION__, function: String = __FILE__, line: Int = __LINE__, column: Int = __COLUMN__) {
</span><span class='line'>  println("\(file) : \(function) : \(line) : \(column) - \(message)")
</span><span class='line'>}
</span><span class='line'>
</span><span class='line'>func applicationDidFinishLaunching(aNotification: NSNotification?) {
</span><span class='line'>  DLog("App Did Finish Launching")
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>This will display a message of the form:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>.../AppDelegate.swift : applicationDidFinishLaunching : 16 : 14 - App Did Finish Lauching</span></code></pre></td></tr></table></div></figure>


<p>Clearly <code>__FILE__</code>, <code>__FUNCTION__</code>, <code>__LINE__</code> and <code>__COLUMN__</code> are not implemented using a preprocessor but then we knew that already.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Supporting Swift in CodeRunner]]></title>
    <link href="http://www.blendedcocoa.com/blog/2014/06/11/quick-and-dirty-support-for-swift-in-coderunner/"/>
    <updated>2014-06-11T11:30:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2014/06/11/quick-and-dirty-support-for-swift-in-coderunner</id>
    <content type="html"><![CDATA[<p>I like to use CodeRunner to test out quick snippets of code.  I have added Swift as a supported language.  I did this by adapting the Objective-C <code>compile.sh</code> script that is used by CodeRunner to compile Objective-C with <code>clang</code>. Hopefully the next release of CodeRunner will support Swift out of the box with a better compiler script and syntax highlighting.</p>

<p>In the CodeRunner Preferences add a new language, check the <code>Language uses compilation script</code> checkbox and edit the script to contain the following:</p>

<figure class='code'><figcaption><span>compile.sh</span><a href='https://gist.github.com/mttrb/60d9f62633cf9e585504'>View Gist </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'><span class="c"># This is a CodeRunner compilation script. Compilation scripts are used to</span>
</span><span class='line'><span class="c"># compile code before being run using the run command specified in CodeRunner</span>
</span><span class='line'><span class="c"># preferences. This script should have the following properties:</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Launch directory ($PWD):      Will be the same as the file being run</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Exit status:                  Should be 0 on success (will cause CodeRunner</span>
</span><span class='line'><span class="c">#                               to continue and execute the run command)</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Output (stdout):              On success, one line of text which can be accessed</span>
</span><span class='line'><span class="c">#                               using the $compiler variable in the run command</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Output (stderr):              Anything outputted here will be displayed in</span>
</span><span class='line'><span class="c">#                               the CodeRunner console</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># Arguments:                    $1      Filename of the source file</span>
</span><span class='line'><span class="c">#                               $2      Encoding of the source file</span>
</span><span class='line'><span class="c">#                               $3      Compilation flags set in CodeRunner preferences</span>
</span><span class='line'><span class="c">#                               $4      Path of a temporary directory (without / suffix)</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'><span class="c"># The encoding argument may be used to specify to the compiler which encoding</span>
</span><span class='line'><span class="c"># the source file uses. It will be one of the integers in the following array:</span>
</span><span class='line'>
</span><span class='line'>enc<span class="o">[</span>4<span class="o">]=</span><span class="s2">&quot;&quot;</span>       <span class="c"># UTF-8</span>
</span><span class='line'>enc<span class="o">[</span>10<span class="o">]=</span><span class="s2">&quot;&quot;</span>      <span class="c"># UTF-16</span>
</span><span class='line'>enc<span class="o">[</span>5<span class="o">]=</span><span class="s2">&quot;&quot;</span>       <span class="c"># ISO Latin 1</span>
</span><span class='line'>enc<span class="o">[</span>9<span class="o">]=</span><span class="s2">&quot;&quot;</span>       <span class="c"># ISO Latin 2</span>
</span><span class='line'>enc<span class="o">[</span>30<span class="o">]=</span><span class="s2">&quot;&quot;</span>      <span class="c"># Mac OS Roman</span>
</span><span class='line'>enc<span class="o">[</span>12<span class="o">]=</span><span class="s2">&quot;&quot;</span>      <span class="c"># Windows Latin 1</span>
</span><span class='line'>enc<span class="o">[</span>3<span class="o">]=</span><span class="s2">&quot;&quot;</span>       <span class="c"># Japanese (EUC)</span>
</span><span class='line'>enc<span class="o">[</span>8<span class="o">]=</span><span class="s2">&quot;&quot;</span>       <span class="c"># Japanese (Shift JIS)</span>
</span><span class='line'>enc<span class="o">[</span>1<span class="o">]=</span><span class="s2">&quot;&quot;</span>       <span class="c"># ASCII</span>
</span><span class='line'>
</span><span class='line'><span class="nv">compname</span><span class="o">=</span><span class="sb">`</span><span class="nb">echo</span> <span class="s2">&quot;$1&quot;</span> | sed <span class="s1">&#39;s/\(.*\)\..*/\1/&#39;</span><span class="sb">`</span>
</span><span class='line'>
</span><span class='line'>xcrun swift -sdk <span class="k">$(</span>xcrun --show-sdk-path --sdk macosx<span class="k">)</span> <span class="s2">&quot;$1&quot;</span> -o <span class="s2">&quot;$compname&quot;</span> <span class="nv">$3</span>
</span><span class='line'>
</span><span class='line'><span class="nv">status</span><span class="o">=</span><span class="nv">$?</span>
</span><span class='line'><span class="k">if</span> <span class="o">[</span> <span class="nv">$status</span> -eq 0 <span class="o">]</span>
</span><span class='line'><span class="k">then</span>
</span><span class='line'><span class="nb">echo</span> <span class="nv">$compname</span>
</span><span class='line'><span class="nb">exit </span>0
</span><span class='line'><span class="k">elif</span> <span class="o">[</span> <span class="nv">$status</span> -eq 127 <span class="o">]</span>
</span><span class='line'><span class="k">then</span>
</span><span class='line'><span class="nb">echo</span> -e <span class="s2">&quot;\nTo run code in this language, you need to have compilers installed. These are bundled with Xcode 6 or later which can be downloaded through the Mac App Store or Apple&#39;s developer site.&quot;</span>
</span><span class='line'><span class="k">fi</span>
</span><span class='line'><span class="nb">exit</span> <span class="nv">$status</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>Run Command</code> needs to be set to <code>./$compiler</code>.</p>

<p>I set my <code>Code Template</code> to the following to include all the Cocoa goodness and set the file extension to <code>swift</code>:</p>

<figure class='code'><figcaption><span>Template </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>import Cocoa
</span><span class='line'>
</span><span class='line'>%@</span></code></pre></td></tr></table></div></figure>


<p>Finally, you&rsquo;ll probably want to change <code>New Language</code> to <code>Swift</code> by right-clicking in the Language list.</p>

<p>Here is a screenshot of the settings:</p>

<p><img src="http://www.blendedcocoa.com/images/CodeRunner-Swift.png" title="CodeRunner Swift Settings" ></p>

<p>In order to allow the <code>xcrun</code> command in the compilation script to find swift you need to ensure that <code>xcode-select</code> is pointing at a version of Xcode that includes the <code>swift</code> compiler, e.g.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo xcode-select -s /Applications/Xcode6-Beta.app/Contents/Developer</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mavericks as an iBeacon]]></title>
    <link href="http://www.blendedcocoa.com/blog/2013/11/02/mavericks-as-an-ibeacon/"/>
    <updated>2013-11-02T17:58:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2013/11/02/mavericks-as-an-ibeacon</id>
    <content type="html"><![CDATA[<p>With the release of Mavericks, Apple have brought the capabilities of Core Bluetooth in line with those of iOS.  In particular Mavericks can now function as a peripheral thanks to the inclusion of  the <code>CBPeripheralManager</code> class.</p>

<p>However, Apple have chosen not to include support for iBeacons in Mavericks. iBeacon support on iOS 7 has been implemented as part of the Core Location framework but Core Location on Mavericks doesn&rsquo;t contain any iBeacon support.</p>

<p>iBeacons are built on top of Core Bluetooth so I wondered whether it would be possible to use a MacBook running Mavericks to create an iBeacon.</p>

<h2>iOS as an iBeacon</h2>

<p>On iOS we can use a Bluetooth 4 enabled device to create an iBeacon using the following code:</p>

<figure class='code'><figcaption><span>BLCAppDelegate.m</span><a href='https://github.com/mttrb/NSScotland-iBeacon/blob/master/iOSBeacon/Beacon/BLCAppDelegate.m'>link</a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  BLCAppDelegate.m</span>
</span><span class='line'><span class="c1">//  Beacon</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  Created by Matthew Robinson on 15/09/13.</span>
</span><span class='line'><span class="c1">//  Copyright (c) 2013 Blended Cocoa. All rights reserved.</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &quot;BLCAppDelegate.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;CoreLocation/CoreLocation.h&gt;</span>
</span><span class='line'><span class="cp">#import &lt;CoreBluetooth/CoreBluetooth.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">BLCAppDelegate</span> <span class="p">()</span> <span class="o">&lt;</span><span class="n">CBPeripheralManagerDelegate</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">CBPeripheralManager</span> <span class="o">*</span><span class="n">peripheralManager</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">BLCAppDelegate</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span><span class="nf">application:</span><span class="p">(</span><span class="n">UIApplication</span> <span class="o">*</span><span class="p">)</span><span class="nv">application</span> <span class="nf">didFinishLaunchingWithOptions:</span><span class="p">(</span><span class="n">NSDictionary</span> <span class="o">*</span><span class="p">)</span><span class="nv">launchOptions</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">_peripheralManager</span> <span class="o">=</span> <span class="p">[[</span><span class="n">CBPeripheralManager</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithDelegate:</span><span class="n">self</span>
</span><span class='line'>                                                                 <span class="nl">queue:</span><span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">peripheralManagerDidUpdateState:</span><span class="p">(</span><span class="n">CBPeripheralManager</span> <span class="o">*</span><span class="p">)</span><span class="nv">peripheral</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">peripheral</span><span class="p">.</span><span class="n">state</span> <span class="o">==</span> <span class="n">CBPeripheralManagerStatePoweredOn</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">NSUUID</span> <span class="o">*</span><span class="n">proximityUUID</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSUUID</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithUUIDString:</span><span class="s">@&quot;A7C4C5FA-A8DD-4BA1-B9A8-A240584F02D3&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">CLBeaconRegion</span> <span class="o">*</span><span class="n">region</span> <span class="o">=</span> <span class="p">[[</span><span class="n">CLBeaconRegion</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithProximityUUID:</span><span class="n">proximityUUID</span>
</span><span class='line'>                                                                         <span class="nl">major:</span><span class="mi">1</span>
</span><span class='line'>                                                                         <span class="nl">minor:</span><span class="mi">1000</span>
</span><span class='line'>                                                                    <span class="nl">identifier:</span><span class="s">@&quot;com.blendedcocoa.beacon&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">NSDictionary</span> <span class="o">*</span><span class="n">proximityData</span> <span class="o">=</span> <span class="p">[</span><span class="n">region</span> <span class="nl">peripheralDataWithMeasuredPower:</span><span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>        <span class="p">[</span><span class="n">peripheral</span> <span class="nl">startAdvertising:</span><span class="n">proximityData</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">peripheralManagerDidStartAdvertising:</span><span class="p">(</span><span class="n">CBPeripheralManager</span> <span class="o">*</span><span class="p">)</span><span class="nv">peripheral</span> <span class="nf">error:</span><span class="p">(</span><span class="n">NSError</span> <span class="o">*</span><span class="p">)</span><span class="nv">error</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Started advertising&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Creating an iBeacon on iOS is quite simple.  First we create a <code>CLBeaconRegion</code> with the required <code>proximityUUID</code>, <code>major</code> &amp; <code>minor</code> and then use the <code>peripheralDataWithMeasuredPower:</code> method to get an <code>NSDictionary</code> containing the advertising data to be passed to Core Bluetooth.</p>

<h2>Advertisement Data</h2>

<p>It occurred to me that it may be possible to take this <code>NSDictionary</code> and pass it to a <code>CBPeripheralManager</code> instance on Mavericks.</p>

<p>Using <code>NSKeyedArchiver</code> and <code>NSKeyedUnarchiver</code> it was easy to transfer the <code>NSDictionary</code> to an OS X app running on Mavericks and passing the dictionary to a <code>CBPeripheralManager</code> resulted in an iBeacon that could be detected by an iOS device.</p>

<p>Obviously it isn&rsquo;t very convenient to create the adverisement data on iOS and then transfer the archived data to an OS X app so the next step was to investigate to see exactly what was being stored in the dictionary.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>{
</span><span class='line'>    kCBAdvDataAppleBeaconKey = &lt;a7c4c5fa a8dd4ba1 b9a8a240 584f02d3 00040fa0 c5>;
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>The dictionary key is the <code>NSString</code> literal <code>kCBAdvDataAppleBeaconKey</code>.  The value is an <code>NSData</code> object contaning the <code>proximityUUID</code>, <code>major</code>, <code>minor</code> and the calibrated measured power (in 2&rsquo;s complement).  It wasn&rsquo;t very hard to take this information and create a class to generate the advertisement dictionary directly on OS X.</p>

<figure class='code'><figcaption><span>BLCBeaconAdvertisementData.h</span><a href='https://github.com/mttrb/BeaconOSX/blob/master/BeaconOSX/BLCBeaconAdvertisementData.h'>link</a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  BLCBeaconAdvertisementData.h</span>
</span><span class='line'><span class="c1">//  BeaconOSX</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  Created by Matthew Robinson on 1/11/2013.</span>
</span><span class='line'><span class="c1">//  Copyright (c) 2013 Blended Cocoa. All rights reserved.</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;Foundation/Foundation.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">BLCBeaconAdvertisementData</span> : <span class="nc">NSObject</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSUUID</span> <span class="o">*</span><span class="n">proximityUUID</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">uint16_t</span> <span class="n">major</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">uint16_t</span> <span class="n">minor</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">int8_t</span> <span class="n">measuredPower</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithProximityUUID:</span><span class="p">(</span><span class="n">NSUUID</span> <span class="o">*</span><span class="p">)</span><span class="nv">proximityUUID</span>
</span><span class='line'>                      <span class="nf">major:</span><span class="p">(</span><span class="n">uint16_t</span><span class="p">)</span><span class="nv">major</span>
</span><span class='line'>                      <span class="nf">minor:</span><span class="p">(</span><span class="n">uint16_t</span><span class="p">)</span><span class="nv">minor</span>
</span><span class='line'>              <span class="nf">measuredPower:</span><span class="p">(</span><span class="n">int8_t</span><span class="p">)</span><span class="nv">power</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="n">NSDictionary</span> <span class="o">*</span><span class="p">)</span><span class="nf">beaconAdvertisement</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>BLCBeaconAdvertisementData.m</span><a href='https://github.com/mttrb/BeaconOSX/blob/master/BeaconOSX/BLCBeaconAdvertisementData.m'>link</a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  BLCBeaconAdvertisementData.m</span>
</span><span class='line'><span class="c1">//  BeaconOSX</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  Created by Matthew Robinson on 1/11/2013.</span>
</span><span class='line'><span class="c1">//  Copyright (c) 2013 Blended Cocoa. All rights reserved.</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &quot;BLCBeaconAdvertisementData.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">BLCBeaconAdvertisementData</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithProximityUUID:</span><span class="p">(</span><span class="n">NSUUID</span> <span class="o">*</span><span class="p">)</span><span class="nv">proximityUUID</span> <span class="nf">major:</span><span class="p">(</span><span class="n">uint16_t</span><span class="p">)</span><span class="nv">major</span> <span class="nf">minor:</span><span class="p">(</span><span class="n">uint16_t</span><span class="p">)</span><span class="nv">minor</span> <span class="nf">measuredPower:</span><span class="p">(</span><span class="n">int8_t</span><span class="p">)</span><span class="nv">power</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">proximityUUID</span> <span class="o">=</span> <span class="n">proximityUUID</span><span class="p">;</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">major</span> <span class="o">=</span> <span class="n">major</span><span class="p">;</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">minor</span> <span class="o">=</span> <span class="n">minor</span><span class="p">;</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">measuredPower</span> <span class="o">=</span> <span class="n">power</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="n">NSDictionary</span> <span class="o">*</span><span class="p">)</span><span class="nf">beaconAdvertisement</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span><span class="n">beaconKey</span> <span class="o">=</span> <span class="s">@&quot;kCBAdvDataAppleBeaconKey&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">advertisementBytes</span><span class="p">[</span><span class="mi">21</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">proximityUUID</span> <span class="nl">getUUIDBytes:</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">advertisementBytes</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">advertisementBytes</span><span class="p">[</span><span class="mi">16</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="p">)(</span><span class="n">self</span><span class="p">.</span><span class="n">major</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">);</span>
</span><span class='line'>    <span class="n">advertisementBytes</span><span class="p">[</span><span class="mi">17</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="p">)(</span><span class="n">self</span><span class="p">.</span><span class="n">major</span> <span class="o">&amp;</span> <span class="mi">255</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">advertisementBytes</span><span class="p">[</span><span class="mi">18</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="p">)(</span><span class="n">self</span><span class="p">.</span><span class="n">minor</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">);</span>
</span><span class='line'>    <span class="n">advertisementBytes</span><span class="p">[</span><span class="mi">19</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="p">)(</span><span class="n">self</span><span class="p">.</span><span class="n">minor</span> <span class="o">&amp;</span> <span class="mi">255</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">advertisementBytes</span><span class="p">[</span><span class="mi">20</span><span class="p">]</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">measuredPower</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSMutableData</span> <span class="o">*</span><span class="n">advertisement</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSMutableData</span> <span class="nl">dataWithBytes:</span><span class="n">advertisementBytes</span> <span class="nl">length:</span><span class="mi">21</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span><span class="n">NSDictionary</span> <span class="nl">dictionaryWithObject:</span><span class="n">advertisement</span> <span class="nl">forKey:</span><span class="n">beaconKey</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Mavericks as an iBeacon</h2>

<p>Finally, we are now able to create an iBeacon on OS X using the following code which is similar to the iOS version but uses <code>BLCBeaconAdvertisementData</code> instead of a <code>CLBeaconRegion</code> to create the adverisement.</p>

<figure class='code'><figcaption><span>BLCAppDelegate.m</span><a href='https://github.com/mttrb/BeaconOSX/blob/master/BeaconOSX/BLCAppDelegate.m'>link</a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  BLCAppDelegate.m</span>
</span><span class='line'><span class="c1">//  BeaconOSX</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">//  Created by Matthew Robinson on 1/11/2013.</span>
</span><span class='line'><span class="c1">//  Copyright (c) 2013 Blended Cocoa. All rights reserved.</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &quot;BLCAppDelegate.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;IOBluetooth/IOBluetooth.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &quot;BLCBeaconAdvertisementData.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">BLCAppDelegate</span> <span class="p">()</span> <span class="o">&lt;</span><span class="n">CBPeripheralManagerDelegate</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span><span class="n">strong</span><span class="p">)</span> <span class="n">CBPeripheralManager</span> <span class="o">*</span><span class="n">manager</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">BLCAppDelegate</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">applicationDidFinishLaunching:</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="p">)</span><span class="nv">aNotification</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">_manager</span> <span class="o">=</span> <span class="p">[[</span><span class="n">CBPeripheralManager</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithDelegate:</span><span class="n">self</span>
</span><span class='line'>                                                       <span class="nl">queue:</span><span class="nb">nil</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">peripheralManagerDidUpdateState:</span><span class="p">(</span><span class="n">CBPeripheralManager</span> <span class="o">*</span><span class="p">)</span><span class="nv">peripheral</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">peripheral</span><span class="p">.</span><span class="n">state</span> <span class="o">==</span> <span class="n">CBPeripheralManagerStatePoweredOn</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">NSUUID</span> <span class="o">*</span><span class="n">proximityUUID</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSUUID</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithUUIDString:</span><span class="s">@&quot;A6C4C5FA-A8DD-4BA1-B9A8-A240584F02D3&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">BLCBeaconAdvertisementData</span> <span class="o">*</span><span class="n">beaconData</span> <span class="o">=</span> <span class="p">[[</span><span class="n">BLCBeaconAdvertisementData</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithProximityUUID:</span><span class="n">proximityUUID</span>
</span><span class='line'>                                                                                                     <span class="nl">major:</span><span class="mi">5</span>
</span><span class='line'>                                                                                                     <span class="nl">minor:</span><span class="mi">5000</span>
</span><span class='line'>                                                                                             <span class="nl">measuredPower:</span><span class="o">-</span><span class="mi">58</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>        <span class="p">[</span><span class="n">peripheral</span> <span class="nl">startAdvertising:</span><span class="n">beaconData</span><span class="p">.</span><span class="n">beaconAdvertisement</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>That is all that is needed to create an iBeacon using a Bluetooth 4 enabled Mac running Mavericks.  Fortunately, the Core Bluetooth framework on Mavericks understands what to do with the iBeacon advertisement data even though iBeacon support hasn&rsquo;t been added to Core Location.</p>

<p>Source code is available on GitHub at <a href="https://github.com/mttrb/BeaconOSX">https://github.com/mttrb/BeaconOSX</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Failing to update the `pt_deny_attach` kernel module for Mountain Lion]]></title>
    <link href="http://www.blendedcocoa.com/blog/2013/02/16/failing-to-update-the-pt_deny_attach-kernel-module-for-mountain-lion/"/>
    <updated>2013-02-16T10:39:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2013/02/16/failing-to-update-the-pt_deny_attach-kernel-module-for-mountain-lion</id>
    <content type="html"><![CDATA[<p><strong>Update 13th April 2013: This now works on Mountain Lion (10.8.3).  Thanks to a tip, I have now worked around the problem of write-protected memory pages. See the <a href="https://github.com/mttrb/pt_deny_attach">GitHub repository</a> for the working code.</strong></p>

<p><strike>Note: From the title of this post you will see that I ultimately failed to get the <code>pt_deny_attach</code> kernel module to work in Mountain Lion.  This was due to write protected memory in the kernel.  However, I did manage to work around the issues presented by Kernel Address Space Layout Randomisation (KASLR).  The journey that I took to my ultimate failure may be useful and interesting to others.</strike></p>

<p>I recently answered a <a href="http://stackoverflow.com/questions/14515042/">question on Stack Overflow</a> that led me to investigate the <code>P_LNOATTACH</code> process flag in Mountain Lion (OS  X 10.8).</p>

<p>The <code>P_LNOATTACH</code> flag is a process flag which stops other processes (debuggers, DTrace etc) attaching to the flagged process.  The flag is set by calling <code>ptrace(PT_DENY_ATTACH)</code>.  This <em>feature</em> was almost certainly added to OS X to stop/hinder reverse engineering the DRM used by iTunes.  iTunes is certainly the oft-cited example of the use of <code>PT_DENY_ATTACH</code>.</p>

<p>In order to circumvent the protection provided by <code>P_LNOATTACH</code> a kernel module was created which intercepts the call to <code>trace</code> with the <code>PT_DENY_ATTACH</code> parameter.  The <a href="https://github.com/dwalters/pt_deny_attach.git">most recent version of this module is for Lion (OS X 10.7.1)</a> and is available on GitHub.  The project page on GitHub says Snow Leopard but the code has been updated to Lion (10.7.1) as can be seen from the following code snippet from <code>pt_deny_attach.c</code>.</p>

<figure class='code'><figcaption><span>pt_deny_attach.c</span><a href='https://github.com/dwalters/pt_deny_attach/blob/master/pt_deny_attach.c'>View on GitHub </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cm">/* This value is for OSX 10.7.1.  The exact _nsysent offset can be found</span>
</span><span class='line'><span class="cm"> * via:</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> *   nm -g /mach_kernel | grep _nsysent</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * Due to a bug in the kext loading code, it&#39;s not currently possible</span>
</span><span class='line'><span class="cm"> * to link against com.apple.kernel to let the linker locate this.</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * http://packetstorm.foofus.com/papers/attack/osx1061sysent.txt</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="cp">#define _NSYSENT_OSX_10_7_1_  0xffffff8000846eb8</span>
</span></code></pre></td></tr></table></div></figure>


<p>The comment suggests a &ldquo;bug in the kext loading code&rdquo; stops you linking against <code>com.apple.kernel</code>.  I believe this is intentional in order to make kernel hacks like this one more difficult.</p>

<p>The Lion module was based on an <a href="http://landonf.bikemonkey.org/code/macosx/Leopard_PT_DENY_ATTACH.20080122.html">earlier version for Leopard</a>.  The above link provides additional background information about the <code>ptrace</code> flag and the kernel module.</p>

<p>The obvious first step to updating this kernel module to Mountain Lion was to download the version for Lion and load it into the kernel.  This resulted in the first of many kernel panics.  This was unsurprising as the layout of the kernel would almost certainly have changed between 10.7.1 (the version the module was targeted at) and 10.8.2 (the version I am currently running).</p>

<h2>How does the Lion version work</h2>

<p>Before we can start to update the kernel module to Mountain Lion we should really understand what the module is trying to do.  Basically, the module is using pre-discovered offsets to find the <code>sysent</code> data structure which contains the function pointers to all of the syscall functions in the kernel.  Once it has found the <code>sysent</code> table it changes the pointer to the <code>ptrace</code> function to point to a function, <code>our_ptrace</code>, supplied by the kernel module which checks to see if the parameter is <code>PT_DENY_ATTACH</code>.</p>

<figure class='code'><figcaption><span>pt_deny_attach.c</span><a href='https://github.com/dwalters/pt_deny_attach/blob/master/pt_deny_attach.c'>View on GitHub </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">static</span> <span class="kt">int</span> <span class="nf">our_ptrace</span> <span class="p">(</span><span class="k">struct</span> <span class="n">proc</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="k">struct</span> <span class="n">ptrace_args</span> <span class="o">*</span><span class="n">uap</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">retval</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">uap</span><span class="o">-&gt;</span><span class="n">req</span> <span class="o">==</span> <span class="n">PT_DENY_ATTACH</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">printf</span><span class="p">(</span><span class="s">&quot;[ptrace] Blocking PT_DENY_ATTACH for pid %d.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">uap</span><span class="o">-&gt;</span><span class="n">pid</span><span class="p">);</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">real_ptrace</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">uap</span><span class="p">,</span> <span class="n">retval</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If the parameter is <code>PT_DENY_ATTACH</code> it does nothing and returns success, <code>return (0)</code>, otherwise it calls the original <code>ptrace</code> function passing the supplied parameters.  This causes <code>PT_DENY_ATTACH</code> to be ignored but other calls to <code>ptrace</code> continue to function as expected.</p>

<p>In order to make this more difficult in Lion, Apple don&rsquo;t export the location of the <code>sysent</code> table.  In order to find the <code>sysent</code> table the module has the location of the <code>nsysent</code> variable hard-coded.</p>

<figure class='code'><figcaption><span>pt_deny_attach.c</span><a href='https://github.com/dwalters/pt_deny_attach/blob/master/pt_deny_attach.c'>View on GitHub </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#define _NSYSENT_OSX_10_7_1_  0xffffff8000846eb8</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>nsysent</code> contains the number of entries in the <code>sysent</code> table and is stored close to the <code>sysent</code> table.  As the comment above suggests, it is possible to find the memory address of the <code>nsysent</code> variable using the command <code>nm -g /mach_kernel | grep _nsysent</code>. On 10.8.2 this gives:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>macbook-air:~ matt$ nm -g /mach_kernel | grep _nsysent
</span><span class='line'>ffffff8000839818 D _nsysent
</span><span class='line'>ffffff80008db150 S _nsysent_size_check</span></code></pre></td></tr></table></div></figure>


<p>If you try to find the <code>sysent</code> table directly you will get results but not the address of <code>sysent</code> itself:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>macbook-air:~ matt$ nm -g /mach_kernel | grep _sysent
</span><span class='line'>ffffff80002ce010 T _hi64_sysenter
</span><span class='line'>ffffff80002ce8f0 T _hndl_sysenter
</span><span class='line'>ffffff80002ce010 T _idt64_sysenter
</span><span class='line'>ffffff80008e0688 S _systrace_sysent
</span><span class='line'>ffffff80002b5c30 T _x86_sysenter_arg_store_isvalid
</span><span class='line'>ffffff80002b5c20 T _x86_toggle_sysenter_arg_store</span></code></pre></td></tr></table></div></figure>


<p>So, having found the 10.8.2 location of <code>nsysent</code> the next obvious step is to update the module with the new location and reload it… kernel panic!</p>

<p>The kernel module makes an assumption about the location of the <code>sysent</code> table. It assumes that the <code>sysent</code> table is immediately before the <code>nsysent</code> variable.  It uses the value of <code>nsysent</code> and the <code>sizeof(struct sysent)</code> to calculate the size of the <code>sysent</code> table, <code>table_size</code>, and then subtracts this from the memory address of <code>nsysent</code> to give a pointer to <code>sysent</code> in <code>table</code>.</p>

<figure class='code'><figcaption><span>pt_deny_attach.c</span><a href='https://github.com/dwalters/pt_deny_attach/blob/master/pt_deny_attach.c'>View on GitHub </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm"> * nsysent is placed directly before the hidden sysent, so skip ahead</span>
</span><span class='line'><span class="cm"> * and sanity check that we&#39;ve found the sysent array.</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * Clearly, this is extremely fragile and not for general consumption.</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="k">static</span> <span class="k">struct</span> <span class="n">sysent</span> <span class="o">*</span><span class="nf">find_sysent</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">table_size</span><span class="p">;</span>
</span><span class='line'>  <span class="k">struct</span> <span class="n">sysent</span> <span class="o">*</span><span class="n">table</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">table_size</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">sysent</span><span class="p">)</span> <span class="o">*</span> <span class="o">*</span><span class="p">(</span><span class="n">_nsysent</span><span class="p">);</span>
</span><span class='line'>  <span class="n">table</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">sysent</span> <span class="o">*</span><span class="p">)</span> <span class="p">(</span> <span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span> <span class="n">_nsysent</span><span class="p">)</span> <span class="o">-</span> <span class="n">table_size</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;[ptrace] Found nsysent at %p (count %d), calculated sysent location %p.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">_nsysent</span><span class="p">,</span> <span class="o">*</span><span class="n">_nsysent</span><span class="p">,</span> <span class="n">table</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Obviously some things have changed within the kernel.  Simply updating the location of <code>nsysent</code> doesn&rsquo;t fix the problem.</p>

<h2>Getting it to <em>work</em> on Mountain Lion</h2>

<p>After some experimentation (and many kernel panics) it became obvious that I hadn&rsquo;t actually found the correct location of <code>nsysent</code> in the kernel address space.  Simply trying to read the value of <code>nsysent</code> (which should contain a count of sys calls) was causing a kernel panic.</p>

<p>After some Internet research it became clear that the major difference between the Lion and Mountain Lion kernel was the introduction of Kernel Address Space Layout Randomisation (KASLR).  When the kernel is loaded into memory KASLR causes the addresses of all the symbols (variables) to be randomised.  The <code>nm</code> command shows the location of the <code>nsysent</code> variable before the randomisation has taken place.  Simply changing the value of  <code>_NSYSENT_OSX_10_7_1_</code> is not going to work.</p>

<p>KASLR works by generating a random number and then <strong>sliding</strong> the symbol addresses in memory by this random value.  Basically the kernel slide value is added to all the addresses in the kernel when it is loaded into memory.  The value of the kernel slide can be accessed by a privileged process using a new <code>syscall</code> on OS X (this syscall was briefly available in iOS 6 betas but was removed before release).  Check out <a href="https://github.com/gdbinit/kextstat_aslr">kextstat_kaslr</a> for more details.</p>

<p>The value of the slide is stored in the kernel in a variable called <code>vm_kernel_slide</code>, we can see this in the kernel source code.  The kernel source is open source and available at <a href="http://opensource.apple.com/source/xnu/xnu-2050.18.24/">http://opensource.apple.com/source/xnu/xnu-2050.18.24/</a>.</p>

<p>Unfortunately, Apple have not exported this variable for use by kernel modules.  We are also in a chicken and egg situation because <code>vm_kernel_slide</code> has also been moved by the kernel slide.  Everything I tried failed to give me the value of the kernel slide.  It is ironic that a user process running as <code>root</code> can access this value using the <code>kas_info</code> syscall but a kernel module running in the kernel doesn&rsquo;t seem to be able to.  (It is entirely possible that I missed something obvious at this point.)</p>

<p>After pondering the problem it occurred to me that the value of <code>vm_kernel_slide</code> can be inferred by a kernel module.  We can use <code>nm</code> to get the address of an exported function in the kernel.  Our kernel module can get the function pointer of a function in the running kernel.  If we subtract one from the other we get the value of the kernel slide.</p>

<p>I updated the kernel module with code to do this. The module contains the hard-coded location of <code>printf</code> which was found using <code>nm</code>.  The module then gets a pointer to the <code>printf</code> function and uses this to calculate the slide.</p>

<figure class='code'><figcaption><span>pt_deny_attach.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#define _PRINTF_OSX_10_8_2_   0xffffff8000229090  </span><span class="c1">// Used to calculate the KASLR slide</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>pt_deny_attach.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm"> * vm_kernel_slide doesn&#39;t appear to be available to kexts</span>
</span><span class='line'><span class="cm"> * but we can calculate it by getting the address of a known</span>
</span><span class='line'><span class="cm"> * function, e.g. printf, and then comparing that to the</span>
</span><span class='line'><span class="cm"> * address returned by nm -g /mach_kernel</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="k">static</span> <span class="n">vm_offset_t</span> <span class="nf">calculate_vm_kernel_slide</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">(</span><span class="n">vm_offset_t</span><span class="p">)</span><span class="o">&amp;</span><span class="n">printf</span> <span class="o">-</span> <span class="n">_PRINTF_OSX_10_8_2_</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Using the calculated slide value it is now possible to calculate the correct location of <code>nsysent</code> using the following code:</p>

<figure class='code'><figcaption><span>pt_deny_attach.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">kern_return_t</span> <span class="nf">pt_deny_attach_start</span> <span class="p">(</span><span class="n">kmod_info_t</span> <span class="o">*</span><span class="n">ki</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">d</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">slide</span> <span class="o">=</span> <span class="n">calculate_vm_kernel_slide</span><span class="p">();</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;[ptrace] KASLR kernel slide is 0x%lx</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">slide</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">_nsysent</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)(</span><span class="n">_NSYSENT_OSX_10_8_2_</span> <span class="o">+</span> <span class="n">slide</span><span class="p">);</span>
</span><span class='line'>
</span></code></pre></td></tr></table></div></figure>


<p>Reading the value of <code>_nsysent</code> at this point gave the correct value for the number of syscalls that Mountain Lion provides.  Finally we are getting somewhere.</p>

<p>The next step is to find the <code>sysent</code> table based on the location of <code>nsysent</code>.  This took a little bit of hunting as it has moved quite a way in Mountain Lion.  I simply searched the memory around <code>nsysent</code> checking it using the sanity checks from the Lion version of the module.  I eventually found it after a few more kernel panics with an offset of <code>0x1c028</code> from <code>nsysent</code>.</p>

<p>Having found the location of <code>sysent</code> it was easy to confirm that the location of the <code>ptrace</code> function in the syscall table matched the location returned by <code>nm</code> (plus the kernel slide).</p>

<p>Updating the kernel module and loading it into the kernel finally… caused a kernel panic.</p>

<p>This is were I am now stuck and I can&rsquo;t see an easy way around the problem.  As far as I can tell the <code>sysent</code> table is now located in a read-only memory page. Attempting to replace the value of the function pointer to <code>ptrace</code> with a pointer to <code>our_ptrace</code> causes a kernel panic.</p>

<p>The kernel source code declares the <code>sysent</code> table as follows:</p>

<figure class='code'><figcaption><span>init_sysent.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">__private_extern__</span> <span class="k">const</span> <span class="k">struct</span> <span class="n">sysent</span> <span class="n">sysent</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">sy_call_t</span> <span class="o">*</span><span class="p">)</span><span class="n">nosys</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_SYSCALL_RET_INT_T</span><span class="p">,</span> <span class="mi">0</span><span class="p">},</span>                           <span class="cm">/* 0 = nosys indirect syscall */</span>
</span><span class='line'>        <span class="p">{</span><span class="n">AC</span><span class="p">(</span><span class="n">exit_args</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">sy_call_t</span> <span class="o">*</span><span class="p">)</span><span class="n">exit</span><span class="p">,</span> <span class="n">munge_w</span><span class="p">,</span> <span class="n">munge_d</span><span class="p">,</span> <span class="n">_SYSCALL_RET_NONE</span><span class="p">,</span> <span class="mi">4</span><span class="p">},</span>           <span class="cm">/* 1 = exit */</span>
</span><span class='line'>        <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">sy_call_t</span> <span class="o">*</span><span class="p">)</span><span class="n">fork</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_SYSCALL_RET_INT_T</span><span class="p">,</span> <span class="mi">0</span><span class="p">},</span>                            <span class="cm">/* 2 = fork */</span>
</span></code></pre></td></tr></table></div></figure>


<p>I assume the fact it is declared <code>const</code> means that the table has been placed into a protected memory page.  Feel free to correct me if I am wrong.</p>

<h2>One last try</h2>

<p>Given that it doesn&rsquo;t seem to be possible to modify the <code>sysent</code>   table I wondered if it would be possible to hot-patch the <code>ptrace</code> function itself.  Unfortunately attempting to write to the memory associated with the function causes…</p>

<p>…yes, you guessed it, a kernel panic!</p>

<p>The source code for a kernel module that works up to the point of actually modifying the <code>sysent</code> table is available on GitHub at <a href="https://github.com/mttrb/pt_deny_attach">https://github.com/mttrb/pt_deny_attach</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bash Prompt with Git Branch]]></title>
    <link href="http://www.blendedcocoa.com/blog/2012/11/21/bash-prompt_with_git_branch/"/>
    <updated>2012-11-21T10:44:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2012/11/21/bash-prompt_with_git_branch</id>
    <content type="html"><![CDATA[<p>For a while I have been using a Bash Terminal Prompt which is normally green but turns red if the last process failed.  I have just discovered a prompt which includes the current git branch and I have updated my prompt to include both of these functions.</p>

<p>My terminal prompt now looks like the following screen capture (I&rsquo;m currently using the <a href="http://ethanschoonover.com/solarized">Solarized Light</a> theme):</p>

<p><img src="http://www.blendedcocoa.com/images/BashPrompt.gif" title="Bash Prompt" ></p>

<p>You can add the following snippet to your <code>.bash_profile</code>, <code>.profile</code> or <code>.bashrc</code> file to get the same prompt:</p>

<figure class='code'><figcaption><span>.bash_profile</span><a href='https://gist.github.com/4122721'>View Gist </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="k">function </span>parse_git_branch <span class="o">{</span>
</span><span class='line'>        git branch --no-color 2&gt; /dev/null | sed -e <span class="s1">&#39;/^[^*]/d&#39;</span> -e <span class="s1">&#39;s/* \(.*\)/ \[\1\]/&#39;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function </span>prompt <span class="o">{</span>
</span><span class='line'>        <span class="nb">local </span><span class="nv">DEFAULT</span><span class="o">=</span><span class="s2">&quot;\[\033[0m\]&quot;</span>
</span><span class='line'>        <span class="nb">local </span><span class="nv">RED</span><span class="o">=</span><span class="s2">&quot;\[\033[0;31m\]&quot;</span>
</span><span class='line'>        <span class="nb">local </span><span class="nv">GREEN</span><span class="o">=</span><span class="s2">&quot;\[\033[0;32m\]&quot;</span>
</span><span class='line'>        <span class="nb">local </span><span class="nv">BLUE</span><span class="o">=</span><span class="s2">&quot;\[\033[0;34m\]&quot;</span>
</span><span class='line'>
</span><span class='line'>        <span class="nv">PS1</span><span class="o">=</span><span class="s2">&quot;\`if [ \$? == &#39;0&#39; ]; then echo &#39;$GREEN&#39;; else echo &#39;$RED&#39;; fi\`\h:\W \u$BLUE\$(parse_git_branch)$DEFAULT\$ &quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>prompt
</span></code></pre></td></tr></table></div></figure>


<p>The most up-to-date version of this prompt is available as a Gist at <a href="https://gist.github.com/4122721">https://gist.github.com/4122721</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Objective-C Literals: Negative Array Subscripts]]></title>
    <link href="http://www.blendedcocoa.com/blog/2012/10/25/objective-c-literals-negative-array-subscripts/"/>
    <updated>2012-10-25T14:04:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2012/10/25/objective-c-literals-negative-array-subscripts</id>
    <content type="html"><![CDATA[<p>Several <a href="http://clang.llvm.org/docs/ObjectiveCLiterals.html">new features</a> were added to the Apple LLVM Compiler 4.0 to allow the use of Objective-C Literals and object subscripts.</p>

<p>This means that it is now possible to use the following shorthands to create and access elements of an <code>NSArray</code>.</p>

<figure class='code'><figcaption><span>Objective-C Literal and Subscripting Syntax </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">NSArray</span> <span class="o">*</span><span class="n">array</span> <span class="o">=</span> <span class="err">@</span><span class="p">[</span> <span class="s">@&quot;World&quot;</span><span class="p">,</span> <span class="s">@&quot;Hello&quot;</span> <span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;%@ %@&quot;</span><span class="p">,</span> <span class="n">array</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">array</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>During compilation the subscripted array access is converted to a call to the <code>objectAtIndexedSubscript:</code> method. So the above <code>NSLog</code> statement would be converted to the following before compilation.</p>

<figure class='code'><figcaption><span>Objective-C Subscripting Syntax </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;%@ %@&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="p">[</span><span class="n">array</span> <span class="nl">objectAtIndexedSubscript:</span><span class="mi">1</span><span class="p">],</span>
</span><span class='line'>      <span class="p">[</span><span class="n">array</span> <span class="nl">objectAtIndexedSubscript:</span><span class="mi">0</span><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This addition to the Objective-C language is useful and certainly will make some code less verbose and easier to read.</p>

<p>However, many languages (particularly scripting languages) allow the use of negative indexes.  Negative indexes are counted from the end of the array rather than the beginning. This led me to wonder if you can use negative indexes with the new Objective-C syntax.</p>

<p>Unfortunately, a quick look at the method definition for <code>objectAtIndexedSubscript:</code> shows that the index parameter is an <code>NSUInteger</code>, an unsigned integer. Therefore, as implemented, the new subscript indexes must be positive.</p>

<figure class='code'><figcaption><span>objectAtIndexedSubscript: method definition </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">objectAtIndexedSubscript:</span><span class="p">(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nv">idx</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, is it possible to add functionality to <code>NSArray</code> to allow the use of negative indexes?  The answer is Yes. The Objective-C runtime allows us to add the functionality to make it possible.</p>

<p>In order to do this we need to create our own version of the <code>objectAtIndexedSubscript:</code> method.  The new method, <code>BLC_objectAtIndexedSubscript:</code> will look like:</p>

<figure class='code'><figcaption><span>The new objectAtIndexedSubscript: method </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">BLC_objectAtIndexedSubscript:</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">)</span><span class="nv">idx</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">idx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">idx</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">count</span><span class="p">]</span> <span class="o">+</span> <span class="n">idx</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span><span class="n">self</span> <span class="nl">BLC_objectAtIndexedSubscript:</span><span class="n">idx</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You will notice that the parameter is now an <code>NSInteger</code> rather than the unsigned <code>NSUInteger</code> used by the original method.</p>

<p>You may also have noticed what appears to be a recursive call in line 6. As things stand at the moment this is a recursive call but the next step is to perform a method swizzle.</p>

<p>Method swizzling involves swapping two implementations of a method, in our case <code>objectAtIndexedSubscript:</code> and <code>BLC_objectAtIndexedSubscript:</code>.  We perform the method swizzle using the <code>method_exchangeImplementations</code> function of the Objective-C runtime, declared in the <code>objc/runtime.h</code> header file.</p>

<p>The method swizzle is performed as follows:</p>

<figure class='code'><figcaption><span>Method Swizzling objectAtIndexedSubscript: </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">method_exchangeImplementations</span><span class="p">(</span>
</span><span class='line'>    <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">objectAtIndexedSubscript:</span><span class="p">)),</span>
</span><span class='line'>    <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">BLC_objectAtIndexedSubscript:</span><span class="p">))</span>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that the method implementations have been swizzled that recursive call in <code>BLC_objectAtIndexedSubscript:</code> has become a call to the original method.  The original method implementation is now called using the <code>BLC_objectAtIndexedSubscript:</code> selector.</p>

<p>Once we have swapped the methods we are able to use negative indexes as follows:</p>

<figure class='code'><figcaption><span>Using negative indexes </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">NSArray</span> <span class="o">*</span><span class="n">array</span> <span class="o">=</span> <span class="err">@</span><span class="p">[</span> <span class="s">@&quot;World&quot;</span><span class="p">,</span> <span class="s">@&quot;Hello&quot;</span> <span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;%@ %@&quot;</span><span class="p">,</span> <span class="n">array</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">array</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The full implementation of the new method and the method swizzling is contained in a category on <code>NSArray</code>.  The full listing is shown below:</p>

<figure class='code'><figcaption><span>NSArray+NegativeIndexes.m</span><a href='https://gist.github.com/4076357'>View Gist </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">//  NSArray+NegativeIndexes.m</span>
</span><span class='line'><span class="cp">//  Allow Negative Array Literals</span>
</span><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">//  Created by Matthew Robinson on 25th October 2012.</span>
</span><span class='line'><span class="cp">//  Copyright (c) 2012 Matthew Robinson. All rights reserved.</span>
</span><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">//  WARNING: This is a proof of concept and should not be used</span>
</span><span class='line'><span class="cp">//           in production code.  This could break at anytime.</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;Foundation/Foundation.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#if __has_feature(objc_subscripting)</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;objc/runtime.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">NSArray</span> <span class="nl">(NegativeIndexes)</span>
</span><span class='line'>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">load</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">method_exchangeImplementations</span><span class="p">(</span>
</span><span class='line'>        <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">objectAtIndexedSubscript:</span><span class="p">)),</span>
</span><span class='line'>        <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">BLC_objectAtIndexedSubscript:</span><span class="p">))</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">BLC_objectAtIndexedSubscript:</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">)</span><span class="nv">idx</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">idx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">idx</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">count</span><span class="p">]</span> <span class="o">+</span> <span class="n">idx</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span><span class="n">self</span> <span class="nl">BLC_objectAtIndexedSubscript:</span><span class="n">idx</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">NSMutableArray</span> <span class="nl">(NegativeIndexes)</span>
</span><span class='line'>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">load</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">method_exchangeImplementations</span><span class="p">(</span>
</span><span class='line'>        <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">setObject:atIndexedSubscript:</span><span class="p">)),</span>
</span><span class='line'>        <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">BLC_setObject:atIndexedSubscript:</span><span class="p">))</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">BLC_setObject:</span><span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nv">anObject</span> <span class="nf">atIndexedSubscript:</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">)</span><span class="nv">idx</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">idx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">idx</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">count</span><span class="p">]</span> <span class="o">+</span> <span class="n">idx</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span> <span class="nl">BLC_setObject:</span><span class="n">anObject</span> <span class="nl">atIndexedSubscript:</span><span class="n">idx</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#endif</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see the above implementation also contains a category on <code>NSMutableArray</code> which swizzles a replacement method for <code>setObject:atIndexedSubscript:</code> to allow negative indexes in array assignment.</p>

<p>There is no associated header file for this category as the category does not add any new public methods to the <code>NSArray</code> (or <code>NSMutableArray</code> class).  Simply compiling the above <code>.m</code> file into a binary will add the functionality to the array classes.</p>

<p>This category is available as a Gist at: <a href="https://gist.github.com/4076357">https://gist.github.com/4076357</a></p>

<p><strong>WARNING:</strong> This functionality is a hack and relies on the <code>clang</code> compiler converting array subscripts into the associated call to <code>objectAtIndexedSubscript:</code> without checking the positiveness of the index.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dress classy, dance cheesy!]]></title>
    <link href="http://www.blendedcocoa.com/blog/2012/10/20/dress-classy/"/>
    <updated>2012-10-20T22:49:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2012/10/20/dress-classy</id>
    <content type="html"><![CDATA[<p>I&rsquo;m sure you&rsquo;ve always wanted to be able to create a <code>UITableView</code> with the following code:</p>

<figure class='code'><figcaption><span>UITableView initWithFrame:&#8230; style:&#8230; </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">UITableView</span> <span class="o">*</span><span class="n">tableView</span> <span class="o">=</span> <span class="p">[[</span><span class="n">UITableView</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithFrame:</span><span class="n">frame</span>
</span><span class='line'>                                                      <span class="nl">style:</span><span class="n">UITableViewStyleGangnam</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<h2>UITableViewStyleGangnam</h2>

<p>I was inspired to write the following after my trip to <a href="http://auc.edu.au/devworld/about/">/dev/world</a> last month.  Gangnam Style was one of the memes during the conference.  Feel free to do something even more cheesy with it.</p>

<p>The following source code and an example iPhone project are available on GitHub at: <a href="https://github.com/mttrb/UITableView-GangnamStyle">https://github.com/mttrb/UITableView-GangnamStyle</a></p>

<figure class='code'><figcaption><span>UITableView+GangnamStyle.h</span><a href='https://github.com/mttrb/UITableView-GangnamStyle/blob/master/UITableView%2BGangnamStyle.h'>View GitHub</a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">//  UITableView+GangnamStyle.h</span>
</span><span class='line'><span class="cp">//  Gangnam Style</span>
</span><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">//  Created by Matthew Robinson on 20th October 2012.</span>
</span><span class='line'><span class="cp">//  Copyright (c) 2012 Matthew Robinson. All rights reserved.</span>
</span><span class='line'><span class="cp">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;UIKit/UIKit.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define UITableViewStyleGangnam ((UITableViewStyle)1000)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>UITableView+GangnamStyle.m</span><a href='https://github.com/mttrb/UITableView-GangnamStyle/blob/master/UITableView%2BGangnamStyle.m'>View GitHub </a></figcaption> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">//  UITableView+GangnamStyle.m</span>
</span><span class='line'><span class="cp">//  Gangnam Style</span>
</span><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">//  Created by Matthew Robinson on 20/10/12.</span>
</span><span class='line'><span class="cp">//  Copyright (c) 2012 Matthew Robinson. All rights reserved.</span>
</span><span class='line'><span class="cp">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &quot;UITableView+GangnamStyle.h&quot;</span>
</span><span class='line'><span class="cp">#import &lt;objc/runtime.h&gt;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">PSYGangnam</span> : <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">UITableViewDataSource</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="o">+</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="n">sharedGangnam</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">UITableView</span> <span class="nl">(GangnamStyle)</span>
</span><span class='line'>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">load</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">method_exchangeImplementations</span><span class="p">(</span>
</span><span class='line'>        <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">initWithFrame:style:</span><span class="p">)),</span>
</span><span class='line'>        <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="k">@selector</span><span class="p">(</span><span class="nl">PSY_initWithFrame:style:</span><span class="p">))</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">PSY_initWithFrame:</span><span class="p">(</span><span class="n">CGRect</span><span class="p">)</span><span class="nv">frame</span> <span class="nf">style:</span><span class="p">(</span><span class="n">UITableViewStyle</span><span class="p">)</span><span class="nv">style</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Call the original initWithFrame:style: which is now</span>
</span><span class='line'>    <span class="c1">// called PSY_initWithFrame:style: This is NOT recursive!</span>
</span><span class='line'>    <span class="c1">// If the style is Gangnam actually use plain</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="nl">PSY_initWithFrame:</span><span class="n">frame</span>
</span><span class='line'>                             <span class="nl">style:</span><span class="n">style</span> <span class="o">==</span> <span class="n">UITableViewStyleGangnam</span> <span class="o">?</span> <span class="n">UITableViewStylePlain</span> <span class="o">:</span> <span class="n">style</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Set the data source if Gangnam style</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span> <span class="o">&amp;&amp;</span> <span class="n">style</span> <span class="o">==</span> <span class="n">UITableViewStyleGangnam</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">self</span> <span class="nl">setDataSource:</span><span class="p">[</span><span class="n">PSYGangnam</span> <span class="n">sharedGangnam</span><span class="p">]];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">PSYGangnam</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSArray</span> <span class="o">*</span><span class="n">_lyrics</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="err">@</span><span class="n">implementation</span> <span class="n">PSYGangnam</span>
</span><span class='line'>
</span><span class='line'><span class="o">+</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="n">sharedGangnam</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">static</span> <span class="n">PSYGangnam</span> <span class="o">*</span><span class="n">sharedInstance</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'>    <span class="k">static</span> <span class="n">dispatch_once_t</span> <span class="n">onceToken</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">dispatch_once</span><span class="p">(</span><span class="o">&amp;</span><span class="n">onceToken</span><span class="p">,</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>        <span class="n">sharedInstance</span> <span class="o">=</span> <span class="p">[[</span><span class="n">PSYGangnam</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">sharedInstance</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="n">init</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">_lyrics</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSArray</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithObjects:</span>
</span><span class='line'>                   <span class="s">@&quot;Oppan Gangnam Style&quot;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s">@&quot;Gangnam Style&quot;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s">@&quot;&quot;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s">@&quot;Na je nun ta sa ro un in gan jo gin yo ja&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>                   <span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'>                   <span class="s">@&quot;Oppan Gangnam Style&quot;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s">@&quot;&quot;</span><span class="p">,</span>
</span><span class='line'>                   <span class="s">@&quot;© Sony/ATV Music Publishing LLC&quot;</span><span class="p">,</span>
</span><span class='line'>                   <span class="nb">nil</span>
</span><span class='line'>                   <span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="n">NSInteger</span><span class="p">)</span><span class="nl">tableView:</span><span class="p">(</span><span class="n">UITableView</span> <span class="o">*</span><span class="p">)</span><span class="n">tableView</span> <span class="nl">numberOfRowsInSection:</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">)</span><span class="n">section</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span><span class="n">_lyrics</span> <span class="n">count</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="n">UITableViewCell</span> <span class="o">*</span><span class="p">)</span><span class="nl">tableView:</span><span class="p">(</span><span class="n">UITableView</span> <span class="o">*</span><span class="p">)</span><span class="n">tableView</span> <span class="nl">cellForRowAtIndexPath:</span><span class="p">(</span><span class="n">NSIndexPath</span> <span class="o">*</span><span class="p">)</span><span class="n">indexPath</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">static</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">PSYGangnamCellIdentifier</span> <span class="o">=</span> <span class="s">@&quot;PSYGangnamCellIdentifier&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">UITableViewCell</span> <span class="o">*</span><span class="n">cell</span> <span class="o">=</span> <span class="p">[</span><span class="n">tableView</span> <span class="nl">dequeueReusableCellWithIdentifier:</span><span class="n">PSYGangnamCellIdentifier</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nb">nil</span> <span class="o">==</span> <span class="n">cell</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">cell</span> <span class="o">=</span> <span class="p">[[[</span><span class="n">UITableViewCell</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithStyle:</span><span class="n">UITableViewCellStyleDefault</span>
</span><span class='line'>                                       <span class="nl">reuseIdentifier:</span><span class="n">PSYGangnamCellIdentifier</span><span class="p">]</span> <span class="n">autorelease</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">[[</span><span class="n">cell</span> <span class="n">textLabel</span><span class="p">]</span> <span class="nl">setFont:</span><span class="p">[</span><span class="n">UIFont</span> <span class="nl">fontWithName:</span><span class="s">@&quot;Helvetica-Bold&quot;</span> <span class="nl">size:</span><span class="mf">11.0</span><span class="p">]];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[[</span><span class="n">cell</span> <span class="n">textLabel</span><span class="p">]</span> <span class="nl">setText:</span><span class="p">[</span><span class="n">_lyrics</span> <span class="nl">objectAtIndex:</span><span class="p">[</span><span class="n">indexPath</span> <span class="n">row</span><span class="p">]]];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">cell</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[/dev/world 2012 Presentation]]></title>
    <link href="http://www.blendedcocoa.com/blog/2012/10/02/slash-dev-slash-world-2012-presentation/"/>
    <updated>2012-10-02T21:41:00+08:00</updated>
    <id>http://www.blendedcocoa.com/blog/2012/10/02/slash-dev-slash-world-2012-presentation</id>
    <content type="html"><![CDATA[<p>I recently gave a presentation at the <a href="http://auc.edu.au">AUC&rsquo;s</a> <a href="http://auc.edu.au/devworld/about/">/dev/world</a> conference. The video recording of my presentation, <em>Adventures in the Objective-C Runtime</em>, is now available on the AUC website at <a href="http://auc.edu.au/2012/08/objective-c-runtime/">http://auc.edu.au/2012/08/objective-c-runtime/</a>.</p>

<p>I have included the presentation abstract below:</p>

<h2>Adventures in the Objective-C Runtime</h2>

<p>The Objective-C language is dynamic, many decisions are deferred from compile and link time to runtime. The dynamic nature of the language is implemented by the Objective-C runtime, which acts as a kind of operating system. Typically, you don’t need to interact with the runtime directly…</p>

<p>…but what can the runtime do for us if we choose to be atypical.</p>

<p>Categories are generally the first dynamic feature of the language that programmers new to Objective-C discover and this is where we will start. To understand how categories work we will look at message sending and method swizzling. From here we’ll be able to look at other features of the runtime.</p>

<p>In order to understand what the runtime is doing we will need the ability to inspect what it is doing internally, for this we will take a quick detour into DTrace profiling. We will also take a quick look at benchmarking to see if (and by how much) the dynamic nature of the language slows it down.</p>

<p>Messing around in the runtime has the potential to cause havoc, however, the runtime can be used to solve problems in novel and powerful ways. We will close by looking at some examples of using the runtime. Key Value Observing and Core Data are obvious examples from the Cocoa frameworks.</p>
]]></content>
  </entry>
  
</feed>
