Blog 2018-01-13T15:05:51Z On the MacBook Pro 2016 – and why I returned it <p style="text-align: center;"> <img src="/blog/2017/01/images/macbookpro-2016-returned~9ea595be7fc09fe414cb4db8c06e48eb91b996d1.jpg" class="responsive"> </p> <p>From 2006 to 2012, I have — on average — been buying a new MacBook Pro every year.</p> <p>But in 2012, Apple sold me a MacBook Pro so good that it has stayed my main work horse to this day: the 15-inch base configuration (2.3 GHz Quad-Core i7, 256 GB SSD) of the first Retina model, with 16 GB of RAM being the only extra option.</p> <p>Since then, I stayed on the sidelines, waiting for a worthy upgrade.</p> <p>The next generation MacBook Pro 2016 finally appeared to offer enough new and future-proof technology, so I pulled the trigger and purchased a new 15-inch MacBook Pro with the fastest available CPU (2.9 GHz Core i7), the fastest available GPU (Radeon 460) and a 1 TB PCIe SSD — for a whopping 4.039€.</p> <p>I’ve since spent several weeks with the new MacBook Pro as my main work machine. Here’s what I learnt and observed — and why I eventually decided to return it.</p> <h4>Xcode Performance</h4><p>Existing benchmark data for the CPUs used in the new MacBook Pros suggested that the 2016 high-end model would be 30% to 59% faster than my 2012 low-end configuration:</p> <p><blockquote class="twitter-tweet tw-align-center" data-conversation="none" data-lang="de"><p lang="en" dir="ltr">My <a href="https://twitter.com/hashtag/MacBookPro?src=hash&amp;ref_src=twsrc%5Etfw">#MacBookPro</a> 2012 &amp; 2016 comparison table - revision 5, updated with Apple&#39;s SSD speeds for the 15&quot; model (thanks <a href="https://twitter.com/AndreeMarkefors?ref_src=twsrc%5Etfw">@AndreeMarkefors</a>). <a href="https://t.co/OW2ISbZfMH">pic.twitter.com/OW2ISbZfMH</a></p>&mdash; Felix Schwarz (@felix_schwarz) <a href="https://twitter.com/felix_schwarz/status/793398196013760512?ref_src=twsrc%5Etfw">1. November 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>Not too bad.</p> <p>But <em>for me</em>, the performance metric that matters most is how fast Xcode performs typical operations. Therefore, I ran four tests using one of my larger projects (all times are build times):</p> <ul> <li><strong>Clean And Build</strong><br>(“Clean Build Folder”, waiting for indexing to finish, “Build”)<br>MacBook Pro 2012 low-end model: <em>49.3 sec (avg)</em><br>MacBook Pro 2016 high-end model: <em>40.5 sec (avg)</em><br>Speed increase: <em>21.7%, saving 8.8 sec</em></li> <li><strong>Incremental Build</strong><br>(Making a single change and hitting “Build” again)<br>MacBook Pro 2012 low-end model: <em>12.8 sec</em><br>MacBook Pro 2016 high-end model: <em>11.2 sec</em><br>Speed increase: <em>14%, saving 1.6 sec</em></li> <li><strong>Clean And Analyze<br></strong>(“Clean Build Folder”, waiting for indexing to finish, “Analyze”)<br>MacBook Pro 2012 low-end model: 143.7<em> sec</em><br>MacBook Pro 2016 high-end model: 121.9 sec<br>Speed increase: 17.9<em>%, saving 21.8 sec</em></li> <li><strong>Incremental Analyze<br></strong>(Making a single change and hitting “Analyze” again)<br>MacBook Pro 2012 low-end model: 13.3 sec<br>MacBook Pro 2016 high-end model: 12.7 sec<br>Speed increase: 4.7<em>%, saving 0.6 sec</em></li> </ul> <p>The new MacBook Pro saves me only barely noticeable 1.6 seconds for the most frequently performed action (incremental builds) while full builds are too rare as that the 21.7% performance gain on those would be significant enough. I’d be surprised if it’d save me a minute per day.</p> <h4>RAM</h4> <p>Having hoped for a 32 GB RAM option, I was disappointed by the new MacBook Pros maximum of 16 GB, but didn’t think too much about it when placing my order.</p> <p>As it turned out, Apple’s hands seem to be bound as the new MacBook Pro’s Skylake CPUs <a href="http://www.imore.com/why-doesnt-new-macbook-pro-have-32-gb-ram" rel="noopener" target="_blank">only support up to 16 GB</a> of Low-Power DDR3 RAM (LPDDR3).</p> <p>The question if 16 GB of RAM leaves enough breathing room for the next four years must still be raised, though.</p> <p>In <em>my</em> case, the answer turned out to be <em>no: </em>my typical usage today already saturates 16 GB to the point that macOS usually indicates a swap usage of 2 GB and more.</p> <p>Sure, the incredibly fast new SSDs make swapping less of an issue. But the last thing I want from a new MacBook Pro is swapping an increasing amount of data out to a SSD that’s now soldered onto the logic board — increasing the risk of premature wear and thereby shortening the entire machine’s life.</p> <h4>Thunderbolt 3</h4> <p><img src="/blog/2017/01/images/macbookpro-2016-dongles~d3c1396cef699241bf6067399561d75e982d8dba.jpg" class="responsive"></p> <p>I think #DongleLife is overblown.</p> <p>I’m fine with having to buy and use adapters to connect my old gear if that means my machine is capable of communicating with <em>future</em> devices at a <em>significantly</em> higher speed than was previously possible. In fact, that’s <em>exactly</em> what I expect from a machine that I want to use for the next four years. The future belongs to Thunderbolt 3/USB-C — and it’s good the new MacBook Pros ship with four of these ports.</p> <p>But where Apple <em>really</em> screwed up is the lineup of adapters they offer alongside the new MacBook Pros.</p> <h4>There’s no Apple adapter for this</h4> <p>As long as I can remember, Apple has always made and offered a complete line-up of adapters that you (might) need along with new ports, making the whole experience of switching to a new, more powerful port pretty painless.</p> <p>Not so this time:</p> <ul> <li><strong>GigaBit Ethernet:</strong> made by Belkin, the USB-C adapter Apple offers is both <a href="http://mjtsai.com/blog/2016/12/28/macbook-pro-ethernet-adapter-benchmark/" rel="noopener" target="_blank">slower and CPU usage is “a ton higher”</a> as with Apple’s Thunderbolt GigaBit Ethernet adapter from 2012. Why didn’t Apple make a Thunderbolt 3 version of that adapter? <p><blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr">Performance of Thunderbolt (top) vs Belkin USB-C ethernet adapters. Difference isn’t awful but CPU usage is a ton higher via USB-C. <a href="https://t.co/rQcilZvfAM">pic.twitter.com/rQcilZvfAM</a></p>&mdash; Paul Haddad (@tapbot_paul) <a href="https://twitter.com/tapbot_paul/status/814150859084926980?ref_src=twsrc%5Etfw">December 28, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> </li> <li><strong>Mini DisplayPort:</strong> originally developed and introduced by Apple in 2008 and used on the LED Cinema Displays until October 2013, it is really surprising that Apple is <em>not</em> making or selling any adapter to Mini DisplayPort. Some suggested to use the new Thunderbolt 3 to Thunderbolt 2 adapter, but — despite using the same connector — it <a href="https://support.apple.com/en-us/HT207266" rel="noopener" target="_blank">can’t</a> be used to connect Mini DisplayPort displays. Looking for a third-party adapter to connect my LED Cinema Display then was extremely time-consuming. It took me several days until I finally found one without “sponsored” 5 star reviews, a real spec sheet, good build quality and made by a trustworthy company: <p><blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PSA?src=hash&amp;ref_src=twsrc%5Etfw">#PSA</a>: this USB-C-&gt;DisplayPort adapter (+ DP-&gt;mini-DP adapter) works w/ the <a href="https://twitter.com/hashtag/MacBookPro?src=hash&amp;ref_src=twsrc%5Etfw">#MacBookPro</a> to connect a Cinema Display: <a href="https://t.co/Q1WFFa11T9">https://t.co/Q1WFFa11T9</a> <a href="https://t.co/EVhi7J2e8K">pic.twitter.com/EVhi7J2e8K</a></p>&mdash; Felix Schwarz (@felix_schwarz) <a href="https://twitter.com/felix_schwarz/status/803955728583168004?ref_src=twsrc%5Etfw">November 30, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> </li> <li><strong>Apple Watch:</strong> Apple sells no USB-C charging cable for the Apple Watch. <p><blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr">Remember Apple Watch? Yeah, Apple neither. <a href="https://twitter.com/hashtag/NoUSBCtoAppleWatch?src=hash&amp;ref_src=twsrc%5Etfw">#NoUSBCtoAppleWatch</a> <a href="https://t.co/h4rlCuHabz">pic.twitter.com/h4rlCuHabz</a></p>&mdash; Felix Schwarz (@felix_schwarz) <a href="https://twitter.com/felix_schwarz/status/804261126330601472?ref_src=twsrc%5Etfw">December 1, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> </li> <li><p><strong>MagSafe: </strong>If you want to continue using your existing MacBook Pro chargers or the MagSafe connector on your Apple Cinema Display or Apple Thunderbolt Display, you’re out of luck. Apple owns the patent and doesn’t make an adapter.<br>Would it really have killed Apple if they had made a MagSafe to USB-C adapter? Just like the <a href="http://www.apple.com/shop/product/MD504LL/A/magsafe-to-magsafe-2-converter" rel="noopener" target="_blank">$10 MagSafe to MagSafe 2 converter</a> they made in 2012? Apparently so.</p> <p style="text-align: center;"> <img src="/blog/2017/01/images/macbookpro-2016-magsafe-2-adapter~b7254da40562ef71b3e9861612526cf5fd9a90dc.jpg" class="responsive"> <small>Apple MagSafe to MagSafe 2 Converter</small> </p> </li> <li><strong>Docks</strong>: <a href="http://www8.hp.com/us/en/workstations/zbook-dock.html" rel="noopener" target="_blank">HP</a>, <a href="https://www.microsoft.com/en-us/mobile/accessory/hd-500/" rel="noopener" target="_blank">Microsoft</a>, <a href="http://www.dell.com/support/Article/de/de/debsdt1/SLN301105/EN" rel="noopener" target="_blank">Dell</a> and other computer makers offer USB-C and/or Thunderbolt 3 docks for their devices. Apple doesn’t.<br>I find this to be a <em>major</em> missed opportunity, as it would really have eased the transition to Thunderbolt 3/USB-C, driven home the advantages of the new ports and provided an Apple-supported (and therefore worry-free) docking solution right from the start.<br>Instead, Apple got a lot of bad press and the #DongleLife hashtag. And Apple’s customers? A ton of products with “sponsored” 5-star reviews and unclear compatibility to choose from. What a shit show. </li> </ul> <h4>The Touch Bar with Touch ID</h4> <p>One constant that has defined hardware keyboards to date is that keys never change position and provide haptic feedback to confirm the position of keys as well as the actual press of a key.</p> <p>Together, both allow us to build muscle memory and type reliably at high rates without looking at the keyboard.</p> <p>All that changes with the Touch Bar: it replaces the top row function keys with a touchscreen strip on which “keys” dynamically change position and only provide visual (if any) feedback about the status of a press.</p> <p>In actual use, I found this to lead to a number of issues:</p> <h5>The Escape key</h5> <p>At first sight, there is no issue: whenever I wanted to press the Escape key, the Touch Bar displayed it — and hitting the spot where the Escape key had previously been would be recognized correctly. So far so good.</p> <p>But in practice, the absence of <em>any</em> haptic confirmation was a major issue: more than a few times, I found myself immediately question if I had hit the right spot or if my touch was properly recognized whenever there was no <em>immediate</em> response from the currently used app (hello Xcode!).</p> <p>I can see two ways for Apple to address this (and I hope Apple will eventually implement both):</p> <ul> <li>in software: by offering acoustic feedback for Touch Bar key presses, similar to how iOS provides it if you press a key on its on-screen touch keyboard. Possibly playing different sounds for particular function keys. Making it a system-wide option, but also providing (audio/video) apps with an API to opt-out of feedback sounds.</li> <li>in hardware: add a Taptic Engine to the Touch Bar to provide actual haptic feedback.</li> </ul> <h5>Cognitive Footprint</h5> <p>One of the key insights that I got from working on <a href="https://www.iospirit.com/products/remotebuddy/" rel="noopener" target="_blank">remote control software</a> for various input devices <a href="https://www.iospirit.com/blog/2016/06/10-years-of-Remote-Buddy" rel="noopener" target="_blank">for over 10 years</a> now is that second screens seldom make good input devices.</p> <p>By presenting input elements on and moving interactions to a second screen, users have to</p> <ol> <li>move their eyes from the main screen to the second screen</li> <li>visually and mentally parse the second screen contents</li> <li>decide if and which interaction to make</li> <li>move their eyes back to the main display</li> <li>visually and mentally re-parse the main screen contents</li> </ol> <p>Compare that to simply pressing a key or performing a gesture.</p> <p>The <em>cognitive footprint</em> of <em>direct</em> second screen interactions is <em>significantly</em> higher than that of <em>indirect</em> interactions.</p> <p>And the Touch Bar is no exception to this. With possible touch targets distributed over an area almost the full width of the keyboard, I found the cognitive footprint to be particularly high as my eyes often had to wander horizontally across it.</p> <p>As far as productivity is concerned, the Touch Bar has been a regression for me as frequent tasks like adjusting volume or brightness took longer than before while a dynamically updating Touch Bar at the border of my field of view could quickly become distracting visual noise.</p> <p>On the flip side, for the demographic of users who <em>always</em> look at the keyboard while typing, the experience they get may be vastly different and more comparable to typing on an iOS device.</p> <p>Also, Touch ID — which I found to be a really useful addition — relies on the Touch Bar’s display as an integral part of its interface. Which could very well be the reason the Touch Bar exists at all.</p> <p>So, not everything is bad about the Touch Bar. In fact, I find it to be full of good ideas. But it’ll need more focus and refinements to unlock its full potential.</p> <p>Just like the first Apple Watch, which started as a good idea, was <em>very</em> compelling on paper, underwhelming in actual use, but became really useful and delighting after a major software overhaul.</p> <p>I want one in my next MacBook Pro.</p> <h5>More Touch Bar and Touch ID tidbits</h5> <ul> <li>The Touch Bar uses a Retina-grade display, but what it displays often looks surprisingly blurry. It’s unclear to me whether this is a hardware or software issue. <p><blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr">Touch Bar looks a bit blurry in real life. Notice the purple/green fringes on left/right of white. Bad subpixel AA, or inevitable from OLED? <a href="https://t.co/24kiUpW72C">pic.twitter.com/24kiUpW72C</a></p>&mdash; Marco Arment (@marcoarment) <a href="https://twitter.com/marcoarment/status/799706969825112065?ref_src=twsrc%5Etfw">November 18, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> </li> <li>The Touch Bar uses an OLED display that is on most of the time. How susceptible is it to <a href="https://en.wikipedia.org/wiki/Screen_burn-in" rel="noopener" target="_blank">screen burn-in</a>? What options will Apple offer during and after warranty?</li> <li>While Touch ID itself worked well, the button itself felt too loose for a premium Apple product. According to <a href="https://www.fujivsfuji.com/fuji-views/returning-my-2016-macbook-pro" rel="noopener" target="_blank">this blog</a>, the Touch ID button should in fact stay in place — and Apple has developed a “<a href="https://www.fujivsfuji.com/fuji-views/returning-my-2016-macbook-pro" rel="noopener" target="_blank">2016 MacBook Pro shim kit</a>” to address the issue on affected machines.</li> <li><a href="http://www.macworld.com/article/3142362/hardware/macbook-pro-teardown-reveals-pointless-speaker-grilles-and-hard-to-replace-touch-bar.html" rel="noopener" target="_blank">According to MacWorld</a>, the Touch ID sensor is paired with the logic board’s Apple T1 chip at the factory level, so that it is unclear if replacing the Touch ID button also requires an enterily new logic board.<br>Again, it would be good to know in advance what options Apple will offer during and after warranty, should the need for a Touch ID button replacement arise.</li> <li>The Touch Bar — as of macOS 10.12.2 — often exhibited what looked like a (software) refresh problem, where it suddenly would only display areas that were recently updated — and remain black otherwise.<br>One easy solution to this is to set up the Fn key so that it shows the old function keys (in System Preferences &gt; Keyboard). Pressing and releasing the Fn key then always restored the full contents for me. <p><blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr">My old keyboard never did this. <a href="https://t.co/lfDnUt2y5n">pic.twitter.com/lfDnUt2y5n</a></p>&mdash; Friedrich Markgraf (@fzwob) <a href="https://twitter.com/fzwob/status/815864821400866817?ref_src=twsrc%5Etfw">January 2, 2017</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> </li> </ul> <h4>The Keyboard</h4> <p>Like a good album, the new keyboard needed some time to grow on me. Being different than anything I had previously used, I was very sceptical at first. It just felt too clicky. But a few weeks of actual use later, it has really won me over.</p> <p>Not a big deal for me, but still noteworthy for a product from a company that aspires perfection as much as Apple: the keys are nicely illuminated at the center, but brightness noticeably degrades towards the edges (look at the “command” key, “alt” and the “@” on the L key).</p> <p style="text-align: center;"> <img src="/blog/2017/01/images/macbookpro-2016-uneven-lighting-keyboard~28ae4ca5ab7e052f0b8da6ad192b2e39a412f96d.jpg" class="responsive"> <small>Unevenly distributed key backlight on the new MacBook Pro 2016. Left: original iPhone photo. Right: with increased contrast.</small> </p> <h4>The Trackpad</h4> <p>The trackpad on this machine is huge! Its palm rejection is solid — and Apple has really mastered simulating the haptics and sound of a button without one actually existing. After a few weeks, it sounded and felt nicer to me than what I had before.</p> <p>But “pressing” the button with one finger and using two additional fingers to perform a scroll gesture just didn’t work most of the time. This <em>does</em> work reliably on my MacBook Pro 2012, where I use this technique to select big chunks of text or scroll to the right position in a table view before dropping a file onto it.</p> <p>Apple can most likely address this in software, but as things stand today, it is confusing and makes me less productive.</p> <h4>Battery Life</h4> <p>In the past, Apple used to under-promise and over-deliver when it comes to battery life. Not this time.</p> <p>Specified with up to 10 hours of battery life, I typically only got between 3 to 4 hours off the grid.</p> <p>Which is about the time I get from my 2012 MacBook Pro and its four year old battery.</p> <h4>Front Camera</h4> <p>#ShotOnMac is not a campaign Apple should be running any time soon unless it wants to publicly embarrass itself. Trying the front camera of the MacBook Pro 2016, I still got the same blurry picture as on my MacBook Pro 2012.</p> <p>While Apple has shown it can make really decent front cameras — the iPhone 6S ships with a 5 MP and the iPhone 7 with a 7 MP front camera — the MacBook Pro’s remains stuck at 0.9 MP (720p).</p> <p>But things could be worse: the Retina MacBook ships with a 0.3 MP (480p) camera — <a href="https://en.wikipedia.org/wiki/ISight#Design" rel="noopener" target="_blank">like it’s still 2003</a>.</p> <h4>Security</h4> <p>My MacBook Pro <a href="http://www.theverge.com/2013/12/29/5253226/nsa-cia-fbi-laptop-usb-plant-spy" rel="noopener" target="_blank">curiously</a> shipped with System Integrity Protection turned off — and to date, Apple has not offered any public explanation for this.</p> <p>I also noticed that, if you use the pre-installed copy of macOS, the Migration Assistant will only <em>mention</em> the existence of FileVault full-disk encryption <em>after</em> transferring your data, but not even offer to turn it on. Due to the way SSDs work, turning on FileVault <em>after</em> migration does not guarantee that there won’t be an unencrypted copy of your data still around. So this is bad.</p> <p>Since these days you have <a href="http://www.theverge.com/2013/12/29/5253226/nsa-cia-fbi-laptop-usb-plant-spy" rel="noopener" target="_blank">good reasons</a> to not trust a pre-installed OS copy, you can address both security issues at once by <a href="https://support.apple.com/en-us/HT201314" rel="noopener" target="_blank">using Internet Recovery</a> to</p> <ol> <li>check your SIP status:<br>$ csrutil status<br>System Integrity Protection status: [enabled|disabled].</li> <li>enable SIP if it is disabled:<br>$ csrutil enable</li> <li>Erase your new MacBook Pro’s SSD using Disk Utility</li> <li>Reinstall macOS from Internet Recovery</li> </ol> <p>That’s what I did and — much to my surprise — this time I was offered to enable FileVault right away and <em>before</em> the migration of any of my data started.</p> <h4>Known issues</h4> <p>If you plan using Windows on your new MacBook Pro 2016, watch out for a Bootcamp driver issue that reportedly can cause <a href="http://appleinsider.com/articles/16/11/21/boot-camp-windows-driver-issue-may-be-damaging-new-macbook-pro-speakers" rel="noopener" target="_blank">permanent damage</a> to the MacBook Pro’s speakers.</p> <p>There are <a href="http://forums.macrumors.com/threads/psa-the-2016-mbp-is-prone-to-the-same-rattling-display-bug-as-previous-models.2012655/" rel="noopener" target="_blank">reports</a> of unexpected rattling sounds like this:</p> <p><blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr">MacBooks Pro: A Tale Of Rattling. <a href="https://t.co/FddQcrDqHc">pic.twitter.com/FddQcrDqHc</a></p>&mdash; Daniel Kennett (@iKenndac) <a href="https://twitter.com/iKenndac/status/816009264640720896?ref_src=twsrc%5Etfw">January 2, 2017</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <h4>Upgradeability</h4> <h5>Value</h5> <p>For years, two of the biggest achievements of Apple’s Unibody design were its durability and making upgrades so easy Apple included printed <a href="https://support.apple.com/en-us/HT201165" rel="noopener" target="_blank">upgrade instructions</a> alongside the computer.</p> <p>The ability to quickly upgrade RAM and HDD with off-the-shelf components and a standard screwdriver meant that your machine had <em>room to grow with your needs</em> and promised to deliver <em>value beyond the originally purchased configuration</em>.</p> <h5>From computers to appliances</h5> <p>In 2012, Apple started to depart from this upgrade-friendly path as it began transitioning Macs from computers to appliances.</p> <p>The first generation of the Retina MacBook Pro (2012–2015) introduced Mac users to the concept of RAM soldered onto the logic board, <a href="https://en.wikipedia.org/wiki/Pentalobe_security_screw" rel="noopener" target="_blank">pentalobe screws</a> on the bottom case and SSDs in sockets with non-standard pin configurations.</p> <p>The second generation of Retina MacBook Pros (2016-?) now completes the transition to appliances by also soldering the SSD onto the logic board, eliminating the last user-upgradeable part.</p> <h5>Physics?</h5> <p>One could argue that Apple had no other choice. That in an increasingly slim form-factor, there first was not enough space for RAM sockets — and then a socketed SSD. Physics!</p> <p>Yet the 13&quot; MacBook Pro 2016 <em>without</em> Touch Bar has the same dimensions as the version <em>with</em> Touch Bar, but <a href="https://www.ifixit.com/Teardown/MacBook+Pro+13-Inch+Function+Keys+Late+2016+Teardown/72415" rel="noopener" target="_blank">ships with a socketed SSD</a> and a higher-capacity battery.</p> <p>Regardless the true reason, the move to soldering all components onto the logic board diminishes the new MacBook Pro’s <em>value</em> through a combination of higher prices and shorter upgrade cycles prompted by a lack of upgradeability.</p> <p><blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr">2010: Apple is a great software and hardware company.<br><br>2013: Apple is a great hardware company.<br><br>2016: Apple is a company.</p>&mdash; Evan Coleman (@edc1591) <a href="https://twitter.com/edc1591/status/814624552089219073?ref_src=twsrc%5Etfw">December 30, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <h4>What I liked</h4> <p>Next to the new keyboard, Touch ID, four Thunderbolt 3 ports and faster SSD there’s a lot more to like about the new MacBook Pros:</p> <h5>GPU performance</h5> <p>The Radeon 460 in the 2016 MacBook Pro really delivered on its promise of being 2.85 times faster than the 2012 MacBook Pro’s GPU. Everything graphics-related felt a lot snappier and stutter was almost completely absent from Mission Control animations.</p> <p>Although I still “prefer” the Cinema Display (so I can easily test my apps in standard <em>and </em>Retina resolutions), I found the idea of being able to drive up to four 4K or two 5K displays in the future to be very compelling.</p> <h5>Cooler, quieter operation</h5> <p>Even under a fair amount of load, the MacBook Pro 2016 stayed much cooler and the fans almost never came on.</p> <h5>Better speakers</h5> <p>The new speakers are <em>significantly</em> better than those of the MBP 2012.</p> <h5>Better display</h5> <p>Thanks to wide color support, colors really pop on the new displays.</p> <h5>Conclusion</h5> <p>The new MacBook Pro is the first substantial update to the line in over four years and stuffed with new and improved technology. I was really tempted to keep mine, but just couldn’t make my peace with it.</p> <p>Xcode performance gains were too small and I realized my next Mac really <em>needs</em> to have 32 GB of RAM, not 16 GB, if I want to keep using it for four years. And then there’s the steep price. The lack of any post-purchase upgrade paths. Pretty much everything now soldered onto the logic board. Unclear costs for repairs. The amount of new components that need more work (Touch Bar, Trackpad) — or could turn out to be faulty in a few months.</p> <p>Regarding the latter: remember <a href="https://9to5mac.com/2013/03/20/macbook-pro-with-retina-display-problems-in-every-dimension/" rel="noopener" target="_blank">the early issues of the first Retina MacBook Pro</a>? It took Apple <a href="http://www.macrumors.com/2015/10/17/apple-mbp-ar-coating-quality-program-staingate/" rel="noopener" target="_blank">three years</a> to <em>internally </em>recognize <em>all</em> issues of the Samsung and LG displays they originally shipped. And it took me persistence, time and repeated visits to different Apple Stores and Apple Authorized Resellers to get two display replacements over the span of four years — finally arriving at a <a href="https://twitter.com/felix_schwarz/status/809385234743623680" rel="noopener" target="_blank">good display</a> that isn’t susceptible to <a href="https://9to5mac.com/2013/03/20/macbook-pro-with-retina-display-problems-in-every-dimension/" rel="noopener" target="_blank">ghosting</a> or <a href="http://www.staingate.org/" rel="noopener" target="_blank">stain</a>. I’m just not keen on repeating this experience.</p> <p>Arriving at the conclusion that the new MacBook Pro couldn’t provide me with the value I was seeking in it — and having been burnt badly the last time I bought a first generation product from Apple, I returned the new MacBook Pro.</p> <p>Within the next 1–2 years, Intel should ship mobile CPUs suitable for a MacBook Pro with 6 cores and support for at least 32GB of much faster and more power-efficient LPDDR4 RAM. Together with even faster GPUs, this should deliver a big performance boost and finally make for a worthy (or even irresistible?) upgrade.</p> <p>Until then, Apple should have fixed remaining software issues of the Touch Bar and Trackpad, have addressed any known manufacturing issues, possibly have <a href="https://www.bloomberg.com/news/articles/2016-12-20/how-apple-alienated-mac-loyalists" rel="noopener" target="_blank">finished work on a higher-capacity battery</a> or even — and I know this sounds crazy — ship socketed, upgradeable SSDs again. By then, we should also know if the Touch Bar’s OLED display is susceptible to burn-in and if it can be replaced independently of the logic board — or not.</p> <p>Knowing I likely won’t buy a new machine for at least another year, I decided to replace my old MacBook Pro’s worn out 256 GB SSD — and am since enjoying the space and better performance of a new <a href="http://amzn.to/2iPtJcY" rel="noopener" target="_blank">480GB SSD</a>:</p> <blockquote class="twitter-tweet tw-align-center" data-lang="en"><p lang="en" dir="ltr">After a few weeks with the new MBP and waaay too much time spent thinking about it, I decided to return it and upgrade my MBP 2012 instead. <a href="https://t.co/s1aWnvDef5">pic.twitter.com/s1aWnvDef5</a></p>&mdash; Felix Schwarz (@felix_schwarz) <a href="https://twitter.com/felix_schwarz/status/811483400653733888?ref_src=twsrc%5Etfw">December 21, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script> <p>Not having access to a hardware Touch Bar is a bit of concern for me. But I figure that, should Apple think it is a relevant part of the Mac experience, Apple should be shipping a new keyboard with Touch Bar (and possibly even Touch ID) alongside refreshed iMacs in a couple of months.</p> <p><em>Enjoyed reading this? </em><a href="https://www.twitter.com/felix_schwarz" rel="noopener" target="_blank"><em>Follow me on Twitter</em></a><em> for more.</em></p> <h4>Further reading</h4> <ul> <li><strong>Michael Tsai</strong>: <a href="http://mjtsai.com/blog/2016/10/27/new-macbook-pros-and-the-state-of-the-mac/" title="Permanent Link: New MacBook Pros and the State of the Mac" rel="bookmark noopener" target="_blank">New MacBook Pros and the State of the Mac</a></li> <li><strong>iPhonedo</strong>:<a href="https://www.youtube.com/watch?v=zRIQypuceBI" rel="noopener" target="_blank"> MacBook Pro 2016 w/ Touch Bar — Why I Returned It — In-Depth Review and Comparisons</a> (YouTube video)</li> <li><strong>Fuji vs. Fuji</strong>: <a href="https://www.fujivsfuji.com/fuji-views/returning-my-2016-macbook-pro" rel="noopener" target="_blank">Returning my MacBook Pro</a></li> <li><strong>Mac Performance Guide</strong>: <a href="https://macperformanceguide.com/blog/2016/20161122_1640-Apple2016MacBookPro-returning.html" rel="noopener" target="_blank">2016 MacBook Pro: Return It and Stick With 2013 Model?</a></li> <li><strong>Curtis Herbert</strong>: <a href="https://blog.curtisherbert.com/13-vs-15-macbook-a-developers-perspective-in-2016/" rel="noopener" target="_blank">13&quot; vs 15&quot; MacBook Pro: A Developer’s Perspective in 2016</a></li><li><strong>Ars Technica</strong>: <a href="http://arstechnica.com/apple/2016/12/explaining-the-battery-life-problems-with-the-new-macbook-pros/" rel="noopener" target="_blank">Explaining the battery life problems with the new MacBook Pros</a></li> </ul> 2017-01-04T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2017/01/on-the-macbook-pro-2016-and-why-i-returned-mine Using letsencrypt with nginx to obtain, install and automatically renew SSL/TLS certificates <p>After not having been able to log into StartSSL’s interface for two days and the expiry of an important SSL/TLS certificate looming, I looked into letsencrypt again and found an easy way to make it work with nginx for all my domains. Here’s what I did:</p> <h4>Prepare nginx</h4> <p>To verify that you’re actually running the server behind www.example.com, letsencrypt needs the ability to put a file on your web server, so that the Letsencrypt CA can subsequently download it and establish your identity. These files all need to be reachable below <code>http://www.example.com/.well-known/acme-challenge/[cryptographic-filename]</code></p> <p>Instead of creating a bunch of new directories for this, I’m creating just one and then route traffic below <code>/.well-known</code> to that directory for all domains that I want to request a SSL/TLS certificate for:</p> <div class="code-box wraps">mkdir /etc/nginx/letsencrypt/webroot</div> <p>I then create an include file for my nginx configurations at <code>/etc/nginx/includes/letsencrypt.include</code> with this contents:</p> <div class="code-box wraps">location /.well-known {        default_type "/text/plain";        root /etc/nginx/letsencrypt/webroot; }</div> <p>Now, I can simply add</p> <div class="code-box wraps">include includes/letsencrypt.include;</div> <p>to the configuration of the servers I want to request a letsencrypt-certificate for:</p> <div class="code-box wraps">server {        listen 80;        server_name www.example.com, example.com;        include includes/letsencrypt.include;        # Your server specific configuration here }</div> <p>Finally, I tell nginx to reload the configuration:</p> <p><div class="code-box wraps">/etc/init.d/nginx reload</div></p> <h4>Install letsencrypt</h4> <p>This is pretty straightforward. Change to the directory you want to install letsencrypt in, then clone the git repository and change into the directory:</p> <div class="code-box wraps">git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt</div> <p>Now I can start requesting certificates using:</p> <div class="code-box wraps">./letsencrypt-auto certonly -a webroot --webroot-path=/etc/nginx/letsencrypt/webroot --rsa-key-size=4096 --agree-tos -d www.example.com -d example.com</div> <p>If everything works, you’ll now find private key, certificate and certificate chains in <code>/etc/letsencrypt/live/www.example.com/</code>.</p> <h4>Adding the certificate to your configuration </h4> <p>To use the letsencrypt certificate, point <code>ssl_certificate</code>, <code>ssl_trusted_certificate</code> and <code>ssl_certificate_key</code> to the respective files.</p> <p>Here’s a sample configuration for example.com with <a href="https://wiki.mozilla.org/Security/Server_Side_TLS">safe ciphers</a> and OCSP stapling:</p> <p><div class="code-box wraps">server { listen 443 ssl http2;       server_name www.example.com, example.com; ssl on; ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/www.example.com/chain.pem; ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-S$ ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_tickets on; ssl_session_timeout 10m; # Your server specific configuration here }</div></p> <h4>Renew certificates in time</h4> <p>This is my favorite part about letsencrypt. Issued certificates expire 90 days after issuance, but the great folks at letsencrypt have made checking certificates for expiration and renewing them in time trivially simple:</p> <div class="code-box wraps">./letsencrypt-auto renew</div> <p>That’s all! No adding expiry reminders to the calendar, no issues with unavailable or slow web interfaces, no time wasted waiting for emails with verification codes. <i>Finally!</i> If you want to run this via cron, don’t forget to pair it with</p> <div class="code-box wraps">/etc/init.d/nginx reload</div> <p>so that nginx can pick up updated certificates.</p> <h4>Alternatives</h4> <p> If you can't or don't want to install software on your server, you can also obtain a letsencrypt certificate through <a href="https://gethttpsforfree.com/">this 3rd party web interface</a>. </p> 2016-04-17T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2016/04/using-letsencrypt-with-nginx-obtain-install-certificates 7 things I learnt creating an App Preview video for Apple TV <p>Between the initial release of <a href="https://www.iospirit.com/products/remotebuddy/display/">Remote Buddy Display</a> in November 2015 and the first update, Apple has added App Previews to the tvOS App Store: short videos, between 15 and 30 seconds in length, that allow potential new users to see an app in action before installing it.</p> <p>While I’m pretty happy with how the <a href="https://www.youtube.com/watch?v=PK_RNnRcR24">introductory video</a> for Remote Buddy Display turned out, it’s more than twice as long as the maximum permitted length for an App Preview video.</p> <p>So I accepted the challenge of the format and its constraints and jumped in. Here are a few things I learnt and thought about while creating the video:</p> <h4>1. App Previews on Apple TV are a big deal</h4> <p>First, literally, App Previews on tvOS are shown on what is probably the biggest screen in the home.</p> <p>Second, the way App Previews are integrated into the tvOS App Store differs greatly from the iOS App Store. If you add an App Preview to an iOS app, it’s poster frame dominates what people see of your app in search and on the app’s page in the App Store.</p> <p style="text-align: center;"> <img src="/blog/2016/04/images/ios-app-store-poster-frame~de0f2b041aa4473b21d997796d167fe088243839.jpg" class="responsive"> <small>Search result on the iOS App Store</small> </p> <p>On tvOS, App Previews are a much less risky proposition: the app’s icon continues to be shown in search — and the video does not occupy the place of the first screen shot.</p> <p>Instead, the poster frame of the App Preview now fills the right half of the page (blank otherwise) and a dedicated “Preview” button invites users to play the App Preview right away.</p> <p style="text-align: center;"> <img src="/blog/2016/04/images/app-store-listing~6e51d65897d09b1f806ae3e29e542d674264ec1b.png" class="responsive"> </p> <p>Third, the emphasis on paid content is stronger on the tvOS App Store: according to Apple data from early 2016, only 50% of tvOS apps can be downloaded for free (vs. 82% on iOS). That’s a good thing for indie developers, but I’d still expect users to hesitate before spending their dollars on an app they can’t try beforehand. A captivating App Preview, then, may be just what’s needed to convince them.</p> <p style="text-align: center;"> <img src="/blog/2016/04/images/app-store-catalog-by-business-model~ae30472153be64039e766fbe07cb292af529432a.png" class="responsive"> <small>iOS and tvOS App Store Catalogs by Business Model. Source: Apple TV Tech Talks</small> </p> <h4>2. Deciding on a storyboard & soundtrack early on helps immensely</h4> <p>When I do a new video for one of my apps, one of the first and most important things I do is to brainstorm what I want to show, bring these ideas into a logical order and — if possible — find a continuous stream of actions I can show.</p> <p>From this, I write a storyboard that contains all text titles, speech and scene contents in written form.</p> <p>Finally, I look for a soundtrack that fits the pace of the story I’m about to tell in my video.</p> <p>I found that writing a storyboard and deciding on a soundtrack early on really helps to keep production time to the minimum while making sure that the video I record fits the pace and special features of the background music.</p> <h4>3. Focus or die</h4> <p>At first, the 30 second limitation of App Previews gave me the horror. Now I appreciate it, because it rewards all the right things and discourages everything that might shy away new users.</p> <p>It forces me to focus. Focus on the best parts and meaningful interactions that best represent my app’s purpose.</p> <p>I simply don’t have the air time to show endless navigation through menu hierarchies. I need to get to the point. And fast. That’s a good thing.</p> <h4>4. Don’t layer text on top of video</h4> <p>In the past, I have often layered text on top of video to annotate and explain what is being shown. This can work well if what is shown takes long enough for the viewer to have a chance to both read the text and re-focus on and follow the action.</p> <p>In a 30 second video, however… forget it: the moment a viewer has completed reading the text, the action that’s been annotated has ended, too.</p> <p>So in the name of not letting anything happen concurrently in this video, I ended up alternating full screen text titles with video recorded from the Apple TV.</p> <p>The end result is just so much better.</p> <h4>5. Final Cut Pro X can animate Photoshop layers</h4> <p>When it comes to titling a video, my usual process is to create them with Keynote and export them as QuickTime file, which I then feed in Final Cut Pro X.</p> <p>This time, however, since I didn’t think I’d need any text transitions, I quickly threw some titles together in Photoshop and dropped the PSD files directly on Final Cut Pro X.</p> <p style="text-align: center;"> <img src="/blog/2016/04/images/final-cut-pro-x-photoshop-layers~1c632e060b481b1c0bd7312e2b79c2d2c27c3f4b.png" class="responsive"> </p> <p>Much to my surprise I found that Final Cut Pro X would turn every layer in the PSD file into a track of its own and allow me to apply transformations and transitions on them — just like with any other object.</p> <p>When I wanted one text transition later on, I could just create it right in Final Cut Pro X and skip Keynote entirely this time.</p> <h4>6. Keep the use of transitions and effects to a minimum</h4> <p>There is no shortage of wild, impressive transitions and effects in Final Cut Pro X and Keynote. Yet I have kept my use of transitions in the App Preview to a bare minimum (variations of simple cross fades, really).</p> <p>First, transitions eat time — and time is a particularly scarce resource in an App Preview video.</p> <p>Second, transitions and effects, if overused, can at best just be distracting — and at worst be damaging: after all, a beautiful frame around a bad photo doesn’t improve the photo. Instead it amplifies how bad the photo is.</p> <p>Or, put more positively™: if you have a great app, let is shine and speak for itself. Avoid ridiculing it through the overuse of transitions and effects.</p> <h4>7. The App Store adds a one-second transition at the beginning</h4> <p>Visiting Remote Buddy Display’s App Store page after the update went live, I noticed that the App Store had overlaid the first second with a transition: audio fades in slowly and the video fades in from black.</p> <p>As a result, the first full screen text title at the beginning of the video is only briefly visible, giving the video an abrupt start. It’s not a complete deal breaker, but I wish I had known of this beforehand.</p> <p>For the next update, I’ll account for this by inserting a second of silence and black at the beginning of the video.</p> <h4>Final thoughts</h4> <p>This is the first App Preview video I’ve made, and it will be interesting to see how and if it will affect the bottom line.</p> <p>However the result may look like, I’m already glad I made the video, because the process taught me some important lessons about making (hopefully) more impactful product videos.</p> <p>Here’s the result of roughly a day of work:</p> <div class="two-thirds-width" style="padding-top: 1rem;"> <div class="video-responsive wide"> <iframe width="854" height="480" src="https://www.youtube.com/embed/Mg5HZDbktHI?rel=0&showinfo=0" frameborder="0" allowfullscreen></iframe> </div> </div> 2016-04-05T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2016/04/7-things-I-learnt-creating-an-App-Preview-video-for-Apple-TV How to use the OS X 10.9 SDK with Xcode 7.3 <p>When Apple shipped Xcode 7, it decided to ship it only with the OS X 10.11 SDK. Unfortunately, this has since put developers of USB kernel extensions between a rock and a hard place.</p> <p>OS X 10.11 ships with a new USB stack and also took care of backward compatibility for both the kernel and user space APIs:</p> <blockquote> <b>OS X v10.11 Changes</b> <p>This article describes changes to USB in OS X v10.11.</p> <ul> <li><p>The USB stack is completely redesigned to increase stability and performance compared to Mac OS 10.10. Applications and third-party drivers for vendor-specific USB devices built with 10.10 SDK require no modification. </p></li><li><p>Applications that use IOUSBLib APIs should continue to work with no modification. IOKit drivers that use IOUSBDevice and IOUSBInterface APIs should continue to load and be functional with no regressions. </p></li><li><p>If you are developing a new IOKit driver that uses IOKIT USB APIs, please refer to the OS X v10.11 SDK for new API and classes such as IOUSBHostDevice and IOUSBHostInterface. New applications developed using the OS X v10.11 SDK should continue to use the IOUSBLib APIs.</p></li> <li><p>Different classes of USB devices should not exhibit any regression in functionality compared to the OS X v10.10 release.</p></li> </ul> </blockquote> <p><i>(Source: <a href="https://developer.apple.com/library/prerelease/mac/releasenotes/Darwin/RN_USB/Articles/10_11Changes.html#//apple_ref/doc/uid/TP40007739-CH3-SW1">Apple</a>, <a href="https://webcache.googleusercontent.com/search?q=cache:Ed1SaJyRUnQJ:https://developer.apple.com/library/prerelease/mac/releasenotes/Darwin/RN_USB/Articles/10_11Changes.html+&amp;cd=1&amp;hl=de&amp;ct=clnk&amp;gl=de">Google Cache</a>, <a href="https://twitter.com/felix_schwarz/status/661821443261538304">Tweet</a>)</i></p> <p>In essence, that means you can still write a USB kernel extension targeting older OS X releases and it will continue to just work™ under OS X 10.11, too.</p> <p>The OS X 10.11 SDK, however, lacks the needed header files for the old USB stack. And that’s why the OS X 10.9 SDK is still needed if you want to build these.</p> <p>Up until Xcode 7.2.1, this was as easy as copying the folder MacOSX10.9.sdk folder from Xcode 6.4 over into the Xcode 7.x application bundle.</p> <p>Not so in Xcode 7.3 – apparently because its MacOSX.platform contains a new key, specifically telling Xcode to ignore any SDKs prior to OS X 10.11.</p> <p><b>Here’s what I had to do to get Xcode 7.3 to work with the OS X 10.9 SDK:</b></p> <ol> <li><p>Quit Xcode 7.3.</p></li> <li><p>Copy</p><div class="code-box wraps">[Xcode6.4].app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk</div><p>to</p><div class="code-box wraps">/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/</div></li> <li><p>Open</p><div class="code-box wraps">/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist</div><p>and remove these two lines:</p><div class="code-box wraps"> &lt;key&gt;MinimumSDKVersion&lt;/key&gt;<br> &lt;string&gt;10.11&lt;/string&gt;</div></li> </ol> 2016-03-22T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2016/03/how-to-use-the-os-x-109-sdk-with-xcode-73 Symbolicating OS X panic logs <p> I was in need of symbolicating an OS X kernel panic.log and consulting Apple's <a href="https://developer.apple.com/library/mac/technotes/tn2063/_index.html">TN2063 (Understanding and Debugging Kernel Panics)</a> to do that, when I realized that Apple had last updated this document in 2008: kextload would complain about paramters it no longer knows about, gdb no longer ships with Xcode and the Kernel Debug Kits for more recent OS X releases neither include the referenced tools nor is their layout compatible with what that TechNote expects. </p> <p> In other words: if you want to symbolicate a recent kernel panic log, that TechNote - which used to be a great resource for that purpose - is no longer of any help; you're on your own. </p> <p> So, after some research, I'd like to share with you how I managed to symbolicate an OS X 10.11 panic log by hand using lldb and the kernel debug kit for 10.11: </p> <ol> <li>If you haven't already done so, download the kernel debug kit for the OS X release the panic occured on from <a href="https://developer.apple.com/downloads/">https://developer.apple.com/downloads/</a> and install it. That will add a kernel debug kit for that OS X release to /Library/Developer/KDKs/.</li> <li>Open Terminal.app and start an interactive lldb session with the kernel image of the KDK you just installed (all in one line): <div class="code-box">$ lldb /Library/Developer/KDKs/KDK_10.11_15A284.kdk/System/Library/Kernels/kernel</div> </li> <li>LLDB will inform you that 'kernel' contains a debug script and provides instructions to add these to the current session. Add them to the session. <div class="code-box wraps">(lldb) target create "/Library/Developer/KDKs/KDK_10.11_15A284.kdk/System/Library/Kernels/kernel" warning: 'kernel' contains a debug script. To run this script in this debug session: command script import "/Library/Developer/KDKs/KDK_10.11_15A284.kdk/System/Library/Kernels/kernel.dSYM/Contents/Resources/DWARF/../Python/kernel.py" To run all discovered debug scripts in this session: settings set target.load-script-from-symbol-file true Current executable set to '/Library/Developer/KDKs/KDK_10.11_15A284.kdk/System/Library/Kernels/kernel' (x86_64). (lldb) <strong>settings set target.load-script-from-symbol-file true</strong></div></li> <li>The kexts included in the backtrace are listed under "Kernel Extensions in backtrace" along with their addresses. Let's add them next, using this as a template: <div class="code-box wraps">(lldb) addkext -F <strong>[PathTo.Kext]</strong>/Contents/MacOS/<strong>[KextExecutable]</strong> <strong>[KextLoadAddress]</strong></div> The [KextLoadAddress] is the start address that is included after the @ sign. Example: <div class="code-box wraps">(lldb) addkext -F /Library/Extensions/My.kext/Contents/MacOS/My 0xffffff7f80d51000</div> </li> <li>We can now look up the symbol for any address by feeding the return address (on the right side of the colon) into <div class="code-box wraps">(lldb) image lookup -a <strong>[ReturnAddress]</strong></div> Example: <div class="code-box wraps">(lldb) image lookup -a 0xffffff7f80d536f5</div> </li> </ol> <p> I'm pretty sure there are better ways to use lldb to symbolicate a panic.log, but it's the only I could find for now. If you know about a more efficient way, please don't hesitate to post it in the comments. </p> 2015-10-05T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2015/10/symbolicating-os-x-panic-logs Calculating sunrise and sunset times without Core Location <p>I looked for a way to support day and night modes in an upcoming iOS app I’m working on. It is an integral part of the user experience, so ideally, it should “just work” - without requiring any steps on the part of the user.</p> <h4>Core Location</h4> <p>Core Location would prompt and require users to share their precise location (whereas an approximation would do). It also would need access to GPS and/or the Internet. That’s too many moving parts for it to “just work”.</p> <h4>GeoIP</h4> <p>I could put together a web service that tries to geo-locate users by their IP. However, I would not feel comfortable doing so without asking users for their consent first. It would also require an internet connection. In the end, it would be a lot like Core Location - just not as good. Which kind of makes this option ridiculous.</p> <h4>NSTimeZone</h4> <p>This may seem silly at first since places on the northern and southern hemisphere can share the same time zone, yet have very different sunrise and sunset times.</p> <p>Time zones on iOS, however, usually take the form of “Continent/City” (f.ex. “Europe/Berlin”) and not “GMT+1”. Plus, with default settings, iOS automatically selects and updates the correct time zone based on your actual location. Bingo!</p> <p>Unfortunately, while NSTimeZone provides the name of a timezone, it does not offer any location information.</p> <p>So I wrote a category to fill this gap. Based on data from the IANA Time Zone Database, <a href="https://github.com/iospirit/NSTimeZone-ISCLLocation">NSTimeZone+ISCLLocation</a> provides CLLocation and ISO 3166 country codes for location-based time zones under iOS and OS X.</p> <p>Here’s how it works:</p> <script src="https://gist.github.com/felix-schwarz/b58aa4d37eb3cee5de87.js"></script> <p>In my upcoming app, I'm using the returned location with <a href="https://github.com/BigZaphod/CLLocation-SunriseSunset">CLLocation-SunriseSunset</a> to calculate sunrise and sunset times. In cases where a location is not available, I use Core Location as a backup solution.</p> <p>You can find <a href="https://github.com/iospirit/NSTimeZone-ISCLLocation">the NSTimeZone+CLLocation repository on GitHub</a>.</p> <p>Enjoy!</p> 2015-03-31T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2015/03/calculating-sunrise-sunset-without-core-location Resolving symbols in a sample log from Activity Monitor <p>Often bugs don't crash an application right away but merely lead to it becoming unresponsive or "hanging".</p> <p>When I'm approached with such issues in my software, the first thing I ask for is a sample log obtained through Activity Monitor.</p> <p>Because the public builds of my software don't contain any debug symbols, I only see <em>??? </em>and a code offset for those spots that reference my code.</p> <p>There are <a href="http://www.acqualia.com/other/developer-tools" target="_blank">tools</a> and <a href="http://www.hockeyapp.net/" target="_blank">services</a> out there to symbolicate crash reports, but I'm not aware of anything such for sample logs, which have a different format.</p> <p>So here's what I do to resolve symbols in sample logs that I receive.</p> <p>Let's start with a sample log:</p> <div class="code-box wraps">Sampling process 3812 for 3 seconds with 1 millisecond of run time between samples Sampling completed, processing symbols... Analysis of sampling Remote Buddy (pid 3812) every 1 millisecond Process: Remote Buddy [3812] Path: /Applications/Remote Buddy.app/Contents/MacOS/Remote Buddy <strong>Load Address: 0x1000</strong> Identifier: com.iospirit.RemoteBuddy Version: 1.25 (1.25) <strong>Code Type: X86</strong> [..] <strong>Call graph:</strong> 2568 Thread_3519212 DispatchQueue_1: com.apple.main-thread (serial) + 2568 ??? (in Remote Buddy) load address 0x1000 + 0x1315 [<strong>0x2315</strong>] + 2568 ??? (in Remote Buddy) load address 0x1000 + 0x13ee [<strong>0x23ee</strong>] + 2568 ??? (in Remote Buddy) load address 0x1000 + 0x1548 [<strong>0x2548</strong>] [..] Binary Images: <strong>0x1000</strong> - 0x1edfe7 +com.iospirit.RemoteBuddy (1.25 - 1.25) &lt;<strong>B7BE5172-CEBA-3128-3805-4F81A1FCCA21</strong>&gt; /Applications/Remote Buddy.app/Contents/MacOS/Remote Buddy </div> <p>To resolve the symbols, I need the dSYM that was created alongside the build this sample was taken from. Each dSYM and app share a unique UUID. Here, it's <em>B7BE5172-CEBA-3128-3805-4F81A1FCCA21</em>.</p> <p>To verify that you're using the correct dSYM, you can print the UUID of your dSYM using <em>dwarfdump --uuid</em> on the DWARF file in your dSYM:</p> <div class="code-box wraps">xcrun dwarfdump --uuid "Remote Buddy.app.dSYM/Contents/Resources/DWARF/Remote Buddy"</div> <p>If your dSYMs were indexed by Spotlight, you can also search for the UUID in Spotlight to find the dSYM corresponding to the sample log you received.</p> <p>Using the <em>Code Type</em>, the <em>Load Address</em> and the code offsets in the <em>Call graph</em>, I can now take to the Terminal to resolve the numbers into symbols.</p> <p>For a <em>Code Type</em> of <em>x86</em>, the <em>Architecture</em> is <em>i386</em>, for a <em>Code Type</em> of X<em>86-64, </em>the architecture is<em> x86_64</em>.</p> <p>To open an interactive prompt, I type</p> <div class="code-box wraps">atos -arch [Architecture] -o [DWARF file] -l [Load Address]</div> <p>or</p> <div class="code-box wraps">atos -arch i386 -o "Remote Buddy.app.dSYM/Contents/Resources/DWARF/Remote Buddy" -l 0x1000</div> <p>in this example. I can then enter code offsets to resolve them into symbols:</p> <div class="code-box wraps">felix $<strong> atos -arch i386 -o "Remote Buddy.app.dSYM/Contents/Resources/DWARF/Remote Buddy" -l 0x1000</strong> got symbolicator for Remote Buddy.app.dSYM/Contents/Resources/DWARF/Remote Buddy, base address 1000 <strong>0x2315</strong> start (in Remote Buddy) + 41 <strong>0x23ee</strong> _start (in Remote Buddy) + 216 <strong>0x2548</strong> main (in Remote Buddy) (main.m:79) </div> <p>Press Ctrl+C to exit the interactive prompt.</p> <p>And that's it!</p> 2014-08-15T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2014/08/resolving-symbols-in-activity-monitor-sample-log How to build on 10.8 and earlier, then sign for and submit to the Mac App Store on 10.9 <p>Two days ago, Apple updated its <a href="https://developer.apple.com/library/prerelease/mac/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG205" target="_blank">Technote 2206</a> with a new paragraph on <a href="https://developer.apple.com/library/prerelease/mac/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG205" target="_blank">changes in OS X 10.9.5 and Yosemite DP5</a>:</p> <blockquote> Beginning with OS X version 10.9.5, there will be changes in how OS X recognizes signed apps. Version 1 signatures created with OS X versions prior to Mavericks will no longer be recognized by Gatekeeper and are considered obsolete. </blockquote> <p>Apple further emphasizes:</p> <blockquote> Important: For your apps to run on updated versions of OS X they must be signed on OS X version 10.9 or later and thus have a version 2 signature. </blockquote> <p>Apple also suggests what you can do if you build on older versions of OS X and distribute outside the Mac App Store:</p> <blockquote> If your team is using an older version of OS X to build your code, re-sign your app using OS X version 10.9 or later using the <code>codesign</code> tool to create version 2 signatures. Apps signed with version 2 signatures will work on older versions of OS X. </blockquote> <p>Pretty straightforward. Now what about apps on the Mac App Store?</p> <blockquote> If your app is on the Mac App Store, submit your re-signed app as an update. </blockquote> <p>Does that mean that Mac App Store apps submitted with a v1 signature will stop working on 10.9.5 and later?</p> <p>I quickly ran some tests:</p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/danielpunkass?ref_src=twsrc%5Etfw">@danielpunkass</a> Just tested with a MAS application built and submitted on OS X 10.6.8: installed &amp; launched w/o problems. Non-MAS/GK: failed.</p>&mdash; Felix Schwarz (@felix_schwarz) <a href="https://twitter.com/felix_schwarz/status/496380618738245632?ref_src=twsrc%5Etfw">August 4, 2014</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script> <p>While this works now, it's not clear to me whether apps submitted with a v1 code signature will continue to be available on the Mac App Store and continue to work fine with OS X 10.9.5 and later.</p> <p>I prefer to be safe, not sorry, so I stick to what the Technote says (or seems to say), which is to submit an update with a v2 code signature.</p> <p>From the Technote, it's not really obvious how to do this for apps that have to be built on OS X 10.8 and earlier. Apple makes it clear that trying to use a copy of Mavericks' version of codesign on your build machine won't solve this:</p> <blockquote> The actual code signing machinery is part of the operating system, not the <code>codesign</code> tool. It will not work to copy the <code>codesign</code> tool from Mavericks to an older OS X version. </blockquote> <p>Currently I have to build parts of <a href="http://www.iospirit.com/products/remotebuddy/" title="Remote Buddy" target="_blank">Remote Buddy</a> in Xcode 3 running on OS X 10.6.8.</p> <p>Up to this date, this has never been a problem since I could still submit updates <a href="http://www.iospirit.com/products/remotebuddyexpress/" target="_blank">to the special Mac App Store version</a> right from within Xcode 3.</p> <p>The only way to obtain a v2 signature is by code signing under 10.9, but since Xcode 3 doesn't run on anything newer than 10.6.8, I'll have to separate the build process from the signing, packaging and submission process.</p> <p>Here's what I'm doing now:</p> <ol> <li>Build Remote Buddy Express on OS X 10.6.8 as usual.</li> <li>Copy the built app to a Mac running OS X 10.9.</li> <li>Run a script (SignAndPackageForMAS.sh, more on that later) that signs the app and packages it as a signed pkg file ready for submission to the Mac App Store.</li> <li>Use Application Loader (Xcode &gt; Open Developer Tool &gt; Application Loader) to submit the package (pkg) file to the Mac App Store.</li> </ol> <p>A copy of SignAndPackageForMAS.sh that you can adjust to your needs can be found at the end of this post or directly in <a href="https://gist.github.com/felix-schwarz/f8c83a6ebef0a7bb9dfa">this gist</a>. For most apps, you should only have to change the names of your signing identities and paths in the <em>Configuration</em> section to match your own setup.</p> <p>What the script does is to search for Cocoa bundle and frameworks inside your application and sign these before signing the application itself. It then uses <em>productbuild</em> to create a signed package ready for submission to the Mac App Store.</p> <p>If your app contains other types of binaries, be sure to sign these before signing the app bundle itself, starting with the binaries located at the deepest filesystem level, working up your way to the highest filesystem level.</p> <p><strong>Update:</strong> Thanks to <a href="https://twitter.com/felix_schwarz/status/497021842063097856" target="_blank">feedback</a> from Daniel Jalkut (<a href="https://twitter.com/danielpunkass" target="_blank">@danielpunkass</a>), I moved the codesign options to its own variable and added some information on --preserve-metadata.</p> <script src="https://gist.github.com/felix-schwarz/f8c83a6ebef0a7bb9dfa.js"></script> 2014-08-06T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2014/08/build-on-108-and-earlier-then-sign-for-mas MacBook Pro With Retina Display: Early impressions and USB 3.0 benchmark <p>I've been using the MacBook Pro with Retina Display for just two days now. Here are my very early impressions - and a USB 3.0 benchmark.</p> <h4>The good</h4> <p> <ul> <li>The display is very impressive. I also like the ability to select from several resolutions that, thanks to the Retina Display, look really sharp even though they are essentially interpolated. I can see some interpolation artifacts, though - especially with small text. But it's not really an issue.</li> <li>The display is a lot less reflective than that of previous MacBook Pros. It's not as good as the optional anti-glare displays that were previously available. But for my workspace, it's very close.</li> <li>In stark contrast to yesteryear's 17" MacBook Pro that I was using previously, the fan hardly ever turns on. And if it does, the noise is not even close to being as annoying as that of its predecessor. It's a vast improvement.</li> <li>It has two USB 3.0 ports, which promises low-cost, fast, external storage options. See below for an early benchmark.</li> </ul> </p> <h4>The bad</h4> <p> <ul> <li>The battery level (on the side) and power indicator (on the front) lights are gone. While I can live well without the battery level indicator, the omission of a power indicator light to me seems like simplification gone too far. I can no longer tell whether the MBP is turned on or sleeping. This is even more of an issue since I need to hold down the power button (which replaces the eject key on the keyboard) for some time before the MBP turns on. Without any indicator, if the MBP is sleeping and you press the power button for too long, you're force shutting it down.</li> <li>The new Retina MacBook Pro no longer has an Apple IR Receiver. If you want to use an Apple Remote with it, you'll now need <a href="http://www.iospirit.com/products/remotebuddy/" title="Remote Buddy" target="_self">Remote Buddy</a> and an external USB receiver to do so.</li> <li>The memory is soldered onto the logic board. You can't upgrade it. So if you can see yourself wanting more than the stock 8 GB of memory, you'll need to purchase it as a BTO option - at Apple's high memory prices.</li> <li>I'm very used to the Monaco font in Xcode and the fact that it's not antialiased at a size of 10. On the Retina Display, even that size is now antialiased thanks to the display's additional pixels, making it look "fat".</li> </ul> </p> <h4>USB 3.0 benchmark</h4> <p>Here are the Xbench results of a <em>Western Digital Elements SE 1TB, 2.5-inch, USB 3.0</em> drive when attached to the USB 3.0 port of the Retina MacBook Pro and the USB 2.0 port of last year's MacBook Pro 17".</p> <img src="/blog/2012/06/images/macbook-pro-benchmark~32f563880681d03a47ade49d4dc87cc628051e17.png" width="478" height="184"> 2012-06-22T00:00:00Z Felix Schwarz https://www.felix-schwarz.org/blog/2012/06/macbook-pro-with-retina-display-early-impressions