<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mobile | AkitaOnRails.com</title><link>https://akitaonrails.github.io/tags/mobile/</link><description>Blog do Fabio Akita do Canal do YouTube 'Akitando' falando sobre tecnologia, carreira e coisas geek.</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Mon, 19 Oct 2026 23:20:48 +0000</lastBuildDate><atom:link href="https://akitaonrails.github.io/tags/mobile/index.xml" rel="self" type="application/rss+xml"/><item><title>[Off-Topic] iOS Development and Open Source Libraries</title><link>https://akitaonrails.github.io/2011/03/26/off-topic-ios-development-and-open-source-libraries/</link><guid isPermaLink="true">https://akitaonrails.github.io/2011/03/26/off-topic-ios-development-and-open-source-libraries/</guid><pubDate>Sat, 26 Mar 2011 15:59:00 -0300</pubDate><description>&lt;p&gt;I&amp;rsquo;ve been following the evolution of iOS development, and it keeps getting easier to assemble a quality application. Apple just released iOS 4.3.1 and Xcode 4.0.1, and the new Xcode is a big step forward. I think this is the first major IDE to support Git as a first class citizen in the development workflow. Every serious IDE should do that, and any serious developer should be comfortable with Git by now.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I&rsquo;ve been following the evolution of iOS development, and it keeps getting easier to assemble a quality application. Apple just released iOS 4.3.1 and Xcode 4.0.1, and the new Xcode is a big step forward. I think this is the first major IDE to support Git as a first class citizen in the development workflow. Every serious IDE should do that, and any serious developer should be comfortable with Git by now.</p>
<p>The new LLVM Compiler 2.0 is impressive and helps a lot in writing memory leak free applications. I don&rsquo;t buy the <em>&ldquo;it is too difficult doing memory management&rdquo;</em> complaint, which usually just means <em>&ldquo;I&rsquo;m too lazy and cheap&rdquo;</em>. Come on, there are thousands of quality apps for both OS X and iOS.</p>
<p>Memory management is a bit harder than leaning on a full featured generational garbage collector, but it&rsquo;s nowhere near as hard as some people claim. Any reasonable developer can handle it with minimal effort.</p>
<p>The community keeps releasing great libraries that push productivity even further. Let me list a few of my favorites:</p>
<ul>
<li><a href="http://web.archive.org/web/20110326193919/http://www.flurry.com/"target="_blank" rel="noopener">Flurry</a> is the iOS equivalent of Google Analytics. Everything is trackable now: who is using your app, how they use it, which features get the most and least use, and in which regions. You feed that data back into the product to refine it. It ships SDKs for Java ME, Blackberry, Android, Windows Phone and iOS. You sign up, register your application, and get a unique application key that you hard code into the app. It is literally as easy as this:</li>
</ul>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="cp">#import &#34;FlurryAPI.h&#34;
</span></span></span><span class="line"><span class="cl"><span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="nl">applicationDidFinishLaunching</span><span class="p">:(</span><span class="n">NSNotification</span><span class="o">*</span><span class="p">)</span> <span class="n">notice</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="n">FlurryAPI</span> <span class="nl">startSession</span><span class="p">:</span><span class="s">@&#34;your_unique_app_key&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>There are several other methods to count events, log page views, log exceptions and errors, and even location. Mandatory for every app.</p>
<ul>
<li><a href="https://allseeing-i.com/ASIHTTPRequest/"target="_blank" rel="noopener">ASIHTTPRequest</a> handles the fact that most apps integrate with some web based back-end. Twitter, Facebook, LinkedIn, everything logs into some cloud service to grab information and collaborate. Cocoa Touch has a rich set of networking capabilities, but they sit at a lower level than most people want. Making background connections, tracking success or failure, triggering events and loading cues for the user, it all gets tedious. ASIHTTPRequest makes reliable connections to any web endpoint strikingly easy. The documentation is good enough and the code is even simpler:</li>
</ul>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">-</span> <span class="p">(</span><span class="kt">IBAction</span><span class="p">)</span><span class="nf">grabURLInTheBackground:</span><span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nv">sender</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">[</span><span class="nb">self</span> <span class="n">queue</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span><span class="nb">self</span> <span class="nl">setQueue</span><span class="p">:[[[</span><span class="n">NSOperationQueue</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">]</span> <span class="n">autorelease</span><span class="p">]];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">NSURL</span> <span class="o">*</span><span class="n">url</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSURL</span> <span class="nl">URLWithString</span><span class="p">:</span><span class="s">@&#34;http://allseeing-i.com&#34;</span><span class="p">];</span> <span class="n">ASIHTTPRequest</span> <span class="o">*</span><span class="n">request</span> <span class="o">=</span> <span class="p">[</span><span class="n">ASIHTTPRequest</span> <span class="nl">requestWithURL</span><span class="p">:</span><span class="n">url</span><span class="p">];</span> <span class="p">[</span><span class="n">request</span> <span class="nl">setDelegate</span><span class="p">:</span><span class="nb">self</span><span class="p">];</span> <span class="p">[</span><span class="n">request</span> <span class="nl">setDidFinishSelector</span><span class="p">:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">requestDone</span><span class="p">:)];</span> <span class="p">[</span><span class="n">request</span> <span class="nl">setDidFailSelector</span><span class="p">:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">requestWentWrong</span><span class="p">:)];</span> <span class="p">[[</span><span class="nb">self</span> <span class="n">queue</span><span class="p">]</span> <span class="nl">addOperation</span><span class="p">:</span><span class="n">request</span><span class="p">];</span> <span class="c1">//queue is an NSOperationQueue
</span></span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">requestDone:</span><span class="p">(</span><span class="n">ASIHTTPRequest</span> <span class="o">*</span><span class="p">)</span><span class="nv">request</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">NSString</span> <span class="o">*</span><span class="n">response</span> <span class="o">=</span> <span class="p">[</span><span class="n">request</span> <span class="n">responseString</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">requestWentWrong:</span><span class="p">(</span><span class="n">ASIHTTPRequest</span> <span class="o">*</span><span class="p">)</span><span class="nv">request</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">NSError</span> <span class="o">*</span><span class="n">error</span> <span class="o">=</span> <span class="p">[</span><span class="n">request</span> <span class="n">error</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The library creates network queues, so you can fire as many requests as you want and it manages the queue in the background. There are use case examples in the <a href="https://allseeing-i.com/ASIHTTPRequest/How-to-use/"target="_blank" rel="noopener">documentation</a>. You can skip the low level base classes and delegate all HTTP requests to it. Highly recommended.</p>
<ul>
<li><a href="http://web.archive.org/web/20110423000036/https://github.com/TouchCode/TouchJSON"target="_blank" rel="noopener">TouchJSON</a>: if you consume online HTTP data, you will probably get a JSON payload (another trend of the moment) that you need to parse into meaningful Objective-C objects. Objective-C is dynamic and flexible in its type system, so converting anything is easy. The parsing itself is tedious, and this library takes care of it. Use ASIHTTPRequest to connect to the server, and once it returns, parse the response blob like this:</li>
</ul>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">requestDone:</span><span class="p">(</span><span class="n">ASIHTTPRequest</span> <span class="o">*</span><span class="p">)</span><span class="nv">request</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">NSString</span> <span class="o">*</span><span class="n">response</span> <span class="o">=</span> <span class="p">[</span><span class="n">request</span> <span class="n">responseString</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">NSError</span> <span class="o">*</span><span class="n">theError</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">NSDictionary</span> <span class="o">*</span><span class="n">theDictionary</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSDictionary</span> <span class="nl">dictionaryWithJSONString</span><span class="p">:</span><span class="n">response</span> <span class="nl">error</span><span class="p">:</span><span class="o">&amp;</span><span class="n">theError</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Super easy. It deserializes a JSON string into a graph of Objective-C objects, and it goes the other way too, turning objects back into JSON so you can POST it somewhere or save it to a local file.</p>
<ul>
<li>ShareKit rides the trend that every piece of app content should be shareable. Whenever your users share something with their friends, your app gets more visibility, which is great marketing. You want the app to share content through email, Twitter, Facebook and other social networks. The <a href="http://web.archive.org/web/20110319200447/http://www.getsharekit.com/docs"target="_blank" rel="noopener">documentation</a> is good, the views are all customizable, and it takes care of the boring details of logging into each service and making the connections. It is also extensible, so adding a new online service later is easy. Follow the <a href="http://web.archive.org/web/20110321130554/http://getsharekit.com/install"target="_blank" rel="noopener">installation instructions</a>; in the end it comes down to adding a UIBarButtonItem like this:</li>
</ul>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">[[</span><span class="n">UIBarButtonItem</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithBarButtonSystemItem</span><span class="p">:</span><span class="n">UIBarButtonSystemItemAction</span>
</span></span><span class="line"><span class="cl">    <span class="nl">target</span><span class="p">:</span><span class="nb">self</span>
</span></span><span class="line"><span class="cl">    <span class="nl">action</span><span class="p">:</span><span class="k">@selector</span><span class="p">(</span><span class="n">share</span><span class="p">)]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>And adding the event handler code:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="p">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">myButtonHandlerAction</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// Create the item to share (in this example, a url)
</span></span></span><span class="line"><span class="cl">    <span class="n">NSURL</span> <span class="o">*</span><span class="n">url</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSURL</span> <span class="nl">URLWithString</span><span class="p">:</span><span class="s">@&#34;http://getsharekit.com&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="n">SHKItem</span> <span class="o">*</span><span class="n">item</span> <span class="o">=</span> <span class="p">[</span><span class="n">SHKItem</span> <span class="nl">URL</span><span class="p">:</span><span class="n">url</span> <span class="nl">title</span><span class="p">:</span><span class="s">@&#34;ShareKit is Awesome!&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Get the ShareKit action sheet
</span></span></span><span class="line"><span class="cl">    <span class="n">SHKActionSheet</span> <span class="o">*</span><span class="n">actionSheet</span> <span class="o">=</span> <span class="p">[</span><span class="n">SHKActionSheet</span> <span class="nl">actionSheetForItem</span><span class="p">:</span><span class="n">item</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// Display the action sheet
</span></span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="n">actionSheet</span> <span class="nl">showFromToolbar</span><span class="p">:</span><span class="n">navigationController</span><span class="p">.</span><span class="n">toolbar</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Can&rsquo;t get easier than that.</p>
<ul>
<li><a href="https://code.google.com/archive/p/simple-iphone-image-processing"target="_blank" rel="noopener">simple-iphone-image-processing</a> covers another important area: dealing with images. Every new smartphone has a camera, and it pays to leverage it. Snapping a picture and saving the file is just the start; you will often want to process the image to extract meaningful information.</li>
</ul>
<p>Want to be inspired? Look at this <a href="https://www.youtube.com/watch?v=oImMJ6p6mKE"target="_blank" rel="noopener">Sudoku application demo</a> built on this image processing library. You point the camera at any Sudoku printed in a newspaper, and the app parses the image, detects the grid, and builds a fully functional digital representation you can then solve with well known algorithms. How cool is that?</p>
<p>One caveat: the library is old, with its last commit from 2009, so I am not sure how it behaves on current iOS releases. The documentation is close to none, so you will have to dig through the source. I haven&rsquo;t tried it myself; I&rsquo;m adding it here as a note to run further experiments later.</p>
<ul>
<li>
<p><a href="http://cocos2d.org/"target="_blank" rel="noopener">cocos2d</a> steps in when simple list based apps get boring and you want animation and interactivity. You can use Apple&rsquo;s standard Core Graphics and Core Animation APIs, or go crazy with cocos2d. It is an OpenGL accelerated 2D API, so great effects are easy to build, and the cross platform wrappers let you carry the knowledge to other platforms. There are plenty of tutorials online, such as this Box2D data tool writeup, <a href="http://web.archive.org/web/20110325002808/http://maniacdev.com/2011/02/cross-platform-cocos2d-game-engine-using-cpp/"target="_blank" rel="noopener">this cross platform engine</a>, and <a href="http://bit.ly/eKHOqw"target="_blank" rel="noopener">more</a>. Worth studying.</p>
</li>
<li>
<p><a href="http://web.archive.org/web/20110317060458/http://www.iphonear.org/"target="_blank" rel="noopener">iPhone AR Kit</a> is not entirely mature yet, I think, but plenty of apps already use it and it should evolve fast. The idea is to turn on the camera, process the image frames, and lay 2D or 3D animation on top, so the digital objects seem to interact with the real time background. Pair that with the device&rsquo;s motion sensors (compass, gyroscope, accelerometer) and you can build genuinely impressive apps. Worth studying.</p>
</li>
<li>
<p><a href="https://github.com/allending/Kiwi"target="_blank" rel="noopener">Kiwi</a> and Gh-Unit: unfortunately, testing is not well understood or practiced in the Objective-C community. Many Rubyists who also write Objective-C are trying to bring over the practices we take for granted in Ruby, so I hope this helps. Cocoa and Xcode ship basic unit testing tools like SenTestingKit. Documentation is close to zero; you can read Apple&rsquo;s official <a href="http://web.archive.org/web/20110411203656/http://developer.apple.com/library/ios/DOCUMENTATION/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html"target="_blank" rel="noopener">logic testing</a> article and this <a href="http://www.grokkingcocoa.com/how_to_debug_iphone_unit_te.html"target="_blank" rel="noopener">blog post</a>. The default tools are basic, so it is worth checking out other frameworks like Gh-Unit and Kiwi. Kiwi in particular looks impressive, following an RSpec-like syntax:</p>
</li>
</ul>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-objc" data-lang="objc"><span class="line"><span class="cl"><span class="n">describe</span><span class="p">(</span><span class="s">@&#34;Team&#34;</span><span class="p">,</span> <span class="o">^</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">context</span><span class="p">(</span><span class="s">@&#34;when newly created&#34;</span><span class="p">,</span> <span class="o">^</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">it</span><span class="p">(</span><span class="s">@&#34;should have a name&#34;</span><span class="p">,</span> <span class="o">^</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="kt">id</span> <span class="n">team</span> <span class="o">=</span> <span class="p">[</span><span class="n">Team</span> <span class="n">team</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">            <span class="p">[[</span><span class="n">team</span><span class="p">.</span><span class="n">name</span> <span class="n">should</span><span class="p">]</span> <span class="nl">equal</span><span class="p">:</span><span class="s">@&#34;Black Hawks&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">        <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">it</span><span class="p">(</span><span class="s">@&#34;should have 11 players&#34;</span><span class="p">,</span> <span class="o">^</span><span class="p">{</span> <span class="kt">id</span> <span class="n">team</span> <span class="o">=</span> <span class="p">[</span><span class="n">Team</span> <span class="n">team</span><span class="p">];</span> <span class="p">[[[</span><span class="n">team</span> <span class="n">should</span><span class="p">]</span> <span class="nl">have</span><span class="p">:</span><span class="mi">11</span><span class="p">]</span> <span class="n">players</span><span class="p">];</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Both are worth checking out. We should push more testing technique and tooling into Objective-C development. We did it in Ruby land, and there is no reason we can&rsquo;t do the same here.</p>
<p>That&rsquo;s it for now. There are many more great libraries and tools out there, and iOS is evolving fast, so all of this is exciting to follow and practice. I hope to contribute back soon.</p>
]]></content:encoded><category>mobile</category><category>apple</category><category>programacao</category><category>off-topic</category></item><item><title>Off-topic: MacWorld 2007 - Steve Jobs anuncia o esperado iPhone!</title><link>https://akitaonrails.github.io/2007/01/09/off-topic-macworld-2007-steve-jobs-anuncia-o-esperado-iphone/</link><guid isPermaLink="true">https://akitaonrails.github.io/2007/01/09/off-topic-macworld-2007-steve-jobs-anuncia-o-esperado-iphone/</guid><pubDate>Tue, 09 Jan 2007 11:34:34 -0200</pubDate><description>&lt;p&gt;&lt;strong&gt;Este keynote entrou para a história, definitivamente!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0159.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Todo Railer que se preze gosta da Apple, então imagino que todos já saibam: acabou de terminar (17:07) o keynote do Steve Jobs em São Francisco, na MacWorld 2007. Os rumores foram enormes nos últimos dias, nunca houve keynote tão esperado, e Jobs não decepcionou. Detalhes, transcrição e fotos na cobertura ao vivo da &lt;a href="http://www.engadget.com/2007/01/09/live-from-macworld-2007-steve-jobs-keynote/"target="_blank" rel="noopener"&gt;Engadget&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0182.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Deixando de lado o Apple TV (cujo protótipo, ainda chamado &lt;em&gt;iTV&lt;/em&gt;, foi mostrado num evento especial em setembro de 2006), a pérola do show foi o &lt;strong&gt;iPhone&lt;/strong&gt;: um iPod, um celular e um comunicador de internet, como Jobs definiu, 3 em 1. Os padrões de celulares e smartphones foram para o buraco; a Apple acabou de subir a barra a níveis estratosféricos. A lista:&lt;/p&gt;</description><content:encoded><![CDATA[<p><strong>Este keynote entrou para a história, definitivamente!</strong></p>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0159.jpg" alt=""  loading="lazy" /></p>
<p>Todo Railer que se preze gosta da Apple, então imagino que todos já saibam: acabou de terminar (17:07) o keynote do Steve Jobs em São Francisco, na MacWorld 2007. Os rumores foram enormes nos últimos dias, nunca houve keynote tão esperado, e Jobs não decepcionou. Detalhes, transcrição e fotos na cobertura ao vivo da <a href="http://www.engadget.com/2007/01/09/live-from-macworld-2007-steve-jobs-keynote/"target="_blank" rel="noopener">Engadget</a>.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0182.jpg" alt=""  loading="lazy" /></p>
<p>Deixando de lado o Apple TV (cujo protótipo, ainda chamado <em>iTV</em>, foi mostrado num evento especial em setembro de 2006), a pérola do show foi o <strong>iPhone</strong>: um iPod, um celular e um comunicador de internet, como Jobs definiu, 3 em 1. Os padrões de celulares e smartphones foram para o buraco; a Apple acabou de subir a barra a níveis estratosféricos. A lista:</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0184.jpg" alt=""  loading="lazy" /></p>
<ul>
<li>4GB ou 8GB de memória flash</li>
<li>tela de alta resolução de 3.5&quot; com 160ppi</li>
</ul>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0226.jpg" alt=""  loading="lazy" /></p>
<ul>
<li>Apenas <strong>1</strong> botão; todo o resto é a tela widescreen multitoque com 3 sensores (proximidade, luz ambiente e acelerômetro). Quer dar zoom numa foto? Encoste dois dedos na tela e afaste um do outro!</li>
</ul>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0199.jpg" alt=""  loading="lazy" /></p>
<ul>
<li>sincroniza com o iTunes (músicas, vídeos, fotos, contatos, calendários)</li>
</ul>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0186.jpg" alt=""  loading="lazy" /></p>
<ul>
<li>WiFi, Bluetooth 2.0, quad-band GSM+EDGE (nos EUA, pela Cingular/AT&amp;T)</li>
<li>câmera digital de 2 Megapixels</li>
</ul>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0210.jpg" alt=""  loading="lazy" /></p>
<ul>
<li>Roda o OS X (!), e o Safari foi mostrado funcionando como browser. Integração com Google Maps, Yahoo Mail, POP3, IMAP. Vai além do BlackBerry</li>
</ul>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0217.jpg" alt=""  loading="lazy" /></p>
<ul>
<li>5 horas de bateria, 16 horas só de áudio</li>
<li>acessórios: fone de ouvido com microfone embutido no cabo (um apertinho no botão atende a ligação) e o menor e mais elegante fone bluetooth que já vi</li>
</ul>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0228.jpg" alt=""  loading="lazy" /></p>
<p>Os preços são salgados, mas condizem com um aparelho excepcional: US$ 499 pelo modelo de 4GB e US$ 599 pelo de 8GB, com contrato de dois anos. E a partir de hoje a <em>Apple Computer, Inc.</em> passa a se chamar <em>Apple, Inc.</em>. Faz todo sentido: os produtos da Apple já estão no nosso quarto (iMac), no escritório (MacBook, Mac Pro), nos carros (BMW, Audi e outros), na sala (Apple TV) e nos bolsos (iPod, iPhone). Impressionante, para dizer o mínimo.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0236.jpg" alt=""  loading="lazy" /></p>
<p>As ações da Apple fecharam o dia em alta de mais de 8%, e o Leopard nem foi mencionado! A meta é 1% de um mercado de quase 1 bilhão de celulares vendidos por ano: algo como 10 milhões de iPhones até o fim de 2008. O produto será lançado em junho nos EUA. Espero que chegue aqui logo!</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/files/dsc_0233.jpg" alt=""  loading="lazy" /></p>
<p>Se alguém achar um link para baixar o vídeo do keynote (espero que saia logo no BitTorrent), avisa!</p>
]]></content:encoded><category>apple</category><category>mobile</category><category>historia-da-computacao</category><category>off-topic</category></item></channel></rss>