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

  <title><![CDATA[Brian M. Coyner]]></title>
  <link href="http://briancoyner.github.com/atom.xml" rel="self"/>
  <link href="http://briancoyner.github.com/"/>
  <updated>2013-06-09T23:27:49-05:00</updated>
  <id>http://briancoyner.github.com/</id>
  <author>
    <name><![CDATA[Brian Coyner]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Counting Characters]]></title>
    <link href="http://briancoyner.github.com/blog/2013/06/09/character-count/"/>
    <updated>2013-06-09T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2013/06/09/character-count</id>
    <content type="html"><![CDATA[<p>A few days ago I read a <a href="http://lambdalounge.org">STL Lambda Lounge</a> post about <a href="http://rosalind.info/problems/dna/">Counting DNA Nucleotides</a>. After solving the Nucleotides problem in Objective-C, I decided to solve a slightly different problem. I decided to count and print the number of times each character (assume ASCII text) appears in <a href="http://www.gutenberg.org/files/2701/2701.txt">Moby Dick</a>. I used the same data structure to solve both problems: an array of <code>unsigned int</code> values, where the array index represents the ASCII character and the value is the count.</p>

<h2>Reading Moby Dick using Grand Central Dispatch</h2>

<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>
<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>
</pre></td><td class='code'><pre><code class='objectivec'><span class='line'><span class="c1">// This function blocks until all characters are counted.</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">CBRCountCharactersInFileAtPath</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="n">path</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="o">*</span><span class="n">characters</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// The dispatch_io_read is an asynchronous call. We use a semaphore to provide synthetic synchronization.</span>
</span><span class='line'>    <span class="n">dispatch_semaphore_t</span> <span class="n">semaphore</span> <span class="o">=</span> <span class="n">dispatch_semaphore_create</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">dispatch_queue_t</span> <span class="n">readQueue</span> <span class="o">=</span> <span class="n">dispatch_get_global_queue</span><span class="p">(</span><span class="n">DISPATCH_QUEUE_PRIORITY_DEFAULT</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="n">dispatch_io_t</span> <span class="n">channel</span> <span class="o">=</span> <span class="n">dispatch_io_create_with_path</span><span class="p">(</span><span class="n">DISPATCH_IO_STREAM</span><span class="p">,</span> <span class="p">[</span><span class="n">path</span> <span class="n">UTF8String</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">,</span> <span class="n">readQueue</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// SIZE_MAX means keep going until we reach EOF. </span>
</span><span class='line'>    <span class="n">dispatch_io_read</span><span class="p">(</span><span class="n">channel</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">SIZE_MAX</span><span class="p">,</span> <span class="n">readQueue</span><span class="p">,</span> <span class="o">^</span><span class="p">(</span><span class="n">bool</span> <span class="n">done</span><span class="p">,</span> <span class="n">dispatch_data_t</span> <span class="n">data</span><span class="p">,</span> <span class="kt">int</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// All bytes have been read. Let&#39;s notify that we are done.</span>
</span><span class='line'>            <span class="n">dispatch_semaphore_signal</span><span class="p">(</span><span class="n">semaphore</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">data</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// As we read, we count.</span>
</span><span class='line'>            <span class="n">NSString</span> <span class="o">*</span><span class="n">string</span> <span class="o">=</span> <span class="n">CBRStringFromDispatchData</span><span class="p">(</span><span class="n">data</span><span class="p">);</span>
</span><span class='line'>            <span class="n">CBRCountCharactersInString</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">characters</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="c1">// Block the calling queue/ thread until the IO read completes (i.e. the channel is &quot;done&quot;)</span>
</span><span class='line'>    <span class="n">dispatch_semaphore_wait</span><span class="p">(</span><span class="n">semaphore</span><span class="p">,</span> <span class="n">DISPATCH_TIME_FOREVER</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// What we open, we must close. </span>
</span><span class='line'>    <span class="n">dispatch_io_close</span><span class="p">(</span><span class="n">channel</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above code sets up and executes streaming file IO using Grand Central Dispatch. Now let&#8217;s look at the two functions named <code>CBRStringFromDispatchData</code> and <code>CBRCountCharactersInString</code>.</p>

<p>Here is the code used to create a <code>NSString</code> from a <code>dispatch_data_t</code>.</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>
<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='objectivec'><span class='line'><span class="n">NSString</span> <span class="o">*</span><span class="nf">CBRStringFromDispatchData</span><span class="p">(</span><span class="n">dispatch_data_t</span> <span class="n">data</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">size_t</span> <span class="n">dataSize</span> <span class="o">=</span> <span class="n">dispatch_data_get_size</span><span class="p">(</span><span class="n">data</span><span class="p">);</span>
</span><span class='line'>    <span class="n">NSMutableString</span> <span class="o">*</span><span class="n">string</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSMutableString</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithCapacity:</span><span class="n">dataSize</span><span class="p">];</span>
</span><span class='line'>    <span class="n">dispatch_data_apply</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">^</span><span class="n">bool</span><span class="p">(</span><span class="n">dispatch_data_t</span> <span class="n">region</span><span class="p">,</span> <span class="n">size_t</span> <span class="n">offset</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size_t</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">string</span> <span class="nl">appendFormat:</span><span class="s">@&quot;%.*s&quot;</span><span class="p">,</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">size</span><span class="p">,</span> <span class="n">buffer</span><span class="p">];</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">string</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is the code that tracks the character counts.</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>
</pre></td><td class='code'><pre><code class='objectivec'><span class='line'><span class="kt">void</span> <span class="nf">CBRCountCharactersInString</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="n">string</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="o">*</span><span class="n">characters</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="p">[</span><span class="n">string</span> <span class="n">length</span><span class="p">];</span> <span class="n">index</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">characters</span><span class="p">[[</span><span class="n">string</span> <span class="nl">characterAtIndex:</span><span class="n">index</span><span class="p">]]</span><span class="o">++</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>


<h2>Sample Program</h2>

<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>
<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='objectivec'><span class='line'><span class="cp">#import &quot;CBRCounter.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span> <span class="n">argv</span><span class="p">[])</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="err">@</span><span class="n">autoreleasepool</span> <span class="p">{</span>
</span><span class='line'>        <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">characters</span><span class="p">[</span><span class="mi">256</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 class="n">CBRCountCharactersInFileAtPath</span><span class="p">(</span><span class="s">@&quot;/path/to/mobydick.txt&quot;</span><span class="p">,</span> <span class="n">characters</span><span class="p">);</span>
</span><span class='line'>        <span class="n">CBRPrintCharacterCount</span><span class="p">(</span><span class="n">characters</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Printing the Character Counts</h2>

<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='objectivec'><span class='line'><span class="kt">void</span> <span class="nf">CBRPrintCharacterCount</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="o">*</span><span class="n">characters</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// This example only prints the &quot;printable&quot; characters. </span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">character</span> <span class="o">=</span> <span class="sc">&#39; &#39;</span><span class="p">;</span> <span class="n">character</span> <span class="o">&lt;=</span> <span class="sc">&#39;~&#39;</span><span class="p">;</span> <span class="n">character</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;%c: %d&quot;</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span><span class="p">)</span><span class="n">character</span><span class="p">,</span> <span class="n">characters</span><span class="p">[</span><span class="n">character</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>


<h2>Example Output</h2>

<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>
<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=''><span class='line'>A: 2725
</span><span class='line'>B: 1466
</span><span class='line'>C: 1184
</span><span class='line'>D: 802
</span><span class='line'>E: 1361
</span><span class='line'>F: 864
</span><span class='line'>G: 751
</span><span class='line'>H: 1497
</span><span class='line'>I: 3641
</span><span class='line'>J: 261
</span><span class='line'>K: 185
</span><span class='line'>L: 959
</span><span class='line'>M: 782
</span><span class='line'>N: 1241
</span><span class='line'>O: 1050
</span><span class='line'>P: 1158
</span><span class='line'>Q: 323
</span><span class='line'>R: 895
</span><span class='line'>S: 2277
</span><span class='line'>T: 2568
</span><span class='line'>U: 284
</span><span class='line'>V: 181
</span><span class='line'>W: 1326
</span><span class='line'>X: 25
</span><span class='line'>Y: 360
</span><span class='line'>Z: 38</span></code></pre></td></tr></table></div></figure>


<h2>Verify the Counts</h2>

<p>I verified my program&#8217;s results using TextEdit.</p>

<ol>
<li>Open &#8220;Moby Dick&#8221; in TextEdit</li>
<li>Type Command+F</li>
<li>Deselect &#8220;Ignore Case&#8221;</li>
<li>Select &#8220;Contains&#8221;</li>
<li>Enter Character</li>
<li>View TextEdit&#8217;s Result</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Git Sparse Checkout]]></title>
    <link href="http://briancoyner.github.com/blog/2013/06/05/git-sparse-checkout/"/>
    <updated>2013-06-05T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2013/06/05/git-sparse-checkout</id>
    <content type="html"><![CDATA[<p>There are times when all I want or need from a Git repo are a handful files.
For example, I use the awesome <code>git-completion</code> and <code>git-prompt</code> scripts
included in the Git project. Thus, I don&#8217;t need the entire Git repo taking up space.</p>

<p>This is exactly what <a href="http://schacon.github.io/git/git-read-tree.html">sparse checkouts</a> enable.</p>

<p>Here are the steps to create a &#8220;sparse&#8221; Git local repository that only includes the &#8220;Completion&#8221; scripts.</p>

<h4>Step 1: Create a directory.</h4>

<p>I named mine <code>git-completion</code>. You can name the directory whatever you want.</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>
</pre></td><td class='code'><pre><code class=''><span class='line'>mkdir git-completion
</span><span class='line'>cd git-completion</span></code></pre></td></tr></table></div></figure>


<h4>Step 2: Initialize a Git repository</h4>

<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'>git init</span></code></pre></td></tr></table></div></figure>


<h4>Step 3: Enable Sparse Checkouts</h4>

<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'>git config core.sparsecheckout true</span></code></pre></td></tr></table></div></figure>


<h4>Step 4: Tell Git which directories you want</h4>

<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'>echo contrib/completion/ &gt;&gt; .git/info/sparse-checkout</span></code></pre></td></tr></table></div></figure>


<p>Or you can modify the <code>.git/info/sparse-checkout</code> file directly. Either way is fine.</p>

<h4>Step 5: Add the remote</h4>

<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'>git remote add -f origin https://github.com/git/git.git</span></code></pre></td></tr></table></div></figure>


<h4>Final Step: Fetch the files</h4>

<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'>git pull origin master</span></code></pre></td></tr></table></div></figure>


<p>You should now have the <code>contrib/completion</code> directory. No other Git source files exist in your local copy.</p>

<h3>Sourcing the files</h3>

<p>Update your <code>.bashrc</code> file.</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>
</pre></td><td class='code'><pre><code class=''><span class='line'>source ~/Development/git-completion/contrib/completion/git-completion.bash
</span><span class='line'>source ~/Development/git-completion/contrib/completion/git-prompt.sh</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads Is Now On Google+]]></title>
    <link href="http://briancoyner.github.com/blog/2013/05/29/cocoaheads-google-plus/"/>
    <updated>2013-05-29T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2013/05/29/cocoaheads-google-plus</id>
    <content type="html"><![CDATA[<p>The &#8220;West&#8221; St. Louis CocoaHeads is now on <a href="https://plus.google.com/communities/103036296188607152068">Google+</a>. If you are an iOS developer (or an aspiring iOS developer) in the St. Louis area, then you should join.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, May 28, 2013]]></title>
    <link href="http://briancoyner.github.com/blog/2013/05/24/cocoaheads-may-2013/"/>
    <updated>2013-05-24T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2013/05/24/cocoaheads-may-2013</id>
    <content type="html"><![CDATA[<h2>Bluetooth LE: Using iOS CoreBluetooth to communicate with &#8220;the Internet of Things&#8221;</h2>

<p><strong>By Jason Graves</strong></p>

<blockquote><p>BLE or Bluetooth &#8216;Low Energy&#8217; is a fairly new wireless spec designed to connect us to world around us. This includes gathering data from embedded sensors like a thermostat or heart rate monitor, or controlling the lights in your house or unlocking the front door without a key. Apple&#8217;s CoreBluetooth framework has been around since iOS 5, but we are only now starting to see many new BLE enabled devices become available. We will cover some of the interesting uses of BLE and how to use CoreBluetooth to create your own apps that can communicate with these devices.</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>Bluetooth LE</strong></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/content/headquarters">Headquarters</a> (East Room); (314) 994-3300; (1640 S. Lindbergh Blvd).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, April 30, 2013]]></title>
    <link href="http://briancoyner.github.com/blog/2013/04/07/cocoaheads-april-2013/"/>
    <updated>2013-04-07T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2013/04/07/cocoaheads-april-2013</id>
    <content type="html"><![CDATA[<h2>iOS Tool Talks</h2>

<h3>Why I Bought AppCode</h3>

<p><strong>By Jason Hanson</strong></p>

<blockquote><p>AppCode, by JetBrains, is what an IDE should be. All the tools I have come to know and love in a ‘grown-up’ IDE for the Objective-C and iOS platform.  My productivity, and more importantly, my confidence to refactor, skyrocketed when I started using AppCode.  Come learn about some of the powerful features, tips, tricks, and shortcuts AppCode has to offer the iOS developer.</p></blockquote>

<h3>Lighten the load on your teams with Jenkins</h3>

<p><strong>By JP Revel</strong></p>

<blockquote><p>If you&#8217;ve ever been part of a software project with a team, it often falls to one person to compile the project when it comes time to deliver.  There are lots of problems with this approach.  One solution is to set up a CI server, such as Jenkins (formerly Hudson).  I will talk about the concept of CI, go over a sample setup, show some configuration and (hopefully) have Jenkins build a project for us.</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>iOS Tools Talk</strong></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/content/headquarters">Headquarters</a> (East Room); (314) 994-3300; (1640 S. Lindbergh Blvd).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, March 26, 2013]]></title>
    <link href="http://briancoyner.github.com/blog/2013/03/07/cocoaheads-march-2013/"/>
    <updated>2013-03-07T00:00:00-06:00</updated>
    <id>http://briancoyner.github.com/blog/2013/03/07/cocoaheads-march-2013</id>
    <content type="html"><![CDATA[<h3>UIStoryBoards</h3>

<p><strong>By Rick Aurbach</strong></p>

<blockquote><p>While apps with straightforward UI designs can often be implemented effectively using a single storyboard and GUI-based segues, this approach is less effective for large complex UI designs. This talk will discuss techniques for dividing an application&#8217;s UI into multiple storyboards and implementing programmatically-generated segues. We will discuss tab bar controllers, embedding sub-controllers into views, popover controllers, and navigation controllers. The talk will hopefully appeal to newbies and veterans alike.</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>UIStoryboards</strong> by <em>Rick Aurbach</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/content/headquarters">Headquarters</a> (East Room); (314) 994-3300; (1640 S. Lindbergh Blvd).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, February 26, 2013]]></title>
    <link href="http://briancoyner.github.com/blog/2013/02/03/cocoaheads-february-2013/"/>
    <updated>2013-02-03T00:00:00-06:00</updated>
    <id>http://briancoyner.github.com/blog/2013/02/03/cocoaheads-february-2013</id>
    <content type="html"><![CDATA[<h3>Unit Testing Objective-C Applications</h3>

<p><strong>By Jeff Roberts</strong></p>

<blockquote><p>The vast majority of developers don&#8217;t write unit tests against their applications. The typical design of many iOS applications and the iOS SDK can make it challenging to write tests. We will learn about some basic unit testing principles, mocking with OCMock, asserting with OCHamcrest, swizzling and even cheating with KVO, while keeping score with some helpful utilities like OCUnit2JUnit and code coverage with gcov.</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>Unit Testing Objective-C Applications</strong> by <em>Jeff Roberts</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/content/headquarters">Headquarters</a> (East Room); (314) 994-3300; (1640 S. Lindbergh Blvd).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, January 29, 2013]]></title>
    <link href="http://briancoyner.github.com/blog/2013/01/02/cocoaheads-january-2013/"/>
    <updated>2013-01-02T00:00:00-06:00</updated>
    <id>http://briancoyner.github.com/blog/2013/01/02/cocoaheads-january-2013</id>
    <content type="html"><![CDATA[<h3>LLDB</h3>

<p><strong>By Brian Coyner</strong></p>

<blockquote><p>LLDB is the default debugger in Xcode on OS X. LLDB supports debugging Objective-C, C, and C++. We will discuss various aspects of the debugger, as well as look at how to utilize LLDB to effectively debug apps.</p>

<ul>
<li>LLDB architecture</li>
<li>Various LLDB commands (setting breakpoints, setting watchpoints, thread control, etc.)</li>
<li>Using the LLDB Python bridge to &#8220;script&#8221; a debug session</li>
</ul>
</blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>LLDB</strong> by <em>Brian Coyner</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/content/headquarters">Headquarters</a> (East Room); (314) 994-3300; (1640 S. Lindbergh Blvd).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, December 27, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/12/08/cocoaheads-december-2012/"/>
    <updated>2012-12-08T00:00:00-06:00</updated>
    <id>http://briancoyner.github.com/blog/2012/12/08/cocoaheads-december-2012</id>
    <content type="html"><![CDATA[<h3>5 Things Every iOS Developer Should Know</h3>

<p><strong>By Brian Coyner</strong></p>

<blockquote><p>Brian will discuss 5 things every iOS developer should know. Plus a few bonus items.</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>5 Things Every iOS Developer Should Know</strong> by <em>Brian Coyner</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/content/headquarters">Headquarters</a> (East Room); (314) 994-3300; (1640 S. Lindbergh Blvd).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, October 25, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/10/18/cocoaheads-october-2012+copy/"/>
    <updated>2012-10-18T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/10/18/cocoaheads-october-2012 copy</id>
    <content type="html"><![CDATA[<h2>Tonight&#8217;s Session is Canceled. Presenter is sick!!!</h2>

<h3>5 Things Every iOS Developer Should Know</h3>

<p><strong>By Brian Coyner</strong></p>

<blockquote><p>Brian will discuss 5 things every iOS developer should know. Plus a few bonus items.</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>5 Things Every iOS Developer Should Know</strong> by <em>Brian Coyner</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/content/headquarters">Headquarters</a> (East Room); (314) 994-3300; (1640 S. Lindbergh Blvd).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, September 27, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/09/19/cocoaheads-september-2012/"/>
    <updated>2012-09-19T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/09/19/cocoaheads-september-2012</id>
    <content type="html"><![CDATA[<h3>A Tour of iOS 6</h3>

<p><strong>By John Haney</strong></p>

<blockquote><p>Now that iOS 6 is officially released, we can dive into the details of the new features of this update.</p>

<ul>
<li>Maps</li>
<li>Social Framework</li>
<li>Pass Kit</li>
<li>Game Center</li>
<li>Reminders</li>
<li>In-App Purchase</li>
<li>and more</li>
</ul>
</blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>A Tour of iOS 6</strong> by <em>John Haney</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/branches/hq/">Headquarters</a> (East Room); (314) 994-3300; (40 &amp; Lindbergh).</p>

<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;output=embed"></iframe>


<br /><small><a href="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;source=embed" style="text-align:left">View Larger Map</a></small>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, August 23, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/08/11/cocoaheads-august-2012/"/>
    <updated>2012-08-11T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/08/11/cocoaheads-august-2012</id>
    <content type="html"><![CDATA[<h3>Core Animation is Awesome</h3>

<blockquote><p>&#8216;Nuff said</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>Core Animation is Awesome</strong> by Brian Coyner</li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/branches/hq/">Headquarters</a> (East Room); (314) 994-3300; (40 &amp; Lindbergh).</p>

<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;output=embed"></iframe>


<br /><small><a href="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;source=embed" style="text-align:left">View Larger Map</a></small>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, July 26, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/07/16/cocoaheads-july-2012/"/>
    <updated>2012-07-16T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/07/16/cocoaheads-july-2012</id>
    <content type="html"><![CDATA[<h3>July &#8220;Blast&#8221; Talks</h3>

<blockquote><p>Brian Coyner (Xcode Tips and Tricks, Responder Chain)
John Haney (View Controller)
Other</p></blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>July &#8220;Blast&#8221; Talks</strong></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/branches/hq/">Headquarters</a> (East Room); (314) 994-3300; (40 &amp; Lindbergh).</p>

<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;output=embed"></iframe>


<br /><small><a href="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;source=embed" style="text-align:left">View Larger Map</a></small>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, June, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/06/01/cocoaheads-june-2012/"/>
    <updated>2012-06-01T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/06/01/cocoaheads-june-2012</id>
    <content type="html"><![CDATA[<h3>No Meeting (Summer Vacation Time)</h3>

<p>We will meet again in July for &#8220;July Blast&#8221; talks. These will be short talks dedicated to small, but useful iOS frameworks/ classes/ methods.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, May 24, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/05/06/cocoaheads-may-2012/"/>
    <updated>2012-05-06T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/05/06/cocoaheads-may-2012</id>
    <content type="html"><![CDATA[<h3>UIStoryboards Are Awesome!</h3>

<p><strong>By Brian Coyner</strong></p>

<blockquote><p>iOS 5 introduced Storyboards. This talk shows how to effectively utilize storyboards to create and visualize your app&#8217;s workflows. We will focus on using Storyboards for both iPhone and iPad.</p>

<ul>
<li>Introduction</li>
<li>Building Static and Dynamic <code>UITableView</code>s and <code>UITableViewCell</code>s</li>
<li>Responding to Segue Transitions (including popovers)</li>
<li>Programmatically Invoking a Segue</li>
<li>Composing custom iPad scenes with multiple view controllers (includes <code>UIViewController</code> containment)</li>
</ul>
</blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - <strong>UIStoryboards Are Awesome!</strong> by <em>Brian Coyner</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/branches/hq/">Headquarters</a> (East Room); (314) 994-3300; (40 &amp; Lindbergh).</p>

<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;output=embed"></iframe>


<br /><small><a href="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;source=embed" style="text-align:left">View Larger Map</a></small>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[OCUnit Tip: You Only Need a .m File]]></title>
    <link href="http://briancoyner.github.com/blog/2012/04/25/OCUnit-Single-File/"/>
    <updated>2012-04-25T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/04/25/OCUnit-Single-File</id>
    <content type="html"><![CDATA[<p>If you are writing OCUnit tests, then you should only have a source (<em>.m</em>) file. There is no need for a header (<em>.h</em>).</p>

<p><strong>Why no header (<em>.h</em>)?</strong></p>

<ul>
<li>test cases are, by nature, private implementation details</li>
<li>no need for a public interface (test cases are never imported by other test cases)</li>
<li>it is completely legal Objective-C to have the <code>@interface</code> and <code>@implementation</code> in the same file</li>
</ul>


<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>
<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>
</pre></td><td class='code'><pre><code class='objectivec'><span class='line'><span class="cp">//</span>
</span><span class='line'><span class="cp">// BTSPreferredTransferTest.m</span>
</span><span class='line'><span class="cp">//</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import &lt;SenTestingKit/SenTestingKit.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">BTSPreferredTransferTest</span> : <span class="nc">SenTestCase</span>
</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">BTSPreferredTransferTest</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">testSomethingUseful</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// Test implementation</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[West St. Louis CocoaHeads, April 26, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/04/01/cocoaheads-april-2012/"/>
    <updated>2012-04-01T00:00:00-05:00</updated>
    <id>http://briancoyner.github.com/blog/2012/04/01/cocoaheads-april-2012</id>
    <content type="html"><![CDATA[<h3>Introduction to Cocos2D</h3>

<p><strong>By Brian Paulsmeyer</strong></p>

<blockquote><p>This session covers the following Cocos2D topics</p>

<ul>
<li>menus, touch input, timers,</li>
<li>sprites (with actions and animations)</li>
<li>layers, tiled maps (with scrolling)</li>
<li>joysticks/button pads,</li>
<li>particle emitters, projectiles</li>
</ul>
</blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - Cocos2D by <em>Brian Paulsmeyer</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/branches/hq/">Headquarters</a> (East Room); (314) 994-3300; (40 &amp; Lindbergh).</p>

<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;output=embed"></iframe>


<br /><small><a href="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;source=embed" style="text-align:left">View Larger Map</a></small>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, March 22, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/03/05/cocoaheads-march-2012/"/>
    <updated>2012-03-05T00:00:00-06:00</updated>
    <id>http://briancoyner.github.com/blog/2012/03/05/cocoaheads-march-2012</id>
    <content type="html"><![CDATA[<h3>Getting Started with Core Data in iOS 5.</h3>

<p><strong>By Byron Bennett</strong></p>

<blockquote><p>This session digs into the following Core Data topics:</p>

<ul>
<li>Using the new <code>UIManagedDocument</code></li>
<li>using Xcode to build an entity model</li>
<li>executing &#8220;fetch requests&#8221;</li>
<li>using <code>NSFetchedResultsController</code> to sync data with a <code>UITableView</code></li>
</ul>
</blockquote>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - Getting Started with Core Data in iOS 5 by <em>Byron Bennett</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/branches/hq/">Headquarters</a> (East Room); (314) 994-3300; (40 &amp; Lindbergh).</p>

<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;output=embed"></iframe>


<br /><small><a href="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;source=embed" style="text-align:left">View Larger Map</a></small>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[We Made An App For That]]></title>
    <link href="http://briancoyner.github.com/blog/2012/02/01/cocoaheads-we-made-an-app-for-that/"/>
    <updated>2012-02-01T00:00:00-06:00</updated>
    <id>http://briancoyner.github.com/blog/2012/02/01/cocoaheads-we-made-an-app-for-that</id>
    <content type="html"><![CDATA[<p>The <strong>West St. Louis CocoaHeads</strong> is providing St. Louis iOS developers a chance to showcase his or her app(s)
at the February West St. Louis CocoaHeads group.
The idea is taken from the <a href="http://cocoaconf.com">CocoaConf</a> session with the same name. The session
 provides developers ~10 minutes to demo each app and discuss the effort, challenges, successes, etc.
he or she experienced during development. Each participant is encouraged to give away app promo codes. I am really excited to hear
all of the great stories behind the apps.</p>

<p>Please let me know if you are interested in participating in this event.</p>

<p>This session will take place on March 1, 2012 (the February meeting) <strong>after</strong> the <a href="http://briancoyner.github.com/blog/2012/02/01/cocoaheads-february-2012/">main presentation</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[West St. Louis CocoaHeads, March 1, 2012]]></title>
    <link href="http://briancoyner.github.com/blog/2012/02/01/cocoaheads-february-2012/"/>
    <updated>2012-02-01T00:00:00-06:00</updated>
    <id>http://briancoyner.github.com/blog/2012/02/01/cocoaheads-february-2012</id>
    <content type="html"><![CDATA[<h3>What Your Mom Never Told You About Notifications</h3>

<p><strong>By Mark Schisler</strong></p>

<blockquote><p>The iOS Notification Center is a great way for app developers to notify users
of matters which require their urgent attention.  However, it can become one
of the quickest ways to annoy users via what may be the most obnoxious personal
communication medium ever devised by man, prompting users to uninstall your
app, or worse write a bad review.  This presentation will consider the best
practices for implementing notifications as devised by the Apple Guidelines
and other notable app experts.  From there we will take a look under the hood
at the technical details of implementing local and push notifications, including
some PaaS options that might help (most notably: Urban Airship and Heroku via the APN on Rails framework.)</p></blockquote>

<p><strong>NOTE:</strong> The February meeting is <strong>Thursday, March 1</strong>.</p>

<ul>
<li>6:00pm - Meet/Greet</li>
<li>6:15pm - What Your Mom Never Told You About Notifications by <em>Mark Schisler</em></li>
<li>7:30pm - Next Meeting Details, Questions / Discussions</li>
</ul>


<p>St. Louis County Library <a href="" title="http://www.slcl.org/branches/hq/">Headquarters</a> (East Room); (314) 994-3300; (40 &amp; Lindbergh).</p>

<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;output=embed"></iframe>


<br /><small><a href="http://maps.google.com/maps?ie=UTF8&amp;hl=en&amp;view=map&amp;cid=7387069718202221589&amp;q=St Louis County Library&amp;vpsrc=6&amp;ll=38.619016,-90.418854&amp;spn=0.321891,0.411987&amp;z=10&amp;source=embed" style="text-align:left">View Larger Map</a></small>



]]></content>
  </entry>
  
</feed>
