# Deallocated Objects: every post, full text > Jake Marsh's blog about building software: iOS and Mac development, design, Apple, AI agents and the software industry. Posts from 2010 to today. This file has every published post as Markdown, newest first. Index: https://deallocatedobjects.com/llms.txt # Moving Out Of Ubuntu 10.04 By Jake Marsh, October 23, 2026. Canonical URL: https://deallocatedobjects.com/posts/moving-out-of-ubuntu-10-04 This blog has been sitting on the same Linode server for a very long time. Deallocated Objects started on WordPress in 2010, moved to a little Rails app I wrote around 2014, and that Rails app has been quietly running ever since on a box I've been paying for since 2012. This month I finally moved it. It turned into a fun little archaeology project, so here's how it went. ### What Was On The Box Opening it up was a trip: - **Ubuntu 10.04 LTS**, 32-bit. Ubuntu stopped supporting 10.04 in 2015. - nginx 1.2.7, Postgres 8.4, MySQL 5.1, Redis, and the Rails 4 app running on unicorn with sidekiq next to it. - `sshd` only offered `ssh-rsa` and `ssh-dss` host keys, which modern OpenSSH won't use without some coaxing. - The HTTPS certificate expired on **November 28th, 2016**. It only spoke TLSv1 anyway. So HTTPS on this blog has been broken for about ten years, and I never noticed. - About 6 GB of the 9 GB on disk was Rails logs. It also had the backend for the original Conditions iOS app from 2013, a Huginn install from 2014, and an even older blog app with exactly one article in it. All for $29 a month. ### Getting The Data Out I didn't have a working password or SSH key for the box anymore. Linode has a rescue mode that boots a small Linux distro called Finnix, so I booted into that, mounted the old disk read-only, and ran Postgres 8.4 out of a scratch overlay so nothing would ever write to the original disk. From there, `pg_dump` for every database, a test restore to make sure the dumps were good, and a full copy of the filesystem. The blog's database turned out to be tiny: 82 rows in the `posts` table (80 published, 2 drafts), plus 9 Safari push notification subscribers. Hi, nine people! ### Going Static A blog that hasn't changed since 2015 doesn't need a Rails app, a database, and a background job queue to serve it. So I rebuilt it as a static site: a Bun and TypeScript script, about 300 lines with no runtime dependencies, that reads the posts and writes out plain HTML files. nginx serves those files and there's no app process at all. The first surprise: the `html_content` column was empty for every post. The old app rendered markdown on every single request with Redcarpet and Pygments. Instead of trying to recreate Redcarpet's exact quirks, I crawled the live site before shutting anything down and kept each post's rendered HTML exactly as the old app produced it. Same output as before. The second surprise: the order of posts on the index pages. The app sorted by `published_at`, and when two posts shared a date, Postgres broke the tie however it felt like that day. Re-sorting them would have shuffled a few posts around, so the index order and every post's previous/next links are frozen from the crawl. ### Every Old URL Still Works This was the part I cared most about. People have linked to these posts for years, and I didn't want to break any of them: - `/posts/` and `/posts/` (the Rails app answered both; the id now 301s to the slug) - `/posts/.json` and `/posts.json` - `/feed`, `/feed.atom` and `/posts.atom` - the sitemaps, `robots.txt` and `humans.txt` - five URLs from the 2010 WordPress days, which still 301 to the right posts Pagination was the one tricky bit for a static site, since the old URLs use a query string (`/posts?page=3`). nginx handles that by mapping the query to a pre-built file: ```nginx location = /posts { if ($arg_page ~ "^[0-9]+$") { rewrite ^ /_pages/$arg_page.html last; } try_files /index.html =404; } ``` To check all of it, I wrote a little verify script that requests every URL on the new site (358 of them) and compares the title and text of every page against the crawl of the old one. 358 URLs, 0 failures, 101 out of 101 pages matching. Along the way I found a bug that had been live for years. The post ["7 Keys to Unlock an Apple Design Award"](https://deallocatedobjects.com/posts/7-keys-to-unlock-an-apple-design-award) was a 404 on the old site. The app decided whether a URL was an id or a slug by calling `to_i` on it, and in Ruby `"7-keys-to-unlock-an-apple-design-award".to_i` is `7`. So it went looking for post #7, which doesn't exist. It works now. ### Images Posts referenced 94 image URLs. The ones in my own S3 buckets were all still there, so I downloaded them. A bunch of others were already dead, mostly old CloudApp (`f.cl.ly`) links. I pulled 22 of those back out of the Wayback Machine. In the end 70 images are self-hosted with the site now, and 19 CloudApp images are just gone. RIP. ### What Didn't Make It Google Analytics (the old Universal Analytics kind, which Google shut down in 2023), Chartbeat, the Facebook SDK, the share buttons (the Hacker News button's host doesn't even exist anymore), jQuery, and the Safari push notification endpoints. Sorry, nine subscribers. The FeedBurner feed link still works. Wild. Now the whole site is a folder of files. Deploying is a build and an `rsync`, HTTPS works again for the first time since 2016, and the old Linode is deleted. I did most of this with Claude Code, which was great at the careful, boring parts, like diffing every page of the crawl against the rebuild. It feels really good to have this place back. I've already started writing here again. *Update: the site has picked up a few more features since this post. How it all works today is in the [colophon](https://deallocatedobjects.com/colophon).* --- # Everything That Broke On October 21st By Jake Marsh, October 22, 2026. Canonical URL: https://deallocatedobjects.com/posts/everything-that-broke-on-october-21st Yesterday (Wednesday, October 21st) was one of the strangest days in security I can remember. By lunchtime TechCrunch was running a story titled ["The internet is having a very bad cybersecurity day"](https://techcrunch.com/2026/10/21/the-internet-is-having-a-very-bad-cybersecurity-day/). None of these incidents are connected to each other. They just kept landing, one after another, all day long. Here's a rundown of what happened, roughly ordered by how much it should worry you, with as many technical details as I could dig up. ### PHP2Shell The big one. PHP shipped emergency releases (**8.5.12**, **8.4.27**, **8.3.36** and **8.2.35**) at 14:00 UTC to fix two bugs that allow unauthenticated remote code execution. Both are rated CVSS v4 9.2. **CVE-2026-109618** is out-of-memory handling interrupting PHP while internal request data is only partly initialized. Request cleanup then treats that half-built data as valid. **CVE-2026-109619** is request-owned state that survives after its memory is freed, so the next request on the same worker uses it before initialization resets it. A classic use-after-free. The [php.net advisory](https://www.php.net/archive/2026.php) says every PHP install serving web requests is affected: PHP-FPM, `mod_php`, `php-cgi`, FrankenPHP and LiteSpeed. They consider `mod_php` the riskiest. [Upwind traced](https://www.upwind.io/feed/initial-assessment-php2shell-two-critical-unpatched-php-rces-cve-2026-109618-cve-2026-109619) one confirmed path to `php_session_rfc1867_callback` in `ext/session/session.c`, the code that tracks upload progress on multipart POSTs. PHP caches a couple of `zval *` pointers while it counts bytes, then a session re-read destroys the hash table those pointers live in. The only precondition is `session.upload_progress.enabled=1`, which is the *default*. A stock `php.ini` is enough. Exploiting it needs a build-specific offset and wrong guesses crash the worker, so a burst of 502s from behind nginx is a decent sign someone's knocking. The release was originally planned for today (the 22nd). Details and screenshots of an exploit tool leaked on the 20th, so PHP pulled it forward a day. Amazon's MadPot honeypots logged an exploitation attempt on **October 17th**, four days before anything was public, and nobody knows yet how that person got the details. Calif found the bugs using OpenAI's GPT-5.6 Sol, and Wiz found them independently. Then governments started pulling sites. The NSA said to take a system offline if you can't patch it right away. The UK took [32 government services offline](https://www.theregister.com/security/2026/10/22/php2shell-puts-dozens-of-uk-government-services-out-of-service/5304840) (and four more partially). The Netherlands, Finland, French local government sites, a Danish school platform and Australia's own cyber agency website went dark too. By that evening Pantheon alone had blocked over 60,000 suspicious requests, and Cloudflare was watching attackers mutate payloads to slip past its WAF rules. If you can't upgrade yet, PHP lists stopgaps that shrink the attack surface (they're clear that only the update makes you safe). Put these in `php.ini` or your FPM pool config, since `ini_set()` and `.user.ini` apply too late: ```ini session.upload_progress.enabled = 0 post_max_size = 8M ; 32M if you need uploads fatal_error_backtraces = 0 ; PHP 8.5 only ``` They also suggest `php_admin_value[memory_limit] = -1` in the FPM pool. Restart every worker afterwards. Also watch out for fake "PoC" repos on GitHub. JFrog has already found some carrying malware. ### LiteLLM 1.107.0 [LiteLLM](https://github.com/BerriAI/litellm), the Python proxy a lot of folks use to put a bunch of LLM providers behind one API, had a trojanized release up on PyPI, Docker Hub and GHCR for about two hours. It's the project's second compromise this year. [StepSecurity's reconstruction](https://www.stepsecurity.io/blog/litellm-1-107-0-compromised-pypi-backdoored-wheels-credential-stealer) is wild. The attacker had stolen GitHub CLI OAuth tokens belonging to three BerriAI engineers. An org owner's token overrode branch protection at 10:08:34 UTC (five seconds after protection rejected the change) and rewrote the private release workflow to build from a lookalike repo, `Berri-AI/litellm`. Note the hyphen. A second engineer's token approved the production deploy, and a third one deleted the workflow run records. Since the attacker changed the *trusted* workflow itself, all the hardening LiteLLM added after its March incident (Trusted Publishing, immutable tags, signed images) still applied to the bad build. The malicious packages shipped with valid provenance. The wheels drop a 12-byte file called `cook.pth` that contains `import cook`. Python's `site` module executes import lines in `.pth` files on every interpreter start, so the stealer runs whenever Python starts on that machine. You never have to `import litellm` at all. Clever, and gross. It grabs SSH and GPG keys, cloud credentials, cloud metadata endpoints, CI secrets, every process's `/proc//environ`, browser passwords, and the config for AI coding tools like Claude Code, Cursor and Codex. If `DATABASE_URL` is set it also dumps LiteLLM's own tables, which are full of upstream provider keys. Everything gets encrypted (AES-256, with the key wrapped in RSA-4096) and POSTed to `http://www.litellm.dev/healthcheck`. A second hook in `sitecustomize.py` forks a daemon that checks a GitHub repo under the account `letters9813` every hour for a hostname, then fetches whatever is at `/codepy` on that host and `exec()`s it. That GitHub account is gone now, but infected machines are still polling, and anyone who re-registers the name could run code on all of them. Wiz estimates about 49,000 downloads. If you picked up 1.107.0 between 11:39 and 13:23 UTC (or pulled a floating Docker tag before 14:20), kill the loader process *before* you run `pip` again, because every Python start re-runs the stealer. Then rebuild the machine, pin `litellm==1.106.2`, and rotate every credential that box could reach. BerriAI suspects the GitHub tokens leaked out of an internet-exposed internal LiteLLM deployment that logged response bodies, including responses where Claude Code had included the tokens. That part isn't confirmed. I use Claude Code all day, so this one hit close to home. Anything that shows up in an agent's output can end up sitting in somebody's logs. ### Railway [Railway disclosed](https://blog.railway.com/p/security-disclosure-wednesday-october-21st) that someone got into the systems that store customer environment variables, and for some customers walked away with the decrypted values. Railway says it's part of a series of attacks on platform companies aimed at stealing keys for AI inference providers. They paused *all* deployments, invalidated API tokens and OAuth sessions, and warned upstream AI providers so they could revoke keys early. Researcher Taylor Monahan traced crypto theft back to at least two hours before the disclosure went up. No root cause or customer count yet. If you're on Railway, rotate your secrets at the provider itself, since an old key keeps working until the provider revokes it. Their follow-up post specifically says to check your OpenRouter usage. ### ConnectWise And Storm-0940 [Microsoft published](https://www.microsoft.com/en-us/security/blog/2026/10/21/storm-0940-uses-artex-agentic-ai-connectwise-supply-chain-compromise/) its attribution for last week's ConnectWise Cloud Backup compromise: **Storm-0940**, a China-aligned group. The attacker took control of the identities of ConnectWise's multi-tenant Microsoft 365 apps and then signed in *as those apps* to customer tenants, riding the trust each tenant had already granted. Nobody had to type a password or approve an MFA prompt. Microsoft counted sign-in attempts against more than 2,250 tenants, peaking around 2,900 attempts per minute. They automated it with ARTEX, an open-source multi-agent LLM pentest framework (Go backend, Next.js frontend) that works with any model. In some victims it went from first contact to privileged cloud access in under three hours, and in one tenant a ConnectWise app assigned *itself* Global Administrator. Microsoft's advice is to disable the ConnectWise apps (search by app ID, display names can lie) and hold off on deleting them so you keep the evidence. Disabling them won't remove credentials the attacker already added to your other apps, so go check those too. ConnectWise started a phased restore yesterday. ### GitLab CVE-2026-110264 A CVSS 10.0. An integer overflow in the regex compiler lets an unauthenticated user run code on the server, and it affects every version back to **7.0**. That's 2014! It's [fixed in](https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/) 18.11.13, 19.0.10, 19.1.9, 19.2.9, 19.3.6, 19.4.3 and 19.5.1. There are no workarounds. GitLab hasn't published the full path. [Secondary write-ups](https://lilting.ch/en/articles/gitlab-cve-2026-110264-org-mode-rce) point at Onigmo (Ruby's regex engine), reached by rendering an Org-mode `.org` file, which lines up with GitLab's own detection rules being named "Onigmo native worker crash" and "Org mode render error burst." This is a *different* bug from the CVSS 10 that GitLab fixed on October 12th. Patched last week? You need to patch again. No exploitation reported so far. ### eMudhra's Single-Byte CA Keys This one technically broke a few days earlier, but the fallout peaked yesterday. eMudhra's stock fell about 20% after an exchange filing, and it was the #2 security story on Hacker News. Eight eMudhra intermediate CAs (six for TLS, two for code signing), cross-signed by Sectigo's root, had P-384 private keys that were numbers between 0 and 255. [Scott Helme's write-up](https://scotthelme.co.uk/eight-bits-of-trust-emudhras-ca-keys-cracked-in-milliseconds/) lists all of them. One key is **4**. Getting a private key back from its public certificate takes at most 255 tries. A bug in the April 2025 key ceremony script created a second, weak key pair on the HSM, and similar key names meant the wrong one got used for the CSR. These keys have effectively been public for about 17 months. Chrome found no TLS certs chaining to them in CT logs, and browsers blocked them within hours of the report. The real exposure is non-browser clients (`curl`, Python, Go, Java, package managers) that check neither CT nor revocation. Update your CA bundles (`ca-certificates`, `certifi`, Node, Homebrew) and rebuild your container images. ### Node.js [Node.js 22.23.4, 24.22.1 and 26.12.1](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases) fix CVE-2026-111497, an out-of-bounds write in the Brotli decoder that allows remote code execution. OpenAI's Codex Security was one of the reporters. Anything that decompresses Brotli from an attacker (request bodies, fetched responses) is exposed, and Vercel pushed emergency firewall rules. Also in that release: CVE-2026-106074, where `crypto.randomUUID()` and `randomInt()` had their entropy caches baked into user-land startup snapshots and single executable apps. Every process launched from one of those produced *the same* "random" values. Yikes. The release drops eMudhra from Node's CA bundle too. ### GMO Onamae.com Desktop Cloud Over in Japan, GMO started shutting down *every* Onamae.com Desktop Cloud server at 04:00 JST after finding malware planted on customer machines. Up to 26,739 servers could be affected. The service is mostly Windows desktops running automated forex trading, and customers have reported unauthorized trades on their accounts. GMO hasn't published any malware details or IOCs yet. ### The Rest Of The Day - CISA and the FBI put out a [joint advisory (AA26-293A)](https://www.bleepingcomputer.com/news/security/cisa-and-fbi-safepay-ransomware-has-hit-over-600-critical-infrastructure-organizations/) on SafePay ransomware, which has hit 600+ critical infrastructure organizations since August 2024. - Palo Alto's GlobalProtect auth bypass (CVE-2026-0257) is [now a front door](https://www.helpnetsecurity.com/2026/10/21/ransomware-groups-exploit-palo-alto-globalprotect-cve-2026-0257/) for the Qilin, Inc and Settra ransomware groups. Patching doesn't kick out VPN sessions that already exist, so kill those after you patch. - OVHcloud's CLI had release binaries v0.11.0 through v0.15.0 [swapped for a stealer](https://www.helpnetsecurity.com/2026/10/21/ovhcloud-cli-github-malware/) through a hijacked developer GitHub account. That happened on the 19th and was reported yesterday. - State Bank of India confirmed 3,897 of its customers' records turned up in a leaked dataset. - A [Miasma-variant npm worm](https://safedep.io/testmetest-npm-worm-miasma-variant/) got caught while still in testing. It runs from `binding.gyp`, so there's no install script to spot, and it wipes your home directory if you revoke the GitHub token it stole. Remove its persistence first, *then* rotate. - The UK ICO reprimanded a Welsh public-sector IT provider whose 2024 ransomware breach started with a 12-year-old test account using the password `Password1`. Holy cow. Go patch your stuff, y'all. --- # Little Bites of Cocoa đŸ« By Jake Marsh, September 8, 2015. Canonical URL: https://deallocatedobjects.com/posts/little-bites-of-cocoa This is a link post about https://littlebitesofcocoa.com I suppose it's about time I wrote about [_Little Bites of Cocoa_](http://littlebitesofcocoa.com). I've been having a blast with it. Here's a little about how it came to be: The idea was simple. Daily bite-sized (_get it?_) tips and tricks to give readers a brief overview or explanation of a particular concept, technique, or tool. I drew tons of inspiration from some of my favorite publications and content like [Railscasts](https://web.archive.org/web/20150909075653/http://railscasts.com) and [NSHipster](http://nshipster.com). Originally I was planning on making _Little Bites of Cocoa_ as a series of very short **screencasts**, but I quickly realized just how much work that was going to be. **I'm lazy.** I thought there might be a way I could communicate the same information, but without all the effort of video production. Around the same time, I was experimenting with what it might be like to publish content _"natively"_ on **Twitter**. I'm a big **Twitter** user, and I knew there was a huge community of **iOS developers** there. I found an image size that **Twitter** would display without cropping, and got to work. The idea of each _"bite"_ existing as a simple **image file** that could be shared around the web seemed very interesting, and I found it to be a very fun medium. I composed each of the **images** by hand in [Sketch](http://bohemiancoding.com/sketch/) using [Symbols](https://web.archive.org/web/20150908194108/http://bohemiancoding.com/sketch/support/documentation/07-symbols/) for things like **lower thirds**. Yes, I still do it this way, even now. It's the only way I can ensure the quality level. I often make fine-tune adjustments to the content to accomodate for showing it in such a contrained medium. The process of simplifying a particular concept or set of steps to fit in the **1024 x 412** area available in each bite can be extremely challenging, but it's also very rewarding once I finally 'crack' the code. Composing each one becomes a sort of puzzle where I just need to find a way to express the concepts in their purest forms, with as little distraction or 'fluff' as possible. I created a **Twitter** account: [@lilbitesofcocoa](http://twitter.com/lilbitesofcocoa) and began posting my bites. The response was humbling, to say the least. So many awesome reactions and pieces of feedback. The biggest complaint at first was readers who wanted a better **format** for reading on their phones. The widescreen **images** just weren't cutting it for people trying to pinch and zoom their way around each bite. I began converting each bite into [Markdown](http://daringfireball.net/projects/markdown/) and posting them to a [Tumblr](http://littlebitesofcocoa.tumblr.com). Since I now had all the content in **Markdown**, and by extension **HTML**, I decided to offer a daily **email** format as well. I used [Mailchimp](http://eepurl.com/bnvVGP) to create a **mailing list** and to my surprise folks started signing up! By now, I was having a ton of fun and looking for more places to share the content. I'd been a reader and subscriber of the [/r/iOSProgramming](https://www.reddit.com/r/iOSProgramming) subreddit for years and thought the community there would appreciate the concise image-based tips. It seems I was correct, the folks there loved it so much that the awesome moderators even [gave me my own LBoC flair](https://www.reddit.com/r/iOSProgramming/search?sort=new&restrict_sr=on&q=flair%3A%F0%9F%8D%AB%2BLBoC) to use for my posts. Neat! I continued publishing bites and eventually began to realize that I was outgrowing the **Tumblr** account I'd setup to host the 'web version' of bites. I decided to create my own site and CMS from scratch. This allowed me to have complete control over the presentation and organization of the content. I was also able to automate a fair amount of the work I was doing by hand. It was around this time that I formed a partnership with my great friends over at the [Spec Network](http://spec.fm). They were looking to broaden the content they provided and _Little Bites_ seemed like a great fit. If you haven't checked out [all](https://web.archive.org/web/20150907203738/http://spec.fm/podcasts/design-details) [the](http://spec.fm/podcasts/immutable) [great](http://spec.fm/podcasts/developer-tea) [stuff](https://web.archive.org/web/20150903003647/http://spec.fm/slack) over there, you're missing out. Finally: I'm proud to say that as of today, [the new site is now live](https://littlebitesofcocoa.com), complete with [the first Sponsor](https://littlebitesofcocoa.com/campaigns/3/redirect)! --- # Things I Learned at WWDC Today By Jake Marsh, June 11, 2015. Canonical URL: https://deallocatedobjects.com/posts/things-i-learned-at-wwdc-today One of the best kept secrets of WWDC is that random conversations and run-ins as well as the official Labs at the conference are where much of the ticket value lies. You can often learn tons of interesting details just by talking shop with the Apple employees hanging around. Here's a summary of all the interesting details I learned today: ### HomeKit The new HomeKit triggers don't let you run arbitrary code, you schedule things like "when the garage opens, turn the thermostat to 70 degrees", and then everything happens out of process from your app. Notifications about property changes on HomeKit devices are only delivered if your app is in the foreground. Great for privacy, but boo. ### ReplayKit Apple is totally fine with developers using this framework to record anything, not just Games. Wondering what interesting use cases (besides the obvious: user testing). This could get really fun. Developers never get access directly to the video files. They're stored in a system directory and the user is offered the chance to share them with a standard activity view controller once recording completes. You can add custom actions that will appear in the activity view controller that appears though. ### GameplayKit Just like ReplayKit, you're free to use all of the features of GameplayKit for things other than games. Hey look, a free state machine implementation. Thanks Apple! (GameplayKit has a *ton* of incredbly useful and awesome features, I was just curious about this particular use case.) ### Search Apple has already been crawling the web and looking at things such as existing meta tags that are commonly included on popular websites. They're also noticing if sites have the old (but still great) Smart App Banners feature. When possible, they're tying the information together. If your app is installed, when a user taps on a search result, it deep links you into the app, otherwise, the website and Smart App Banner are shown. In fact, this system is so far along that I was actually shown a demo of one of the apps I work on completely working as described above already on iOS 9 (since Apple already crawled the website and the meta tags were already configured correctly.) Neat! ### Other Mango Odwalla is delicious. --- # Some Interesting Hints About iOS 9 By Jake Marsh, May 21, 2015. Canonical URL: https://deallocatedobjects.com/posts/some-interesting-hints-about-ios-9 Today on Twitter, some [clever](https://twitter.com/steipete) [sleuths](https://twitter.com/PiersonBro) discovered some interesting info tucked away in the latest WebKit source code. Specifically, references to iOS 9 and OS X 10.11 were found. Here are some of the highlights: ### App Links References such as `LSAppLinkOpenCompletionHandler` could point to a few different sorts of things. A [fair amount of hub-ub](https://web.archive.org/web/20201108110033/https://twitter.com/nicklockwood/status/595347585747001344) has been bustling about lately in regards to UIKit's `canOpenURL:` methods and the way some developers were trying to be sneaky and use the API for what it was designed to do. (I kid, I kid). App Links could be Apple revamping the URL handling systems in iOS and OS X to be more "safe" (more restricted to be sure). Another idea that comes to mind is something closer to what Facebook and [applinks.org](https://web.archive.org/web/20150604222557/http://applinks.org) have attempted. Encouraging and supporting more iOS and Mac developers to create indexable content URLs seems like a smart strategic move on Apple's part. Plus, with [all the reports of their recent search efforts](http://appleinsider.com/articles/15/05/06/apple-challenges-google-with-growing-web-search-program-fueled-by-topsy-acquisition), who knows what sorts of things they could be working on. ### Dynamic Type More platform feature-parity happening here. [Dynamic Type](https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html#//apple_ref/doc/uid/TP40009542-CH4-SW65) is a fantastic system and I'm quite happy to see it making its way to the Mac and specifically into WebKit. There's bound to be more undiscovered goodies littered around the WebKit codebase. If you'd like to poke around yourself, [here's a good place to start](https://github.com/WebKit/webkit/search?q=90000). If you find anything interesting, [drop me a line](http://twitter.com/jakemarsh). --- # ComponentKit By Jake Marsh, March 25, 2015. Canonical URL: https://deallocatedobjects.com/posts/componentkit This is a link post about http://componentkit.org/ > ComponentKit takes a functional, declarative approach to building UI. It lets you focus on what your UI should look like, not the steps necessary to build it. It emphasizes a one-way data flow from immutable models to immutable components that describe how views should be configured. It does the heavy lifting of building a view hierarchy from this description. I've been waiting to play around with this library since I saw [this fantastic talk from Adam Ernst and Ari Grant](https://www.youtube.com/watch?v=mLSeEoC6GjU) late last year. There's many pieces to ComponentKit, but one of the most interesting (to me at the moment) is it's declarative layout system: _This is random code I copy/pasted together to show some examples of layout inside ComponentKit. Please refer to [their excellent documentation](https://web.archive.org/web/20150328180922/http://componentkit.org/docs/getting-started.html) to see the real thing._ ``` objective-c [CKInsetComponent newWithInsets:{.top = 70, .bottom = 25, .left = 20, .right = 20} component: [CKStackLayoutComponent newWithStyle:{ .direction = CKStackLayoutComponentDirectionVertical, } children:{ {[HeaderComponent newWithArticle:article]}, {[MessageComponent newWithArticle:article]}, {[FooterComponent newWithArticle:article]}, } ] ]; ``` I've been working in WatchKit quite a bit lately, and I've come to really enjoy it's layout system a lot. It's certainly limiting, but it's fantastic for quickly putting things together when you have an idea. I've been wishing a library would come along that emulated this sort of system for iOS in general, and ComponentKit fits the bill. Even though some of the ideas and foundations in ComponentKit clash pretty heavily with UIKit's philosophies, I'm encouraged by the pure usability of their system. Even their choice of Objective-C++ as a language was made to make the end-resulting code that uses the library as readable as possible. It's certainly not meant to be a catch-all and won't be the right choice for every app, but in the cases where it makes sense, ComponentKit seems like a slam dunk. --- # Apple TV Service Coming in June By Jake Marsh, March 17, 2015. Canonical URL: https://deallocatedobjects.com/posts/apple-tv-service-coming-in-june This is a link post about http://www.cultofmac.com/315960/apple-tv-service-june/ Looks like it's finally happening. > The subscription will allegedly cost $30-$40 month, which is a tad pricer than Sling TV’s core $20 package. 25 channels may sound like not that many, but Sling TV’s cable-free subscription only offers 14 with $5 add-on packs like “Kids Extra” and “News & Info Extra.”
> According to [the Journal](http://www.wsj.com/articles/apple-in-talks-to-launch-online-tv-service-1426555611), the likes of ABC, CBS and Fox are lined up as partners with Apple. But NBCUniversal is not on board because Apple has interestedly had a falling out with the network’s parent company, Comcast. I've been [thinking about Apple's TV service for long time now](https://deallocatedobjects.com/posts/what-if-apple-made-a-tv), and this seems about on par with what I was expecting out of a first generation product. In the wake of the apparent success of iCloud Photo Library and CloudKit itself, _(in that we haven't heard much about them in the press)_ I'm happy to see Apple has gotten back on the proverbial horse when it comes to launching new services. Also, I've heard similar things about the Apple/Comcast relationship. I'd be surprised if Comcast isn't already planning to cave a few months after the new device launches. --- # Confirmed: Apple Watch Runs iOS By Jake Marsh, November 19, 2014. Canonical URL: https://deallocatedobjects.com/posts/confirmed-apple-watch-runs-ios Today's release of WatchKit definitely had a few developers scratching their heads. While on the one hand, many of us weren't expecting as many different integrations points as we got in this first release, the APIs that were announced certainly leave a bit to be desired. Specifically for those of us with aspirations to build full-fledged native apps for the Apple Watch. Apple has of course said that "full" support for building "full" apps will come later this year, but some enterprising developers are already starting to poke around and discover what it might be like. Many have speculated about what sort of operating system Apple Watch will run, with not much data to pull from. Now that WatchKit has been made (at least partially) public, we seem to have some much more solid evidence for that operating system being iOS. Here's a stream of tweets from [Steve Troughton-Smith](https://twitter.com/stroughtonsmith) (everyone's favorite neighborhood tinkerer), as well as [Andrew Pouliot](https://twitter.com/andpoul) (iOS at Facebook), regarding WatchKit: It seems that the framework powering the more elaborate Apple Watch apps is called `PepperUICore` (at least internally). The framework is still private and will likely remain that way until WWDC where I imagine it may gain a much more public-friendly name. PepperUICore contains some fun classes like `PUICCrownView` and `PUICNavigationController`. You can rummage through the [full private headers here if you'd like](https://web.archive.org/web/20150218172926/https://github.com/nickfrey/WatchOS-Headers/tree/master/PepperUICore.framework). Also of note are all the other private Apple Watch-related frameworks present in the iOS 8.2 beta. There's a new `Nano` prefix with frameworks that have intriguing names like [`NanoLeash`](https://github.com/nickfrey/WatchOS-Headers/tree/master/NanoLeash.framework) (seems to enable some kind of "find my device" functionality), and [`NanoTimeKitCompanion`](https://github.com/nickfrey/WatchOS-Headers/tree/master/NanoTimeKitCompanion.framework), which contains references to "monograms" (my guess here is this is the internal name for Watchfaces, and Apple is likely planning some sort of special App Store section for these, there's a huge market there. Watchfaces will be the new Ringtones). For fun I decided to read through some of the `PUICTableView` classes and see what sorts of goodies I could find. It seems that `PUICTableView` ([you can view the full file here](https://github.com/nickfrey/WatchOS-Headers/blob/master/PepperUICore.framework/PUICTableView.h)) is primarly used as a way to tie together the familiar scrolling workhorse that is `UITableView` with the new Digital Crown hardware found on the Apple Watch: ``` objective-c - (void)crownInputSequencer:(id)arg1 previousDetent:(id *)arg2 nextDetent:(id *)arg3 forOffset:(double)arg4; - (void)_crownInputSequencerIdleDidChangeNotification:(id)arg1; - (void)_crownInputSequencerOffsetDidChangeNotification:(id)arg1; ``` _
sidenote: I love the name 'detent' for describing the "steps" along a 'notched' wheel like the Digital Crown.
_ It seems that the Watch reports itself to be in what's called `UIDeviceFamily` _"4"_. iPhone reports _"1"_, iPad reports _"2"_, and Apple TV reports itself as _"3"_. That's about as conclusive as it gets and I must say is actually quite reassuring that the Apple Watch is built on the solid foundation of iOS. The limitations of many of the APIs in today's WatchKit release definitely felt like a temporary measure, and I'm happy to see that there's tons of good stuff in the pipeline, it's just not ready for public consumption just yet. It's not hard to be reminded of the conversations (before it's announcement) of the possibility of the iPhone running OS X. (A seemingly unlikely feat at the time). But as Apple has done for many years now, they managed to leverage their earlier hard work and solid foundations to leapfrog themselves forward with their next product. OS X's Foundation, CFNetwork, and countless other battle-tested APIs gave both Apple's first and third party developers firm starting points to build upon. Well that was almost 7 years ago. It seems that iOS (then _iPhone OS_) is now all grown up, and ready to help it's new little brother, the Watch, find success. --- # Apple Releases First Beta of WatchKit By Jake Marsh, November 18, 2014. Canonical URL: https://deallocatedobjects.com/posts/apple-releases-first-beta-of-watchkit This is a link post about https://developer.apple.com/watchkit/ Apple: > WatchKit apps have two parts: A WatchKit extension that runs on iPhone and a set of user interface resources that are installed on Apple Watch. When your app is launched on Apple Watch, the WatchKit extension on iPhone runs in the background to update the user interface and respond to user interactions. WatchKit provides three opportunities to extend your iPhone app to Apple Watch: WatchKit apps, Glances, and actionable notifications. Extremely excited for the opportunities WatchKit and the Apple Watch will open up for third-party developers and users. Also nice that we get more than just simple notifications out of the gate. Although it does seem that communication is only one-way for now: One fun note is that Apple has also released the system font for Apple Watch, called _San Francisco_. [Gruber points out](http://daringfireball.net/linked/2014/11/18/watchkit-hig) another [memorable typeface with that name](http://en.wikipedia.org/wiki/San_Francisco_(1984_typeface)). Make sure you check out the [WatchKit Human Interface Guidelines](https://web.archive.org/web/20141118200112/https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/WatchHumanInterfaceGuidelines/index.html), the [WatchKit Programming Guide](https://web.archive.org/web/20141120161254/https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/index.html) and the [WatchKit Framework Reference](https://developer.apple.com/library/prerelease/ios/documentation/WatchKit/Reference/WatchKit_framework/index.html). --- # Apple Releases Xcode 6.1.1 GM By Jake Marsh, November 14, 2014. Canonical URL: https://deallocatedobjects.com/posts/apple-releases-xcode-6-1-1 This is a link post about https://developer.apple.com/xcode/downloads/ [Chris Lattner](https://twitter.com/clattner_llvm) on the [Apple Dev Forums](https://devforums.apple.com/thread/249145?start=75&tstart=0#1072989): > We care a lot about the pain that is affecting you now, and Xcode 6.1.1 [available now as a GM Seed](https://web.archive.org/web/20141119133251/https://developer.apple.com/xcode/downloads/) should address the worst of the SourceKit, DerivedData and module cache issues (among other bugs). It has been wonderful to see Chris Lattner (father of Swift) [taking such an active role](https://devforums.apple.com/people/ChrisLattner) in the developer forum discussions about the language and platform. It's a big step away from Apple's notoriously quiet attitude about works-in-progress. Today's release of Xcode has seemingly eliminated many of the nagging issues that have been plaguing Swift development for a while. I haven't seen any SourceKit crashes and haven't had the module cache issues that previously had been wreaking havoc. Twitter seems to agree, here are some reactions from other developers: It appears that the Swift tooling is finally becoming stable enough to work with on a regular basis. With this latest release, I've been able to debug Swift code and work without any issues for a few hours. I'd like to say thanks to the all the teams at Apple for their hard work getting things up and running. --- # Amazon Echo By Jake Marsh, November 7, 2014. Canonical URL: https://deallocatedobjects.com/posts/amazon-echo This is a link post about http://www.amazon.com/oc/echo/ref_=ods_dp_ae *Amazon:* > Amazon Echo is designed around your voice. It's always on—just ask for information, music, news, weather, and more. Echo begins working as soon as it hears you say the wake word, "Alexa." It's also an expertly-tuned speaker that can fill any room with immersive sound. Very interesting move from Amazon. This will be their fifth major consumer hardware product category, and one that certainly makes the future seem exciting. Although it has a bit of an informercial vibe, Amazon's video does a nice job explaining the product, and the use cases it might have:
The response time demonstrated in the device's promotional video is impressive. The biggest user-facing problem with systems like this is the lag time between when you say your ‘key phrase’ and when the device begins listening for speech that it can interpret as some kind of input. In the video, Amazon makes it seem as if this “waiting” time is not needed with the Echo. If this is the in fact the case, it will be a *huge* breakthrough for speech recognition consumer electronics products. It may have been a good idea to set the default ‘wake word’ (as Amazon calls it) ‘Echo’, and not ‘Alexa’ (the apparent ‘wake word’ that the device ships with as default). Two different names just seems unnecessarily confusing. I can’t help but wonder if Apple is working on a device like this. Would be a perfect fit for a future Home Kit-enabled, Cable-box-replacing, always-on Apple TV. --- # Calcbot for Mac By Jake Marsh, November 6, 2014. Canonical URL: https://deallocatedobjects.com/posts/calcbot-for-mac This is a link post about http://www.macstories.net/mac/calcbot-for-mac/ [Graham Spencer](http://twitter.com/greyham) for MacStories: > If you do end up buying it, be sure to check out the difference in the animation of the buttons being pressed when you click with a trackpad versus tapping with a trackpad – it's an impressive level of attention to detail. I've been testing Calcbot for a few weeks and I can't believe I missed this little gem. Attention to detail like this is why Tapbots continue to be regarded as one of the best indie software shops around. I've been keeping Calcbot open pretty much all the time and have found it to be a wonderful way to perform quick calculations or conversions. It is far more functional and usable than the built-in OS X calculator, Dashboard widget, or the new Notification Center widget in Yosemite. I also love [PCalc](http://www.pcalc.com/), but sometimes I don't need all the bells and whistles it provides. Before Calcbot, I was using [Alfred's](http://www.alfredapp.com/) entry-box to perform quick calculations. Alfred is a fantastic app, but it wasn't really built to be a full-featured calculation machine, and it doesn't support easily retrieving previous calculations. [Calcbot for Mac's website](http://tapbots.com/software/calcbot/mac/) is also a great example of how to create a beautiful and effective landing page for your app. You can download Calcbot for Mac [here on the Mac App Store](https://web.archive.org/web/20141111034755/https://itunes.apple.com/us/app/calcbot-intelligent-calculator/id931657367?mt=12), and Calcbot 2 for iOS is coming soon. --- # CloudKit Quick Start By Jake Marsh, November 4, 2014. Canonical URL: https://deallocatedobjects.com/posts/cloudkit-quick-start This is a link post about https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/CloudKitQuickStart/Introduction/Introduction.html#//apple_ref/doc/uid/TP40014987 *Apple*: > This document gets you started creating a CloudKit app that stores structured app and user data in iCloud. Using CloudKit, instances of your app—launched by different users on different devices—have access to the records stored in the app’s database. Really nice to see Apple going to such lengths to get developers using CloudKit. This is a fantastic read for CloudKit novices and experts alike. Apple has been upping their documentation game lately. Not only with new developer library documents like this one, but they now even have a [(semi) regularly updated Swift blog](https://developer.apple.com/swift/blog/). I am quite bullish on CloudKit. I find much of it's API to be pragmatic and intuitive. I'd like to use it for some ideas I've had, but I'm waiting to see which developer or app gives CloudKit it's first ["Letterpress moment"](https://web.archive.org/web/20141106041635/http://kotaku.com/5955318/apples-game-center-seems-to-be-malfunctioning-today-blame-letterpress). Not just to see how it handles the load, but to see [how the usage limits shake out](https://web.archive.org/web/20150216144341/https://developer.apple.com/icloud/documentation/cloudkit-storage/). --- # Github's Swift Style Guide By Jake Marsh, November 3, 2014. Canonical URL: https://deallocatedobjects.com/posts/githubs-swift-style-guide This is a link post about https://github.com/github/swift-style-guide *Github*: > This is an attempt to encourage patterns that accomplish the following goals (in rough priority order): > - Increased rigor, and decreased likelihood of programmer error > - Increased clarity of intent > - Reduced verbosity > - Fewer debates about aesthetics Some fantastic guidance in here. One of my favorites is the bit about preferring *Structs* to *Classes* when writing Swift. This makes value types simpler, and can also be a bit easier on the eyes without all those extra `inits` hanging around. --- # Apple No Longer Rejecting Calculator Widgets From The App Store By Jake Marsh, October 30, 2014. Canonical URL: https://deallocatedobjects.com/posts/apple-no-longer-rejecting-calculator-widgets-from-the-app-store This is a link post about http://techcrunch.com/2014/10/30/apple-no-longer-rejecting-calculator-widgets-from-the-app-store/ [Sarah Perez](https://web.archive.org/web/20141022033253/https://twitter.com/sarahintampa) at TechCrunch: > But now we’re hearing that Apple is changing its course. The PCalc app and widget will remain in the App Store, and all calculator-type widgets will be allowed as well, an Apple spokesperson has confirmed to us. Well, that was fast. Glad to see Apple addressing [this situation](https://deallocatedobjects.com/posts/apple-asks-pcalc-developer-to-remove-ios-8-widget) and responding so quickly. --- # Apple Asks PCalc Developer to Remove iOS 8 Widget By Jake Marsh, October 29, 2014. Canonical URL: https://deallocatedobjects.com/posts/apple-asks-pcalc-developer-to-remove-ios-8-widget This is a link post about http://www.macstories.net/ios/apple-asks-pcalc-developer-to-remove-ios-8-widget/ [Federico Viticci](https://twitter.com/viticci) at MacStories: > Curious app rejections aren't new to the App Store, but being forced to remove a feature that was approved, featured by the App Store team, and appreciated by thousands of users is a different story. I can't help but think this mess is a failure on Apple's part to better explain and campaign for the types of functionality they intended for third part developers to create in their iOS Today View widgets. Apple dipped their toes in this a bit at WWDC, but didn't go far enough. There was an offhanded mention (or two) about "glance-able" information, but there was no real "selling" the concept. In the past Apple hasn't been shy about explaining how you _"should"_ use a particular API or developer feature. I sincerely wish Apple would have made a more obvious case for the types of things they were going to encourage (and allow) to be released as Today View widgets. This situation has now made Apple's vision for Today View widgets crystal clear: Apple wants third-party developers to help it deliver their answer to [Google Now](https://web.archive.org/web/20141030015208/http://www.google.com/landing/now/). Your Today View widgets should embrace similar look, feel, and purposes to the ones provided by iOS itself. [ETA](https://itunes.apple.com/us/app/eta-your-gps-driving-assistant/id803736422?mt=8) comes to mind as a perfect example of this vision. Quick, glance-able and most of all, read-only. I get the impression Apple would prefer that the Today View be about consuming information, and not direct manipulation. [James Thomson](https://twitter.com/jamesthomson) is a wonderful developer with a long [(no really, \*long\*)](http://www.pcalc.com/iphone/history.html) history of supporting Apple's platforms. It's unfortunate that he's being dragged through the mud on this one. PCalc is available for [iOS here](https://itunes.apple.com/us/app/pcalc-the-best-calculator/id284666222?mt=8) and [OS X right here](https://itunes.apple.com/us/app/pcalc/id403504866?mt=12), I highly recommend them. --- # How Can Apple Improve iOS 8 Adoption? By Jake Marsh, October 29, 2014. Canonical URL: https://deallocatedobjects.com/posts/how-can-apple-improve-ios-8-adoption Today Apple's [App Store support page](https://web.archive.org/web/20141101094426/https://developer.apple.com/support/appstore) updated to reflect the latest iOS 8 adoption numbers: ![iOS 8 Adoption now at 52%](https://deallocatedobjects.com/media/78f9cbd1997f.png) After 41 days in the wild, iOS 8 adoption has slowed a bit and is now sitting between 52-54%. As of today, [Apple says 52%](https://web.archive.org/web/20141101094426/https://web.archive.org/web/20141101094426/https://developer.apple.com/support/appstore/), and [Mixpanel has it at about 54%](https://web.archive.org/web/20141119091537/https://mixpanel.com/trends/#report/ios_8/from_date:-29,report_unit:day,to_date:-1). Last year, [iOS 7 was at around 75% by this time](https://web.archive.org/web/20141119091537/https://mixpanel.com/trends/#report/ios_7/from_date:-410,report_unit:day,to_date:-1). This increases the complexity for app developers since we now have to support multiple iOS version for much longer than we needed to in the past. This means it makes business sense for us to make our customers happy and _not_ release updates to our app that renders them unusable on their devices. This has been a battle for just about every software platform in history, and historically Apple has had great success in getting users to update at sometimes shockingly fast rates. This year, things are slowing. The cause of this shift has been [discussed at length](http://daringfireball.net/2014/10/ios_8_storage_space). I'm convinced the slow down is being almost solely caused by the (now infamous) high disk-space requirements to install the update. ![iOS 8 Update Storage Requirements](https://deallocatedobjects.com/media/bcec86a84010.jpg) To make matters worse, Apple is still selling devices with 16 GB of storage. Once you subtract the amount needed to store the files needed to run iOS itself, the user is left with about 12-13 GB (depending on the device type) for their data. This leaves many users in a position of having to pick the _least-bad_ of two bad choices: 1. Engaging in some kind of digital age "favorite child" process where they have to pour through their device and find things they are comfortable parting with 2. Simply ignore the update and move on with their lives Guess which one they usually choose. So that begs the question: How can Apple improve this upon on this problem and allow? Here's a few options, and some thoughts around each: **Apple could release smaller updates more frequently throughout the year.** As a company, Apple is often thinking not just ahead, but _far_ ahead. This options seems unlikely as this would disrupt their entire software roadmap. **Apple could vastly increase their efforts to educate more users about upgrading through iTunes on the desktop** Upgrading to iOS 8 using iTunes on a Mac or PC doesn't have the same space requirements as "full" iOS update packages are downloaded and unpacked before being applied by iTunes itself, without using any unnecessary space on the device. Many modern iOS users aren't even aware that their devices can be interacted with by plugging into their computer. They've been conditioned by things like [iOS 5's "PC-less" setup improvements](http://www.macstories.net/stories/an-overview-of-pc-free-in-ios-5/) as well as the smooth installation processes of the past few years of iOS releases to understand that software updates _happen_ on your phone. This would help some of Apple's more technically inclined users, but isn't going to fix the problem. **Apple could stop selling such low storage tiers to users who probably don't understand they're buying a fairly small capacity device** I'm fairly certain Apple does this for a few reasons. They'd like to push users to buy the mid-tier device, thus earning them another $100 in revenue. They'd also like to continue to provide three price-tiers (low, medium, and high) so they can hit all the different segments of their economic and retail markets. It makes great business sense, just stinks for consumers. I don't see storage capacities in the low-tier iOS devices increasing until possibly next year, but realistically 2 years or more. These analog solutions are obvious, but I don't think that's best approach. The problem is digital. I feel the most effective solutions may be technical in nature, with the added benefit of being mostly transparent to the user. **Apple could split up their updates into smaller chunks, and installing them one at a time** If you've ever been using a piece of software (or any gaming console in the past decade) and used a feature to perform an automatic update of that software you've probably experienced the following madness: _**ZBox 1080:** You need to install an update before you can do the thing_ _**ZBox 1080:** Updating ZBox..._ **You:** "Ah good it's going fast" _**ZBox 1080:** Downloading Update (57%)..._ **You:** "Nice, it's already installing" _**ZBox 1080:** Installing Update (99%)..._ **You:** "Sweet it's done, now I can do the thing, wait what?" _**ZBox 1080:** Updating ZBox..._ **You:** "Wait, what are you doing?" _**ZBox 1080:** Downloading Update 2 of 35 (Estimated Time: 90 Million Hours)..._ **You:** \*defeated slouch\* This terrible infinite update syndrome usually occurs when a user is multiple releases behind and needs to download each one in succession and apply them one after another. This evil, terrible power could be used for good though. One could imagine Apple adjusting their packaging process to create smaller _"chunk"_ updates that get applied one after another. They could wrap the entire process under the shroud of a single progress bar. Each would be "unpacked" and "applied" one at a time, each one cleaning up after itself before moving on. The user would only need enough free to space to handle the unpacked size of the largest single chunk update. This one would take a non-trivial amount of engineering work and depending how it's implemented, could increase the network load significantly on the update servers (if all the chunk updates were downloaded separately). **Allow the system apps to be updated individually** It might seem surprising 7+ years after iOS's introduction, and 6+ years after the introduction of the App Store, that Apple still updates all of their system-level apps through one big single update. We iOS users update millions of apps a day through the App Store, why not use the same system to push out updates to the system apps? This turns out not to be as straightforward or simple as you might hope. Many iOS system applications have deep ties into other parts of the system. Something as simple as the Notes app has be able to read the list of your configured Mail accounts, as well as sync to them if you choose. I can imagine a [_siracusa-esque time-scale_](https://overcast.fm/podcasts/episode/2701791251417) long-term plan here where Apple moved towards a modularized system like this. It does feel more like a _"wouldn't it be great if someday we could..."_ idea. Of course, all the countless private system-level APIs an data storage mechanisms Apple uses in their system apps would pose a bit of an issue when interacting with the App Store system. Apple might not exactly have to worry about getting rejected for using private APIs like the rest of us, but I doubt they'd just throw their apps on the App Store and call it a day. It's much more likely that Apple would work towards introducing many more [extension points](https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/NotificationCenter.html#//apple_ref/doc/uid/TP40014214-CH11-SW1) and try to open up even more system-level APIs and get them ready for primetime. There's plenty more factors Apple has to balance when trying to solve this problem. Network load, install time, not to mention all the new [potential points of failure](http://www.macrumors.com/2014/10/28/apple-vp-greg-joswiak-ios-801/) any changes here would introduce. It's a complex problem, but one that I'm sure Apple is astutely aware of. --- # "Multichannel Video Programming Distributors" By Jake Marsh, October 29, 2014. Canonical URL: https://deallocatedobjects.com/posts/multichannel-video-programming-distributors This is a link post about http://www.theverge.com/2014/10/28/7086473/a-real-apple-tv-might-finally-happen [Nilay Patel](http://www.theverge.com/users/nilaypatel) at The Verge: > This is a wonky legal tweak — Wheeler just wants to expand the definition of "multichannel video programming distributor" so that it's not specifically tied to cable and satellite companies — but it will have huge effects. Allowing tech companies to properly compete against the entrenched interests of cable companies will rapidly improve the quality of our TV experience: we'll see better integration with our other devices, new interface ideas that actually work, and we'll finally finally be able to ditch our gigantic crappy cable boxes. I can't help but think we're getting [closer](https://web.archive.org/web/20141029200949/http://recode.net/2014/10/15/hbo-says-its-going-to-start-selling-on-the-web-next-year/) and [closer](http://www.nytimes.com/2014/10/17/business/cbs-to-offer-web-subscription-service.html) to [the dream](https://deallocatedobjects.com/posts/what-if-apple-made-a-tv). --- # Holding it Wrong: A Landscape Lock Screen By Jake Marsh, October 28, 2014. Canonical URL: https://deallocatedobjects.com/posts/holding-it-wrong-a-landscape-lock-screen I've been a proud owner of the new iPhone 6 Plus for over month now. I love it. It's easily my favorite device I've ever owned. [^1] One of my favorite parts about the 6 Plus is the improved landscape support. Apple has even enabled landscape support for Springboard (the home screen) on the iPhone for the first time: ![Landscape Home Screen](https://deallocatedobjects.com/media/c8f02c3e0db4.png) Interestingly, this is the only (that I know of) screen in iOS where the right-side elements of the status bar do not appear in the far right corner of the screen. The 'dock' pushes them over slightly. This makes sense, as there are obvious readability issues with displaying the white status bar over the light-background dock. Also, if you were to be in a state where you had many status bar items displayed, it could appear visually very noisy for some of the items to be displayed over your wallpaper, and some over the light-gray (blurred) background of the dock. Pulling down notification center is an arguably more common practice with iOS 8's new Today view widgets functionality. Thankfully, Apple has also added support for landscape orientation here as well. ![Landscape Today View](https://deallocatedobjects.com/media/3f1bad743866.png) _Please ignore the embarrassingly low step count for this morning._ Where things begin to break down is when you're holding the device in landscape, and you're in an app that has added landscape support. You finish your tasks and press the home button. You're then shown the home screen, again in landscape, like the screenshot above. So far so good. If you then press the lock button (or the 'sleep/wake' button as Apple likes to call it), you're suddenly looking at everything (at this point most likely just the time and date) sitting there on it's side. ![Portrait Lock Screen on It's Side](https://deallocatedobjects.com/media/df2aa1e692be.png) With all of the recent improvements to landscape support, I find it curious that the lock screen wasn't included in the upgrades. The obvious (and most likely) reason may simply be that time constraints forced Apple to push this particular feature down on the road map a little. Totally understandable, and I hope that's it. On the other hand, I could see an argument that users don't usually interact with the lock screen for long periods of time, and it's purpose is to provide glance-able information, not a full-fledge user interface. This isn't an unreasonable position, but there could be many upsides to supporting it, and I believe it could be done without degrading the overall user experience. My phone is usually in landscape orientation on my desk (I often listen to podcasts this way while working), and it also rests in this position in my car. In these and many other situations, if a notification or a phone call comes in, I'd love to be able to glance at it, quickly evaluate it's importance and either act on it or return to whatever I was doing. As things stand now, this type of interaction isn't really achievable. Today one of a few things happens: - The user has to tilt their head to the side - The user has to reach out, pick up their device and turn it upright, evaluate the information and then return it to it's original resting position - The user ignores the notification and just checks it at a later time _(this one is the most common outcome for me, and I imagine most users)_ All of these are less than ideal, and could be easily addressed with even the most rudimentary landscape support on the lock screen. The iPad has had landscape support for it's home and lock screens since it's original launch, so it wouldn't be unprecedented. The iPhone form factor (and it's wide-screen aspect ratio) would demand a few special considerations. While writing this post, I found it a fun exercise to think about what such a feature might look like. Here are my results: ![Landscape Lock Screen](https://deallocatedobjects.com/media/484eb3de9a53.png) As you can see it's a fairly predictable design. The time is simply centered and positioned in a similar way to it's portrait-oriented siblings. Where things begin to get interesting is when notifications are displayed. Here we can see a couple of notifications have been delivered. When this happens the time could slide out of place to create a sort of side-by-side layout. ![Landscape Lock Screen With Notifications](https://deallocatedobjects.com/media/f101906d0701.png) All the slide-to-action interactions are still present and work as expected. Also, since the Camera app already does a great job of supporting landscape orientation, the _slide-to-open straight to Camera_ interaction still works great. Any [Handoff](https://web.archive.org/web/20141028213134/https://www.apple.com/ios/whats-new/continuity/) or [app-suggestion](http://9to5mac.com/2014/06/03/ios-8-lock-screen-app-shortcuts-iphoto-changes-app-store-reviews/) interactions (where an app icon appears on the bottom-left corner the lock screen, and allows you to slide up to open it) also work as expected. The iOS lock screen may appear simple and almost featureless at first glance, but it actually serves quite a few different functions, and adding landscape support for all of them is certainly a non-trivial task. Again, it strikes me this is likely the reason for not supporting this yet, given the almost certainly enormous complexity of this part of iOS's codebase. One of the many features the lock screen must provide is the ability to enter your device's passcode (should you choose not to, or be _unable to_ use Touch ID to unlock your device). Here's one way this could be implemented: ![Landscape Lock Screen While Entering Passcode](https://deallocatedobjects.com/media/f7601a93e62f.png) As you can see, we again take a _side-by-side_ approach given the user very large circular buttons with very large tap areas, perfect for quickly tapping out the 4 digits while likely trying to quickly unlock their device. Lastly, I wanted to explore what it might be like to receive a phone call with your device in landscape. These days many of us aren't holding our phones up to our ears to speak (if we're even still making phone calls at all that is). It's becoming increasingly common for someone to be performing a task on their device while wearing earbuds with a built in microphone, and then to receive a phone call. Ideally the user wouldn't need to rotate their phone (or their head) to react to the incoming call. They could respond how they wish (answer, decline, send a text, or set a reminder) and then continue on with their original task. Here's what it might look like: ![Landscape Lock Screen With an Incoming Phone Call](https://deallocatedobjects.com/media/971283ba9ac0.png) Here we go with a more "traditional" landscape interface implementation. The various elements are allowed a bit more room to breathe, and the most important elements (the name and photo of the person calling) are enlarged for easier viewing. I had fun exploring what a landscape lock screen might be like. These improvements represent a few sensible ways to support landscape on the lock screen without needing to introduce any radical new interface conventions. If you'd like to experiment or play around with any of these ideas, you can download the Sketch source file for these mockups and do whatever you'd like with it. [It is available right here.](http://deallocated-objects.s3.amazonaws.com/sketch/landscape-lock-screen.sketch) [^1]: My Retina Macbook Pro is a very close second. --- # CVS Disables Apple Pay By Jake Marsh, October 27, 2014. Canonical URL: https://deallocatedobjects.com/posts/cvs-disables-apple-pay This is a link post about http://www.macrumors.com/2014/10/25/cvs-disabling-nfc-apple-pay/ We've been driving towards a contact-less payment system for decades. Almost everyone in our industry has taken a run at it and ~~most~~ all have come up short, until now. CVS (and Rite Aid and I'm sure many others to come) fighting Apple Pay as a threat is an _incredible_ amount of validation after only a few days of Apple Pay being available. Put simply: Apple Pay is taking off. > The reason behind Rite Aid's and CVS's moves to disable unofficial Apple Pay support in their stores is presumably related to their participation in Merchant Customer Exchange (MCX), a retailer group developing its own mobile payments system known as CurrentC. As for the strategy: I fail to see the wisdom in a business strategy of doing what your customers do not want. Here's a few examples of people reacting to these developments: Things gets even worse when you look closer at the details of _CurrentC_ itself: Just so we're clear: The corporations participating in MCX aren't doing it for money (at least not directly). They are not upset about having to give Apple a 'cut' of their profits. The Apple Pay contracts are set up so that the retailers aren't losing a penny more than they would on standard card transactions. These companies want to track your buying habits and use that information to better target their marketing efforts towards you. And yes, that is one valid way for a business to increase it's profits. It has been wildly successful for decades of modern consumerism. But things are changing. Another approach is to provide a service, product, or experience that is so compelling that _it alone_ draws customers in and convinces them to spend their money with your company. Apple has used this technique (among countless others) splendidly over the last 15 years. These days technology is advancing much faster than marketing executives are changing their tactics. Apple Pay is yet another technology product that is doing the dirty work of dragging parts of the business world into the future. So far Apple is simply doing what they do best with Apple Pay: delivering customers a fantastic experience and taking measures to satisfy people's possible concerns about the change to a new technology. (In this case security and privacy). I say 'so far' because I can't help but wonder what a more aggressive Apple might do: I guess we'll see. --- # Apple Fall 2014 Event Predictions By Jake Marsh, September 9, 2014. Canonical URL: https://deallocatedobjects.com/posts/apple-fall-2014-event-predictions The hype is at an all time high the night before this event. This is a quick post to round up and list off what I'm expecting to see tomorrow morning. ### iPhone 6 - 4.7 inch screen - Standard @2x screen resolution - Available for pre-order this Friday, September 12th - Ships next Friday, September 19th ### iPhone 6+ - 5.5 inch screen - "One handed mode" - Demo of split view controllers in landscape - @3x "super retina" screen resolution - Available for pre-order this Friday, September 12th - Ships next Friday, September 19th ### Wearable (iBand/iWatch) - Wireless charging without a "dock" or "charging pad" ([Apple applied for a patent around such a system back in 2011](http://phys.org/news/2011-06-apple-patents-meter-range-wireless.html)) - Numerous health and fitness sensors - Flexible/curved screen - Multiple models for different style preferences - Won't ship until next year ### iOS 8 A ship date will be announced (likely September 17th, next Wednesday). ### Payments All devices discussed will include NFC chips to enable simple, "cardless" payments. These will use "tokenized" payments (where the actual card number isn't transmitted wireless, but rather a one-time-use "token" is sent instead), as well as the Touch ID sensor. This will enable Apple to tout it's approach as being more secure than previous attempts by competitors. A line up launch partners (retailers, brands, etc.) will be announced. ### More We'll likely see a deep dive look into the Payments and Health offerings of all the devices. A good amount of time will be devoted to the larger screens and how Apple has made using such devices with a single hand more enjoyable. I expect we'll also see a re-cap of iOS 8 and OS X Yosemite with special emphasis on features like Continuity and Handoff. A large portion of the presentation will likely focus on Apple's shift into a "lifestyle" company: how it is making devices and services that solve "real" problems and "fit" well into everyone's lives. --- # Teenage Mutant Ninja Turtles (2014) By Jake Marsh, August 9, 2014. Canonical URL: https://deallocatedobjects.com/posts/teenage-mutant-ninja-turtles-2014 I watched _Teenage Mutant Ninja Turtles_ (the movie that was released in 2014). I have some thoughts about it, here they are.

image

### 1987 The year was 1987. Rudy Zamora Jr. was working with Murakami-Wolf-Swenson (later called Fred Wolf Films) on an exciting new project. He called to offer Chuck Lorre (yes, [_that_](http://en.wikipedia.org/wiki/Chuck_Lorre) Chuck Lorre) a job writing a 5-episode mini-series pilot for an animated show based on Kevin Eastman and Peter Laird's comic book characters, _The Teenage Mutant Ninja Turtles_. Lorre said no, and went on to write [some](http://en.wikipedia.org/wiki/Two_and_a_Half_Men) [other](http://en.wikipedia.org/wiki/The_Big_Bang_Theory) [shows](http://en.wikipedia.org/wiki/Dharma_%26_Greg). He passed the job along to David Wise, who had just finished writing the series finale of the the original _Transformers_ animated series. Wise joined the project and had a transformative impact on the life and direction of the franchise. Wise's work on the characters and storylines combined the dark, gritty, abstract world of the original comics with the action-packed, comedic family fun of cartoons in the late 80's. You see in the original comics, the turtle characters were much more dark, mysterious and abstract. Wise gave them personalities, identities, and made them who they are today[^1]. [^1]: In fact, many of the idiosyncrasies we attribute to the _'Turtles_, their personalities (their backstories, and even their wardrobe) came from the mind of David Wise and the 1987 Saturday-morning cartoon, _not_ Kevin Eastman and Peter Laird. Unfortunately, Wise has never been compensated (beyond his salary as a writer) for the success of the show and franchise. [Read here for if you're curious to learn more about how the 1987 cartoon came to be](http://screencrush.com/teenage-mutant-ninja-turtles-animated-series/). The show ended up being incredibly successful and ran for 10 seasons with a total of 193 episodes between 1987 and 1996.

image

### 1990 Fast forward to March of 1990 and the _Turtles_ craze had finally reached it's peak. We were about to see our favorite heroes in a half shell on the big screen. Jim Henson's Creature Shop created some incredible animatronics-enabled suits that allowed the _Turtles_ to come to life in a live, IRL, all-practical-effects action/adventure cinema classic. There were so many things this movie got right in regards to the tone and characters themselves. Much like Wise's original 5-episode miniseries, it showed off all 4 main aspects of our heroes: The _Teenage_, _Mutant_, _Ninja_ and _Turtle_ sides of them. We got action, angst, wisdom, and fun interwoven into a storyline that told our character's backstory in such a way that made the characters feel important while being careful not to tie things too neatly into a bow.

image

### 24 Years Later That was 24 years ago. You likely know where I'm going with this. Unfortunately, it seems that in this case, history doesn't rhyme. This movie somehow managed to do just about every single thing wrong. Before we go any further, I'd like to say for any of you who haven't seen this movie (and still plan to) that I'll be wildly spoiling the entire thing as there's really no way to talk in-depth about it without doing so. If that's not your thing, bail out now and thanks for reading. Ok seriously, last warning, I'm about to describe a lot of what happens in the movie. ### Backstory Let's start with the _Turtles_' backstory. Why does this movie have to change the canon so that everyone was pre-destined to be the character they are? Let's see if I've got this straight: April's dad worked as a genetics research scientist trying to create a mutagen (who knows why he thinks he's doing this, apparently Shredder somehow organized a backroom deal with the bank manager guy from The Dark Knight to trick him into it?) April spends a lot of time at the lab and essentially both names and cares for all four turtles _and_ Splinter since they are some of the test subjects for the mutagen. In the flashback scenes where we learn this story, the turtle's tiny baby shells are _literally_ color coded with stickers. It's a super handy coincidence that they ended up choosing to wear bandanas of those same colors later on in life or that flashback scene might have been _super_ confusing. In another random backstory change-up Splinter doesn't name the turtles, April does. She uses the theme of the genetics project, called _the Renaissance project_. Ugh. Anyways, the lab burns down, and April inexplicably risks her life to rescue the _Turtles_ and Splinter (all still in pre-mutated forms) and releases them into the sewer. Then both April and the Turtles grow up separately from each other and April apparently forgets them entirely. Seriously, can anyone explain what happened there? All this insane stuff happens to her as a kid, she names these 4 turtles in her dad's \*genetics\* lab then when she grows up and meets 4 giant walking turtles that refer to each other with the same names she gave the turtles as a kid she has to keep repeating their names so she won't forget them and not recognize them again when she hears them on old handicam footage?! Wow April must have terrible short term _and_ long term memory. Anyways that's it. That's the whole story basically. Oh yeah, somehow Splinter teaches himself (and the turtles) ninjutsu from a bunch of silhouette poses in an undamaged book that someone threw into the sewer. Splinter's tail also now has the ability to go all Mr. Fantastic and shoot out and grab people and whip them around. I wish I was kidding. There's no mention of Oroku Saki or Hamato Yoshi or anything from Japan at all except for a vague story about a plague. Yep, the "rebooted" _Ninja Turtles_ eliminates the characters of [Oroku Saki](http://en.wikipedia.org/wiki/Shredder_(Teenage_Mutant_Ninja_Turtles)) and [Hamato Yoshi](http://en.wikipedia.org/wiki/Hamato_Yoshi).

image

Of course, the Shredder in the movie may actually be Oroku Saki. The audience however has no way knowing because it's never explained. The Shredder is just magically there, because of reasons, and loves to shoot magnetic knives out of his new Optimus Prime mark-3 Stark Industries armor suit.

image

It seems that initially [Eric Sachs' character was going to actually _be_ The Shredder](http://www.slashfilm.com/william-fichtner-talks-ninja-turtles-his-shredder-is-unlike-any-telling-of-the-story-before/), but then they went back and did some reshoots and came out with the storyline that was released in theaters. The Shredder is first seen without his armor and has a scarred face. Why is his face scarred? Who is he? Your guess is as good as mine I suppose. There's a small chance that they decided (albeit halfway through production) to (very loosely) base their story on the [IDW comics releases](http://en.wikipedia.org/wiki/Teenage_Mutant_Ninja_Turtles_(IDW_Publishing)#Plot). In this storyline Splinter and the Turtles are re-incarnated as a rat and four turtles after being killed by Oroku Saki. Unfortunately, if this is in fact the case they didn't even do justice or stay true to _that_ storyline. Interestingly enough, [Karai](http://turtlepedia.wikia.com/wiki/Karai) makes an appearance, but nothing about her more than her name is explored, she's just another personality-less foot member. The biggest scene for her character involves the Shredder telling her to use "innocent people" as bait. I love that this version of the Shredder is merciful enough to consider some people "innocent". What a great trait for a villain. It's great that he explains himself so thoroughly and directly just in case we weren't sure what his instructions were. Speaking of the Foot Clan, in this movie they are not ninjas. Yep, all the ancient lore and mystery around them is gone. The most we get is that they "will rise again". Now they just wear masks from the Dollar Store and carry automatic assault rifles. They're not the only ones who've gotten an equipment upgrade though. In the 1990 movie, the _Turtles_ watch April on a half-broken black and white TV set, after saving her from the thugs robbing her van. It's implied that most of what they have in their home in the sewer has been scavenged or recovered from garbage. Well I guess the economy must be booming in New York, because people seem to be throwing millions of dollars of brand-new electronic equipment right down into the sewers. The _Turtles_ have tons of flat screens, advanced security and surveillance systems, computer hardware, and Iron Man-style heads up displays that make sure they can be the best ninja crimefighters who's dad won't let them go out and fight crime. It is never explained, not even with a throw-away piece of dialogue or set piece, how our heroes acquired any of their cool toys _or_ their weapons. At least in the original movies, it was obvious that the _Turtles_ weren't exactly well-off. It was a much more humanizing and believable environment rather than some kind of super-extreme command center. Splinter won't let them go above ground, but somehow he's totally cool with all of this black-ops military hardware just hanging out in the lair. Maybe he thinks it's all video games or something. I could spend all day naming off all the things they got wrong, so let's move on. ### Flashback At one point in the movie, we get to see a bit of the _Turtles_' upbringing. We see them having fun, and generally being kids. Unfortunately, this is one of the best moments in the whole movie. They should have made the entire movie like they made this one sequence. The characters in that Flashback, _those_ were the real _Teenage Mutant Ninja Turtles_. The rest of the movie might as well have been called _TMNT: The College Years_.

image

### Invasion of the Turtle Monsters The Turtles are freaking terrifying in this movie. For many scenes they aren't even friendly. They look like rejected concept art for a Dr. Jekyll/Mr. Hyde or The Incredible Hulk reboot.

image

When the look of these new Turtles was first revealed, [some reddit users](http://imgur.com/a/0lwLZ) took to Photoshop to show how they could have been sufficiently modernized without looking so awful.

image

As you can see, the nostrils are gone and Mikey has a proper turtle beak. I can't help but think that design-by-committee killed this movie. You can see it in everything from the costumes, to the voices, and especially the whole [ "turtles are aliens"](http://screenrant.com/michael-bay-teenage-mutant-ninja-turtles-origin-sandy-159820/) fiasco. Here's another fan-made correction of Leo. The top is what it would like if they stayed very true to the 1990 designs, the middle is a nice modernized version of the 1990 look, and the bottom is the hideous monstrosity they ended up going with.

image

Lastly, for some reason, all of the turtles sound like Batman. So much so that they even hang a lantern on it in the dialogue. The only one who has any personality or fun to him at all is Mikey. It seems like they chose to just give all of the jokes to Mikey, and let the other 3 turtles just kind of stand around and look ugly. ### Plot The word "plot" is used very loosely here. Where do I begin? Here's just a few of the ways the plot made no sense:

image

*Geographically*: What a nice drive you'll have from sunny Manhattan to the snow-covered mountain peaks just 20 minutes north of you.

image

*Physically*: It's great that Donatello is so good at science, otherwise he'd never have known how to use a stick to flip a 10 ton armored vehicle 30 feet into the air.

image

*Logically*: It's a good thing chemicals are so interchangeable, because it would have taken April's dad _twice as long_ to get tricked into researching and developing _two separate_ chemicals to 1.) the cure the ancient skin-poison and 2.) mutate animals into giant walking, talking versions of themselves. Isn't modern science incredible? ### Storytelling I think my biggest issue with this movie is how "on the nose" everything was. There were no inferences to be found. Every single character spoke their subtext out loud. There was no single point where I felt like I could become connected to any of the characters because they were all too busy telling me how I'm supposed to feel about them. ### Cowabunga I saved this one for last because it's the worst offense of all. The film essentially apologizes for using the phrase _"Cowabunga!"_. It degrades the word to a level of childish-nostalgia for the _Turtles_. Mikey "used to say it when they were kids".

image

I can't imagine how far in the wrong direction the writer's room must have gone for that to end up in the final script. It's such an insult to anyone holding out any remote hope of this being a good version of the story and going to see this movie. ### The Next Mutation Unfortunately, it seems that this movie did well enough in [it's opening weekend](https://web.archive.org/web/20140810183058/http://insidemovies.ew.com/2014/08/10/box-office-report-teenage-mutant-ninja-turtles/) that [Paramount Pictures has announced](https://web.archive.org/web/20140810182949/http://insidemovies.ew.com/2014/08/10/teenage-mutant-ninja-turtles-sequel/) they're already working on a sequel, and yes many of the same people are returning to work on it. It'll be out in June of 2016. I think I speak for all _Ninja Turtles_ fans when I say: ![](https://deallocatedobjects.com/media/80cc6f0be9c3.gif) --- # WWDC 2014 Wishlist and Predictions By Jake Marsh, May 28, 2014. Canonical URL: https://deallocatedobjects.com/posts/wwdc-2014-before I've compiled some thoughts about both what I'd like to see out of next week's WWDC keynote, as well as what I think is plausible, likely, and definite. ### TestFlight + Apple In our fast-paced world, this seems like it happened a long time ago. But in fact it was only about [3 months ago](https://deallocatedobjects.com/posts/apple-buys-testflight) that Apple acquired TestFlight through it's parent company, Burstly. My hope is that Apple already had some projects in the works before the acquisition around better support for beta releases of iOS apps, and wanted the TestFlight guys on board to push things over the finish line. If not, 3 months is quite a short time (even for Apple) to try to modify an assumedly antiquated developer portal codebase with TestFlight-style functionality. ### Objective Without the 'C' There [have](http://ashfurrow.com/blog/we-need-to-replace-objective-c) [been](https://web.archive.org/web/20140606045653/http://informalprotocol.com/2014/02/replacing-cocoa/) [some](http://inessential.com/2014/02/12/on_replacing_objective-c) [murmurs](https://web.archive.org/web/20140721060748/http://kickingbear.com/blog/archives/412) recently about the need for Apple to be working on a successor to the Objective-C programming language (or runtime depending which side of the semantic fence you fall on). While this would be a fascinating development, I'd be very surprised if Apple is quite ready for any transitions to begin here. I find the conversation and ideas surrounding such a successor to be fascinating. I found [John Siracusa's and Guy English's Debug episode](https://web.archive.org/web/20140627230605/http://www.imore.com/debug-32-john-siracusa-copland-2014) about the topic very entertaining and I can't wait to see what eventually takes Objective-C's place. However, with all the other changes (last year's iOS 7 soup-to-nuts reworking, and this year's overhaul of OS X), I simply don't know if Apple has enough free engineers to make such a shift possible. Perhaps in the coming years, we'll see/hear more about such a possible successor, but I definitely wouldn't expect to next week. ### Hardware Retina Macbook Airs would be neat, not my machine of choice, but more Retina for the world is awesome and the Macbook Air is a phenomenal computer. 4K displays seem like a given at this point, and I can't wait. I hope they find a way to keep the same price point. The Mac mini hasn't gotten much love lately, would be neat to see them do something there, but if so, I don't expect anything revolutionary. A Macbook Pro update of sort is up in the air in terms of likeliness, but I could see a spec bump and price adjustment. If so I could see them dropping the non-retina Macbook Pro entirely, which would be a welcome simplification of the lineup. ### iPhone 6 Nope. ### iWatch Very unlikely, but would be seriously awesome if it happened. ### Overhauled Apple TV I've been wishing for a non-hobby Apple TV product for years. [I wrote a fairly in-depth piece a few years ago](https://deallocatedobjects.com/posts/what-if-apple-made-a-tv) about what such a product could be like, so I won't rehash those thoughts here. I will say that an Apple TV with an App Store baked-in would be an incredible product for game developers. Apple has had the [Game Controller APIs](https://developer.apple.com/library/ios/documentation/ServicesDiscovery/Conceptual/GameControllerPG/Introduction/Introduction.html) out in the wild for a little while now, and I can't imagine a scenario where these stars don't align. Will it be announced next week though? I'm not so sure. On the one hand, if you're going to get developers jazzed up about a new platform, WWDC is the place to do it (and they'll have to wait another calendar year for another one to come around). On the other hand, there's some wisdom to be seen in wanting such a product to get it's own dedicated press cycle and event. ### Home Automation I think the tech-media has [assumed a little too much](http://www.theverge.com/2014/5/26/5751816/apple-developing-home-automation-features-for-iphone-report) on this one. I doubt Apple is going to come out with a huge line of devices, but I do think there's a ton of value in them providing some things. Here's what I think (admittedly _hope_) will be announced: Much like the [Game Controllers API](https://developer.apple.com/library/ios/documentation/ServicesDiscovery/Conceptual/GameControllerPG/Introduction/Introduction.html) previously, Apple would provide a set of APIs, frameworks and most importantly _constraints_ to third-party hardware developers. They'd essentially define some standards that everyone could develop against. While it would be neat to give software people some toys here, I'm skeptical that third-party software developers would be given "hooks" to integrate into this system at first, I think Apple's focus will be all about getting as many of these devices into the market as fast and cheaply as possible. Apple would then provide an app (maybe called _iHome_ or something of the nature. Yes, [SDI Technologies](http://sditechnologies.com/) already owns that name, but that's [never stopped](http://www.bloomberg.com/apps/news?pid=newsarchive&sid=aNrpjoPwYI0s) [Apple before](https://web.archive.org/web/20140714202602/http://www.businessweek.com/stories/2004-09-29/john-paul-george-ringo-dot-dot-dot-and-steve)). This app would organize all your connected devices into one manageable interface with sections like _"Lights"_, _"Temperature"_, _"Security"_, _"Appliances"_, etc. I could see Apple defining some "types" of devices that manufactures could "register" their products as, and they'd appear in different sections and contexts within the app, like "Lighting", "Appliances", "Thermostat", etc. Apple could provide one or two pieces of hardware to get the ball rolling, and to get users into the app. For bonus points, Apple could provide a gallery of products within the app itself, and allow users to purchase directly from within the app. ### Healthbook for iOS With all the reports, I have to think this is happening for sure. It will be pretty neat, but until new hardware comes out to truly embrace it, it'll be appealing to mostly niche users. Much like the Home Automation functionality, Apple will likely provide some APIs, Frameworks and again most importantly standards for how third-party device makers to get their data into your Healthbook. I could see Apple having a supported list of data point "types" like _Weight_, _Blood Pressure_, _Distance Travelled_, etc. and exposing methods in a system-wide API to such data into a user's Healthbook with a simple "couple lines of code". ### Siri Improvements and Third-Party Support Yep. ### Better Inter-app Operability Support Whether or not it involves _"true"_ XPC is still up in the air for me, but I have to believe that Apple will improve upon this situation somehow this year. The time feels right, with iOS 7 out the door, and all of those giant changes shipped, to finally knock down the walls between apps in a big way. Even if we don't get full, true cross-process communication, the most likely candidate for this would be apps being able to register system-level `UIActivity`'s somehow, providing a `UIActivityCategory` to indicate when the activity should be presented. If they have chosen to go that route for now, I certainly hope they improve the default `UIActivityViewController` UI, as scrolling horizontally for days through tons of (all fairly similar looking) activity icons isn't a great experience (and adding this new functionality would only exacerbate the problem). ### Notification Center Overhaul We'll see the removal of the "Missed" tab for sure, but I also expect some doubling-down on the limited "Google Now" type functionality that was added in iOS 7 to the "Today" tab of Notification Center. This sort of thing hasn't been Apple's strong-suit in the past, this would be a great chance for them to throw out another _"[Can't innovate anymore my ass!](http://www.theverge.com/2013/6/10/4412350/apple-new-mac-pro-wwdc-2013)"_ Beyond that, I'd love to see Apple attempt a drastic re-thinking Notification Center. Notifications have become such a big part of all of our lives, and I think everyone agrees that they've become barely usable for most novice and even most experienced users. Seriously, after I interact with a notification, it's gone forever, lost into the black hole of my device. At the same time, many users don't want an overwhelming list of thousands of temporal notifications that they can't hide. It's a very difficult usability problem to solve, but I think Apple is up for the challenge. ### iOS UI Improvements Would be really neat if they tackled the shift-key madness head on with some really awesome text-entry improvements. It's been a while since Apple has "touched" the keyboard UI in a significant way, and there's a ton they could do there. ### Use Multiple Apps at once on iPad I have a good feeling this has been played with internally at Apple. Whether or not this makes it into a public release is a tough question. There's a good number of UI challenges such a thing would present, not the least of which would be coming up with some non-contrived example use-cases. Pressing the Home button should always bring the user back to the Home screen immediately, so if Apple has done something here, I'm confident they'll preserve that "safety eject button" feel to the Home button. Also of note is the likely opt-in nature of such a feature. Apple has been really, _really_ pressing all of their third-party developers to adopt Auto Layout, top to bottom (pun intended). I could see this being an example of one of the benefits of such widespread adoption. (Of course there's also that fabled larger-screen iPhone 6 hanging out on the horizon, which could also likely benefit from lots of Auto Layout-enabled apps). All of that being said, on a personal note: I'd love to see a situation where I can watch a video in YouTube, Netflix, etc. on one side, and have an iPhone-width pane of Tweetbot running on the left side of the screen. ### OS X 10.10 [Like Jesper said](https://web.archive.org/web/20140530152314/http://waffle.wootest.net/2014/05/26/wwdc-2014-predictions/), we're not going to call it "ten ten ten". My most likely marketing names for the new OS X (which will inevitably look laughably wrong come next week): - _Napa_ - _Malibu_ - _Yosemite_ The "how it looks" will be shockingly different. Some of the "how it works" will tweaked a bit, but nothing too crazy. A similar upgrade to what iOS got in iOS 7 last year. This one is the biggest wildcard for me, since the rulebook was clearly thrown in terms of what's "fair game" for changing last year with iOS 7. All I can say is, I'm sure it's going to be awesome, and I'm sure everyone is going to hate it for one reason or another. Note to self: take time to evaluate and process the changes in depth before reaching for the pitchforks, unless they take away my Lucida Grande. You can have my inner shadows, and contoured toolbars, but you'll never take my Lucida Grande. Also I hope they don't convert all the buttons to little blue links. ### Conclusion Yesterday morning [Apple announced](https://web.archive.org/web/20140528144620/http://www.apple.com/apple-events/june-2014/) (a week in advance) that they'll be live-streaming the keynote. From what I can tell, Apple seems confident that they're going to blow a few minds. As usual, expect the echo chamber of _"Apple is doomed"_, _"they didn't even really announce anything new"_, and _"they still haven't fixed X"_ to be running full steam ahead during and after the keynote. Just remember to keep calm, judge things for yourself, and enjoy the show! --- # atom-spotify By Jake Marsh, March 1, 2014. Canonical URL: https://deallocatedobjects.com/posts/atom-spotify This is a link post about https://atom.io/packages/atom-spotify I've been really loving Github's new [Atom](https://web.archive.org/web/20140227014806/http://atom.io/) editor. I've also been blown away by the number of packages that have already been published only a few days after the project went public. Like most developers, I often like to crank the music while writing code. My music service of choice (at the moment at least) is Spotify. I like to listen to random playlists or Spotify app services like [Soundrop](http://soundrop.fm/) in an effort to expose myself to lots of new music. This means I frequently find myself hitting `⌘+Tab` to bring Spotify to the foreground and glance at the artist or track name. This felt silly, so I wrote a little Atom package to show me this info in Atom's status bar. ![](https://dl.dropbox.com/s/5grx2ol4g4lcvb0/Screenshot%202014-02-28%2021.40.14.png) If you're an Atom user, you can install the package in your Settings or by simply running this command: ``` bash apm install atom-spotify ``` The package lives [right here](https://web.archive.org/web/20150922065417/https://atom.io/packages/atom-spotify), and the source code is [over here](https://github.com/jakemarsh/atom-spotify). Happy listening! (and coding) ♫ --- # Apple Buys Testflight By Jake Marsh, February 21, 2014. Canonical URL: https://deallocatedobjects.com/posts/apple-buys-testflight This is a link post about http://www.macrumors.com/2014/02/21/apple-may-acquire-testflight/ Finally. --- # Coding in Color By Jake Marsh, January 27, 2014. Canonical URL: https://deallocatedobjects.com/posts/coding-in-color This is a link post about https://medium.com/p/3a6db2743a1e This makes so much sense. The idea isn't neccesarily brand-new, ([here's an article from back in 2009](http://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from-syntax-highlighting-to-semantic-highlighting/)), but seeing it illustrated as clearly and beautifully as Evan has done here is eye opening. --- # I'm Moving to San Francisco By Jake Marsh, June 1, 2013. Canonical URL: https://deallocatedobjects.com/posts/im-moving-to-san-francisco Yep, after years of living in the Dallas/Fort Worth area, I'm finally making the trek out west to live in the *Bay Area*. Thankfully, I *won't* be making that trek alone. My [lovely other half](http://twitter.com/amandolinb) and I signed a lease on an awesome house late last week. I also owe a ton of thanks to all my friends who have been super helpful throughout this whole crazy process. I'm excited, scared, and *ready*. **Let's do this!** --- # Springboard Episode 6 By Jake Marsh, May 2, 2013. Canonical URL: https://deallocatedobjects.com/posts/springboard-episode-6 This is a link post about http://springboardshow.com/episodes/6 Had a great time talking with [@ashfurrow](https://twitter.com/ashfurrow) on his wonderful iOS podcast, [Springboard](https://web.archive.org/web/20130507064930/http://springboardshow.com). I give some advice to those wishing to get started building iOS apps, and tell some behind the scenes stories of building [Conditions for iOS](http://conditionsapp.com). There's even a hilarious [@gruber](http://daringfireball.net) anecdote in there, [Give it a listen!](https://web.archive.org/web/20130809192208/https://web.archive.org/web/20130507064930/http://springboardshow.com/episodes/6) --- # Say Hello to my new Minimalistic Weather App, Conditions for iOS! By Jake Marsh, February 21, 2013. Canonical URL: https://deallocatedobjects.com/posts/conditions This is a link post about http://conditionsapp.com I'm extremely happy to announce that my all-new minimalistic weather app, Conditions for iOS, is now [live on the App Store](https://web.archive.org/web/20130430052420/https://itunes.apple.com/us/app/conditions-beautiful-weather/id543298335?mt=8)! ![Conditions for iOS - Announcment Graphic](https://deallocatedobjects.com/media/796ffdf51130.jpg) ### Seriously, Another Weather App? I wanted a beautiful app that would give me a quick answer to the question of *What's the weather like?* Many weather apps clutter their interface and overload their users with tons of details that aren't all that useful. Conditions only shows you the most important information about what it's like outside right now, wherever you are, anywhere in the world. Conditions is hyper minimalistic. It displays a simple, 5 day forecast indicating what it's going to be like outside each day, including the temperature. You can easily tap anywhere on the face of Conditions to toggle it into an even simpler mode, showing only what it's like outside right now. Intentionally hiding all of the typical "noise" information associated with weather apps. Conditions also knows when it's dark outside and will automatically adjust it's look and feel to match the time of day. It has both a light and dark theme. ![Conditions Light and Dark Modes](https://deallocatedobjects.com/media/3f765f1388bf.jpg) ### The Website I had a lot of fun making the website for Conditions. First off, it completely supports Retina and other high DPI screens. I also got to play around with a ton of subtle but awesome HTML5 and CSS techniques. Notice the app launching after the page loads? Try clicking/tapping the home button on the iPhone. Also be sure tap or hover over each of the different features screenshots. They all use some really neat [CSS Keyframe animation](http://coding.smashingmagazine.com/2011/05/17/an-introduction-to-css3-keyframe-animations/) techniques to subtly describe each of the app's features. It came out looking something like this: It's fully responsive of course, and uses [Apple's Smart App Banner technology](https://web.archive.org/web/20121106212722/http://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html) to easily direct website visitors to the app on the App Store. ### Pull To Refresh Make sure you pull to refresh once you get the app, I'm pretty proud of how that came out. ;) ### Technical Details Conditions for iOS is available in all App Store countries and supports all iPhone and iPod Touch devices running iOS 6 or later. ### Download [You can download Conditions for iOS on the App Store by clicking here.](https://web.archive.org/web/20130430052420/https://itunes.apple.com/us/app/conditions-beautiful-weather/id543298335?mt=8) [You can view the website for Conditions right here.](http://conditionsapp.com) [Follow @conditionsapp on Twitter here.](http://twitter.com/conditionsapp) --- # Mantle: Objective-C Model Objects That Don't Suck! By Jake Marsh, October 22, 2012. Canonical URL: https://deallocatedobjects.com/posts/mantle-objective-c-model-objects-that-don't-suck This is a link post about https://github.com/blog/1299-mantle-a-model-framework-for-objective-c The guys at Github have been rocking some awesome Objective-C open-source stuff lately, and their latest release, [Mantle, does not disappoint](https://github.com/blog/1299-mantle-a-model-framework-for-objective-c). > Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application. Mantle has the potential (and already does) get rid of a ton of boilerplate model code. It provides default implementations of all the common `` and `` methods, as well as `isEqual:` and `hash` methods. It also provides an awesome little method called `mergeValuesForKeysFromModel:`, which makes it easy to specify how new model data should be integrated. My favorite feature though is how it cleanly utilizes reversible value transformers to allow for easy re-encoding back in to JSON at any time, not only that, but it even handles migration by automatically saving the version of the model object that was used for archival. Then, upon unarchiving, the `migrateExternalRepresentation:fromVersion:` method is invoked (only if migration is needed), giving you a convenient hook to upgrade old data. Mantle is still in it's early days, but it looks quite promising. You can read [Github's blog post about Mantle here](https://github.com/blog/1299-mantle-a-model-framework-for-objective-c), and you can [check out the Mantle Github repository right here](https://github.com/github/Mantle). --- # Change Your Debugging Life With PonyDebugger By Jake Marsh, August 30, 2012. Canonical URL: https://deallocatedobjects.com/posts/change-your-debugging-life-with-ponydebugger This is a link post about https://github.com/square/PonyDebugger The team at [@Square](https://web.archive.org/web/20120901020204/http://corner.squareup.com/2012/08/ponydebugger-remote-debugging.html) have released another amazing tool for native iOS development. > PonyDebugger is a remote debugging toolset. It is a client library and gateway server combination that uses Chrome Developer Tools on your browser to debug your application's network traffic and managed object contexts. To use PonyDebugger, you must implement the client in your application and connect it to the gateway server. There is currently an iOS client and the gateway server. I don't think I can possibly explain how incredible this tool is. [Go to Github and start using it right now.](https://github.com/square/PonyDebugger) Also be sure to check out the Square Engineering team's [post about PonyDebugger.](https://web.archive.org/web/20120901020204/http://corner.squareup.com/2012/08/ponydebugger-remote-debugging.html) Here's a couple screenshots to get you as excited as I am: (Remember, though it visually resembles debugging a web page, this is all depicting a debugging session of a *native* iOS application's HTTP requests and CoreData storage!) ### Network Traffic Debugging ![Screenshot](https://deallocatedobjects.com/media/79b51654a474.png) ### Core Data Browser ![Screenshot](https://deallocatedobjects.com/media/4317b9c6c7df.png) --- # Create Static Content Screens with Ease! By Jake Marsh, July 26, 2012. Canonical URL: https://deallocatedobjects.com/posts/create-static-content-screens-with-jmstaticcontenttableviewcontroller This is a link post about http://bitly.com/OGCvCY I often find myself needing to create what I call "static content" `UITableViewControllers`. Whether it be a "Support" or "About" screen, or possibly a simple "Login" or "Settings" screen, I find myself writing a ton of annoying, repetitive, boilerplate code for these types of screens all the time. What's a guy to do? Enter: [`JMStaticContentTableViewController`](http://bitly.com/OGCvCY). [Check it out on Github here](http://bitly.com/OGCvCY). ### What Exactly Is It? A `UITableViewController` subclass that allows you easily and simply display what I call "static content". An example of such content is what is found in iOS's built-in Settings application. Or a simple "About" screen. Or a "Login" screen. Or any number of simple screens that might display or collect information. All this is done using some really cool methods that use blocks. It also allows you to easily create `UITableViewControllers` that collection information. It is very much a library in the making. It is quite functional and usable already, as you will see if you read on, however, there is a TON more that *could* be done with this library, I'd love to hear where everyone thinks it should go and how it could best be adapted to fit everyone's needs. That being said, `JMStaticContentTableViewController` might not be for everyone, but if you've ever built a whole `UITableViewController` implementing full `UITableViewDataSource` and `UITableViewDelegate` methods, and so on, and so on, then you likely know how much time this library could save you. Keep reading for some awesome stuff. ### Example Usage #### Adding a section and a cell Here's a simple example of adding a section and a cell to your `UITableView`. You would likely write this code inside your `viewDidLoad` method inside your `JMStaticContentTableViewController` subclass. Note that you are passed in some very important objects, `JMStaticContentTableViewSection`, `JMStaticContentTableViewCell` and a `UITableViewCell`. You can configure the `UITableViewCell` exactly as you would normally. We also use the `JMStaticContentTableViewCell` object to setup things like `UITableViewCellStyle` and the reuse identifier. `JMStaticContentTableViewSection` also allows you to setup things like the section titles. As you can see we also get a nice looking `whenSelected:` block, this allows to write code that will be run whenever our cell is tapped, a perfect place to, for example, push on a `UIViewController`. ``` objective-c - (void) viewDidLoad { [super viewDidLoad]; [self addSection:^(JMStaticContentTableViewSection *section, NSUInteger sectionIndex) { [section addCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) { staticContentCell.cellStyle = UITableViewCellStyleValue1; staticContentCell.reuseIdentifier = @"DetailTextCell"; cell.textLabel.text = NSLocalizedString(@"Wi-Fi", @"Wi-Fi"); cell.detailTextLabel.text = NSLocalizedString(@"T.A.R.D.I.S.", @"T.A.R.D.I.S."); } whenSelected:^(NSIndexPath *indexPath) { [self.navigationController pushViewController:[[WifiViewController alloc] init] animated:YES]; }]; }]; } ``` #### Inserting A Cell At Runtime This will behave just like `addCell:` above, except it will animate nicely into place. ``` objective-c - (void) _someTaskFinished { [self insertCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) { staticContentCell.reuseIdentifier = @"WifiNetworkCell"; staticContentCell.tableViewCellSubclass = [WifiNetworkTableViewCell class]; cell.textLabel.text = network.networkName; cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; cell.indentationLevel = 2; cell.indentationWidth = 10.0; } whenSelected:^(NSIndexPath *indexPath) { // TODO } atIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES]; } ``` #### Inserting Multiple Cells At Runtime Same as above, except here we're wrapping our work in calls to `beginUpdates` and `endUpdates`, again retaining all of our `UITableView`'s built in "magic" while still getting to use our nice, convenient syntax. ``` objective-c // Somewhere else you'd probably load some data somehow, // then want to insert rows for the new items in that data. // Normal table view functionality is completely retained, for example, // here we're inserting a bunch of cells inside a beginUpdates/endUpdates block // so all our new cells will animate in simultaneously and look awesome. [self.tableView beginUpdates]; for(SomeModelObject *o in self.awesomeModelObjects) { [self insertCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) { staticContentCell.reuseIdentifier = @"SomeCell"; cell.textLabel.text } atIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES]; } [self.tableView endUpdates]; ``` #### Animation Anytime you ask `JMStaticContentTableViewController` to animate the inserting or deleting of cells or sections, it will use the `UITableViewRowAnimation` style of `UITableViewRowAnimationAutomatic` under the hood, so all of your animations will look great. This style was added in iOS 5. ### Example App So for fun (and to aid me in developing the library, determine its needs) I started using `JMStaticTableViewController` to attempt to re-create the built-in iOS Settings application. This exists in a sort of "half-finished" state inside [the library's Github repo](http://bitly.com/OGCvCY) Some things to try in it are: * Wi-Fi, go into the Wi-Fi section and notice how the rows appear after "searching for networks" (this is obviously simulated). Also try disabling and re-enabling Wi-Fi. Notice how the rows appear and disappear with correct animations. * The Notifications section also demonstrates showing some content. * Cells that shouldn't be "selectable" (like cells containing `UISwitch` controls) aren't selectable. * Normal `UITableViewDelegate` methods still work, so implementing things like like adding a `UIActivityIndicatorView` next to a section title are no more or less complicated than before. It is, like I mentioned, unfinished, meant merely as a tool for you to checkout and get some perspective on how the library might be used in the "real world". More completion of the example as well as any other examples are very welcome, please feel free to submit pull requests. #### Example App Screenshots
           
### iOS Version Compatability `JMStaticContentTableViewController` supports iOS 5 and up. ### Adding To Your Project #### CocoaPods (The New Easy Way) If you are using [CocoaPods](http://cocoapods.org) then just add this line to your `Podfile`: ``` ruby dependency 'JMStaticContentTableViewController' ``` Now run `pod install` to install the dependency. #### Manually (The Old Hard Way) [Download](https://github.com/jakemarsh/JMStaticContentTableViewController/zipball/master) the source files or add it as a [git submodule](https://schacon.github.io/git/user-manual.html#submodules). Here's how to add it as a submodule: $ cd YourProject $ git submodule add https://github.com/jakemarsh/JMStaticContentTableViewController.git Vendor/JMStaticContentTableViewController Add all of the files inside the folder named "JMStaticContentTableViewController" to your project. #### ARC `JMStaticContentTableViewController` uses [Automatic Reference Counting (ARC)](http://clang.llvm.org/docs/AutomaticReferenceCounting.html). You should be using ARC too, it's the future. If your project doesn't use ARC, you will need to set the `-fobjc-arc compiler` flag on all of the `JMStaticContentTableViewController` source files. To do this in Xcode, go to your active target and select the "Build Phases" tab. In the "Compiler Flags" column, set `-fobjc-arc` for each of the `JMStaticContentTableViewController` source files. #### "This Library is Bad, and You Should Feel Bad"
This is my first try at building a system like this for this purpose, there are already a ton of things I plan on "fixing", improving, and re-doing. I wouldn't really be a good developer if I didn't hate all my code once I was done would ? ;) I'm totally open to suggestions/fixes/hate mail/etc just let me know in a pull request, issue or even on twitter, I'm [@jakemarsh](http://twitter.com/jakemarsh). That being said, this is a very opinionated library. It makes assumptions and defines conventions that might not fit perfectly with everyone's codebase or app. If you are one of those people, please feel free to submit a pull request so we can talk about it and maybe get some of your desired changes worked in. [Check it out on Github here](http://bitly.com/OGCvCY). --- # CoreData + AFNetworking = AFIncrementalStore By Jake Marsh, July 13, 2012. Canonical URL: https://deallocatedobjects.com/posts/coredata-afnetworking-afincrementalstore This is a link post about https://github.com/AFNetworking/AFIncrementalStore Another amazing open-source project from [@mattt](https://github.com/mattt) and the [AFNetworking](https://github.com/AFNetworking) guys: `AFIncrementalStore`. > `AFIncrementalStore` is an [`NSIncrementalStore`](https://web.archive.org/web/20111006150147/https://developer.apple.com/library/mac/documentation/CoreData/Reference/NSIncrementalStore_Class/Reference/NSIncrementalStore.html) subclass that uses [`AFNetworking`](https://github.com/afnetworking/afnetworking) to automatically request resources as properties and relationships are needed. I had noticed NSIncrementalStore in the iOS 5 docs a while ago, but it was this article that got me to realize how unbelievably cool it was. I can't tell you how much this is going to revolutionize the way many apps integrate with their backend API systems. Please do yourself a favor and [go checkout the project's README immediately](https://github.com/AFNetworking/AFIncrementalStore). --- # App Review: Cheddar for iOS By Jake Marsh, June 28, 2012. Canonical URL: https://deallocatedobjects.com/posts/app-review-cheddar ![Cheddar Hero Graphic](http://f.cl.ly/items/3n1x0R2B322J3y3L1i47/iOS%20Hero.png) Task management is a pretty big deal. Over the past few decades of personal computing, literally thousands of applications have tried to solve the problem of managing your "TODO" list in a sensible, useful way. The emergence of smartphones into the mainstream has brought about a renaissance of sorts of new applications throwing their hat into the ring of possible "perfect" solutions to the task management problem. This isn't always easy as everyone has their own set of specific wants and needs when it comes to "TODO" lists, and no single application is going to be "perfect" for everyone. Each time another of these applications debuts, I always give it a try for a few days to see if it could be "the one for me". I've tried them all, seriously, I'm "that" guy about "TODO" list apps, almost to the point of being counter-productive. I've just never found the right mix of simplicity and power that really speaks to how I like to work through a list of tasks. Until now. ### Enter, Cheddar. [Cheddar](http://cheddarapp.com) is both a [univeral iOS application](https://web.archive.org/web/20120701005810/http://itunes.apple.com/app/id524382948) and a [web application](http://cheddarapp.com). It's fully Retina-ready, on iOS and even on the web. Put simply, it is beautiful. The premise is simple: it's just text. Create a list by giving it a name, add tasks by typing some text. "Check off" a task by tapping or clicking. Yep, that's it. You don't need to know or understand anything else to be able to use the app effectively, but that's not the end of the story, not even close. ### Managing Tasks ![Add Task Screenshot](http://f.cl.ly/items/3V1b0U440S1B3O3b3a0A/Add%20a%20Task%20-%20iPhone.png) Adding tasks in Cheddar couldn't be simpler, just type in the box at the top of the screen and press return. The iOS version of Cheddar even has a delightful little animation illustrating your task "popping" down to the end of your list. ![Edit Task Screenshot](http://f.cl.ly/items/3H1V0h2S1t1M2D1d3u2h/Edit%20List%20-%20Phone.png) Editing tasks is also super easy. On iOS, just tap the "Edit" button and then select a task to edit the text of, or re-order some tasks, or archive ones you don't need anymore. On the web, tasks are always re-orderable using some nice drag-and-drop functionality, and the pencil icon turns the desired task back into a text box for editing. It all feels very natural and very obvious. ### Syncing ![Syncing Screenshot](http://f.cl.ly/items/38180u1v3k3O1M422P2n/Tasks%20-%20Web.png) Oh boy. [Nothing Magical](http://nothingmagical.com) (the company behind Cheddar) really outdid themselves here. Every action you take while using Cheddar *instantly* syncs across to all your devices. Add a task on your phone, it instantly appears on the web, no refresh required. "Check off" a task on your iPad, and your iPhone instantly updates to reflect the change. You can really tell a ton of effort was put into the speed and simplicity of the syncing, and it really makes you feel confident about using the app. I love knowing that I'll never have a "I guess it hasn't updated here yet" moment ever again with my task lists. People on my side of the industry throw around the term "magic" pretty loosely these days, but Cheddar's syncing really does feel a bit like magic to me, more apps need to take note and follow suit. ### Tagging ![Tagging Screenshot](http://f.cl.ly/items/1v3Y1s1X0A3421280V2z/Tag%20-%20iPhone.png) Advanced users will be delighted to find a robust tagging system built around Twitter-style [#hashtags](https://web.archive.org/web/20120920052743/https://cheddarapp.com/text). Simply type in something like `#someday` into a task in Cheddar, and it becomes a hyperlink that, when tapped or clicked, will filter your list of tasks to only those containing that same hashtag. Again, simple, straightforward, and easy to understand. ### Markdown ![Markdown Screenshot](http://f.cl.ly/items/2l1C0e0Y0s3Y2z110G41/Tasks%20-%20iPhone.png) Also present in both the iOS and web version of Cheddar is [span-level](http://daringfireball.net/projects/markdown/syntax#span) [Markdown](http://daringfireball.net/projects/markdown/) support. Markdown fans will immediately see where this is going, but basically this means you can easily add hyperlinks, bold, italic, strikethrough, source code and even emoji to your tasks with very minimal effort. Cheddar has a great page describing all of the great things you can with this functionality here: [Cheddar - Text](https://web.archive.org/web/20120920052743/http://cheddarapp.com/text). ### Pricing You can always use Cheddar for free with up to two lists of tasks. If you want an unlimited number of tasks, you'll need to upgrade to Cheddar Plus. You can do this on the web for $1.99 USD a month or $19.99 a year. You can also upgrade to Cheddar Plus on iOS using a In-App Purchase Subscription which renews every 3 motnhs for $5.99. Compared to some other services, Cheddar's pricing is dirt cheap. Upgrading was a no-brainer for me. And, as I said, you can always use Cheddar with up to two lists of tasks completely free. ### Final Thoughts I've been using Cheddar for about 3 months while it has been in development and it really has turned out to be the perfect little task manager for me. I've used it to manage myself building apps, buying groceries, running errands, and doing some work around the house. In every single case I've found that it does it's job, gets out of my way, and lets me focus on actually completing my tasks. I would highly recommed you try it out. ### Where To Get It You can find Cheddar on the web at [cheddarapp.com](http://cheddarapp.com) or on the [App Store here](https://web.archive.org/web/20120701005810/http://itunes.apple.com/app/id524382948). There's also a great little video showing off Cheddar's main features [over here on Vimeo](http://vimeo.com/44828323). --- # App Review: Podcasts for iOS By Jake Marsh, June 27, 2012. Canonical URL: https://deallocatedobjects.com/posts/app-review-podcasts-for-ios ![Banner Image](https://deallocatedobjects.com/media/8eb64e08f291.png) Yesterday, Apple released a new flagship iOS application: "Podcasts". [Yep, only a few days after I predicted such a thing, it happens](http://deallocatedobjects.com/posts/the-case-of-missing-podcasts-in-ios-6). As I said before, I had no inside information about the app. Although, I did hear a few rumblings at WWDC that the new Podcasts application was initially intended to be demonstrated during the WWDC Keynote, but was cut at the last minute. So, was I right? Did Apple announce a full-fledged "App Store-style" backend interface for publishers to manage their podcasts? Push notifications for when new episodes are released? Let's dive in and find out. ### Where I Was Wrong (For The Moment) No new backend system was announced or released. However, a clue or two hinting at future improvements to this new system can be found in the app. I found two references to the concept of "paid" podcast episodes when playing around with the application. One mentioned "free" episodes, thus suggesting that some episodes might cost money. Another offers the option to "Redeem Code", again suggesting that some episodes may not be free. ![Redeem Button](https://deallocatedobjects.com/media/a2b1d7e1bcda.png) I'm not done holding my breath on Apple offering an "App Store-style" backend system to allow publishers to sell episodes or even subscriptions to their shows. Apple also hasn't brought any sort of push notification functionality to market with this intial release of Podcasts. I don't have any hard evidence here, but given the obviousness of providing push notifications for when new episodes are available, as well as automatic background downloads, I'd say it's only a matter of time before these features are implemented. ### The new iOS Application First, the facts: Podcasts is a pretty feature-rich universal iOS application that runs on both the iPhone and iPad. It requires the device to be running at least iOS 5.1. It allows users to discover and subscribe to podcasts, as well as download or stream individual episodes. It's always a fun time when Apple releases a new flagship iOS application. Their latest releases of iMovie for iOS and iPhoto for iOS have boasted some pretty great user interfaces and seem to be quite well received by users. Let's see if Podcasts follows suit. ### Top Stations ![Top Stations Screenshot](https://deallocatedobjects.com/media/ca6b92f1fefe.png) Apple chose a pretty interesting direction for it's "Top Stations" feature in Podcasts. I'm guessing their intention was to give those users who aren't as familiar with podcasts a way to quickly listen to something that might interest them. A sort of "channel surfing" concept for the couch-potato-would-be-podcast fans. It definitely delivers on the "channel surfing" concept, but educated users likely won't be too intrigued by this feature. From what I can tell, by default "Top Stations" seems to choose an episode at random from the currently selected show and begin playing it automatically. Possibly a neat way to discover new content, but I don't see many users heading back for a second or third use. ### Subscribing ![Catalog Featured Screenshot](https://deallocatedobjects.com/media/581477789f79.png) With Podcasts, Apple has essentially done for Podcasts what they did for books with iBooks: A separate iOS app, that you have to install from the App Store, that when launched, can "flip around" to reveal the place where you discover and download media. Even the animation for the flip back and foward matches iBooks pretty closely. ![Catalog Top Charts Screenshot](https://deallocatedobjects.com/media/ac2ffa4316c0.png) The Podcasts "catalog" interface, sadly, is still a giant web view. Not surprising given that all of Apple's "store" interfaces on iOS are designed this way, but boy does it show. The interface is uncharacteristically slow and unresponsive. I found tapping on a "subscribe" button to hang on almost every podcast I was attempting to subscribe to. ### Playback Oh boy. Welcome back to skeuomorphic-town. Well, if you're listenting to an audio podcasts at least. Watching video podcasts shows the video of the desired episode full-screen with the expected video controls. But load up an audio epsiode and you're in for a treat. ![Playback Tape Deck Screenshot](https://deallocatedobjects.com/media/338e8d77148e.png) It's literally a tape deck. Immediately recognizable and impressive. I really love how well this interface comes across on the iPad, a device that not's too far off in size from actual tape recorders of the 1970's and 80's. I tested out the app on my iPhone 4S and iPad 3, and just as an aside, the app truly shines on the iPad 3. This type of graphical treatment on the iPad 3's retina screen really helps solidify Apple's stronghold on the "holy cow that looks awesome!" market. During playback, the podcast's cover art is displayed on top of a translucent "plastic" cover sitting on top of two spinning tape deck heads with "tape" running between the two decks. As you progress in the episode you're listening to, the tape visually transfers from the left to right side, just as it would on a real-life tape deck, quite an impressive effect. The control buttons located at the bottom of the screen appear to "press in" when tapped. They resemble the buttons of that old-school (now seemingly ancient) tape recorder you found in your parent's attic that time. One nice touch is the speed control. As you change the rocking slider control from "turtle" to "hare", the tape decks begin to visibly ramp their speed up and down. Many podcast apps on iOS offer ability to speed up or slow down playback of episodes, but this sort of immediate and obvious user feedback feels like something only Apple could deliver. ### Should you switch? Tough to answer. Podcast clients are like RSS Readers, Twitter clients or E-mail applications: no one application can please everyone. With "Podcasts", Apple has served up a fairly strong competitor in to the "iOS podcatcher application" market, assisted greatly by what I'm calling the "default choice" factor. They own the platform, "Podcasts" comes close to appearing as the "default" application for interaction with Podcasts on iOS. I personally still love Instacast for iOS. It too, is a universal iPhone and iPad app. Like Apple's "Podcasts", it uses iCloud to sync subscriptions, playback positions and played/unplayed states of episodes. As an added bonus, Instacast already does support push notifications for new episodes of shows you're subscribed to. So while I would highly suggest anyone who has read this much of this article to check out "Podcasts", I think Apple has a few releases to go before this app starts to become the obvious choice. "Podcasts" is available now for iPhone 3GS, iPhone 4, iPhone 4S, iPod touch (3rd generation), iPod touch (4th generation) and iPad devices running iOS 5.1 or later. [Here's the App Store link](http://itunes.apple.com/us/app/podcasts/id525463029?mt=8). --- # The Case of Missing Podcasts in iOS 6 By Jake Marsh, June 17, 2012. Canonical URL: https://deallocatedobjects.com/posts/the-case-of-missing-podcasts-in-ios-6 I have a theory (truthfully a wish) for the explanation behind why Apple's iOS 6 beta seems to be excluding support for browsing and downloading podcasts within the built-in iTunes Store app. [Many have speculated and reported](http://www.appleinsider.com/articles/12/06/15/apple_planning_to_launch_standalone_podcast_app_in_ios_6.html) that Apple is planning on introducing a standalone Podcasts application for iOS, similar to what they've done with iBooks. While I agree that this would be a smart move for Apple, I believe that the real winning combination would be a full, end-to-end solution, and this post is my pitch. The rest of this post will be written in the hypothetical. No little birdies whispered in my ear here, just my pure predictions. ### For Producers Apple would host an iTunes Connect style management interface for creating/updating shows, support for both Audio and Video podcasts are included. *Key Feature:* Apple would host the audio and video data files for producers, for *free*, just like they host TV Shows, Movies, Songs, Books, Applications, etc for their other iTunes Store types. Apple's (not so new anymore) North Carolina data center would be touted as one of the ways Apple is able to provide such a service. Producers are able to sign in, add new episodes, attach show notes, links, and upload their media. New episodes will then go live, and appear for consumers in the iTunes Store and native iOS Podcasts application (possibly with or without an approval process). Producers could offer each episode for free or set a pricing tier, similar to how application developers set their prices today. This would allow for independent content providers to release their content for a minimal fee and turn their hobbies into actual businesses, exactly like application developers did when the App Store first launched back in 2008. Imagine a world where episodes of fantastic independent content like [Dr. Horrible's Sing-a-long Blog](https://web.archive.org/web/20120617191508/http://drhorrible.com/) or [The vlogbrother's](http://www.youtube.com/user/vlogbrothers) [Crash Course](http://www.youtube.com/user/crashcourse) and [Sci Show](http://www.youtube.com/user/scishow) get released for each week for $0.99 USD. Consumers could purchase season passes, buy individual episodes or subscribe to only the free episodes. The possibilities here are practically endless. In addition, [as many have reported](http://9to5mac.com/2012/06/15/apple-launching-podcast-app-with-ios-6-and-working-on-podcast-producing-technology/), Apple is likely working on a revamped version of it's Podcast Producer software, that has shipped with OS X Server for a few years now. The new application would included an interface for recording, mixing, editing, and uploading episodes in both Audio-only and Video formats. This application would run on OS X Mountain Lion and would integrate with the aforementioned backend iTunes Connect-style management service. ### For Consumers Now the really big one. A universal (iPhone & iPad) iOS application entitled "Podcasts". This application would provide a way to browse available shows, read about them and subscribe to your favorites. Basicallly extending the existing functionality avaiable in the Podcasts section of the iTunes Store today. Since Apple will now control the experience end-to-end, they can now provide fantastic support for things like push notifications when new episodes go live. Any consumer who has subscribed to a particular podcast "feed" will now be able to get push notifications and, [as many have reported](https://web.archive.org/web/20120617043227/http://www.imore.com/2012/06/15/apple-planning-dedicated-podcast-app-ios-6/), even automatic background downloading of episodes as soon as they are released and available, permitting their device's battery and network state permit it. This idea also cooperates nicely with [the recently announced "Power Nap" feature](http://www.imore.com/2012/06/17/power-nap-podcast-app-automatic-future-ios-updates/) for the newer Apple notebook machines. ### What does this really mean? I've thought about this a lot, and I've come to the conclusion that the real competion here could be with services like YouTube and Vimeo. YouTube has been ]working quite a bit lately at trying to get more serialized content on their service. [They've been investing millions in independent content providers](http://online.wsj.com/article/SB10001424052748704013604576247060940913104.html) in an attempt to get higher quality regularly scheduled content going on their network. An Apple-hosted Podcasts service could help to further blur the lines between professional and independent content providers, giving this type of content the same "bump" that indie developers got with App Store. I admit, this is a bit of wishful thinking on my part, as I'd love to see this type of content be readily available on Apple's platforms. But given the evidence, I'd say it's at least a solid theory. --- # Delight Your Users By Pre-filling Forms With JBDeviceOwner By Jake Marsh, April 12, 2012. Canonical URL: https://deallocatedobjects.com/posts/delight-your-users-by-pre-filling-forms-with-jbdeviceowner This is a link post about https://github.com/jakeboxer/JBDeviceOwner Filling out forms on a phone can really suck. Heck, even on the iPad's awesome screen, I often make plenty of mistakes while typing in information. When a user first downloads your iOS app, it's quite common for them to need to fill out some sort of "sign up" or some other kind of form. All of this can add up to a terrible "first run" experience for new users of your app. What's a developer to do? Enter: `JBDeviceOwner` This simple library, which comes to us from [Jake Boxer](https://web.archive.org/web/20120508223646/http://jakeboxer.com/), uses the *name* of the user's device to look up and return commonly needed user information from their Address Book record. Here's what it looks like in action: ``` objc JBDeviceOwner *owner = [UIDevice currentDevice].owner; // owner will be nil if the user's data could not be found. if (owner != nil) { self.firstNameTextField.text = owner.firstName; self.lastNameTextField.text = owner.lastName; self.emailTextField.text = owner.email; self.phoneTextField.text = owner.phone; } ``` Jake describes how it works: > It's really simple actually. > Most iPhones are named *"Jake Boxer's iPhone"* ("sometimes with a different person's name instead of mine). Most iPhones have their owner saved in their address book. > `JBDeviceOwner` extracts the owner's name from the device name, finds the matching record in the address book, and populates the `JBDeviceOwner` instance with the data from the record. > If `JBDeviceOwner` can't figure out the owner's name, or if it can't find a matching record in the address book, it won't return anything. Obviously this approach, while really neat, isn't going to work for absolutely every user, so you should have a sensible "fall back". I like to "try grabbing" using `JBDeviceOwner`, and if I don't find anything, try manually asking the user to enter their email, then using *that email address* to try to locate their contact record. Try not to over-do it, but I believe when done well, this sort of approach can be an awesome alternative to requiring users to type in a ton of information. *Please Note:* Try not to ask your users for a ton of information in the first place, only require what you absolutely need to make your app work. That being said, A few big name apps are now using this technique, and their "first run" experiences are *much* nicer, simply prompting the user with a `UIActionSheet` with, for example: "Would you like to use this information?" [Check out `JBDeviceOwner` on Github](https://github.com/jakeboxer/JBDeviceOwner) and stop annoying your users today! --- # Localize Your Apps With Ease Using Greenwich By Jake Marsh, April 6, 2012. Canonical URL: https://deallocatedobjects.com/posts/localize-your-apps-with-ease-using-greenwich This is a link post about http://fadingred.github.com/greenwich/ Oh man, I have waited a long time for a tool like this to come around. I've even attempted to build one myself a couple times. > The process of localizing Cocoa applications has always been a bit of a chore. Various tools are available to facilitate localization of applications, but they all require a fair amount of work. Even when there is demand for localization, many applications are only available in one language. Greenwich is here to change that. [Greenwich](https://fadingred.github.io/greenwich/) is a new, [open-source](https://github.com/fadingred/Greenwich) framework that greatly speeds up the process of localizing and translating an iOS or Mac app. At anytime a developer or translator (yep, Greenwich has been built with translators in mind) can make a change to a word or two, relaunch your app and see the changes reflected immediately. ![Translator](https://deallocatedobjects.com/media/7e41d0d1ff9f.png) Setup and usage for [iOS](https://fadingred.github.io/greenwich/setup/#ios) and [Mac](https://fadingred.github.io/greenwich/setup/#mac) are very well documented on Greenwich's awesome [setup page](https://fadingred.github.io/greenwich/setup/). Do yourself a favor and check this out now, if you've ever localized a Mac or iOS app you know what a pain the process can be. Looks like we finally have a great solution. --- # Literal Syntax for NSArray, NSDictionary & NSNumber By Jake Marsh, March 13, 2012. Canonical URL: https://deallocatedobjects.com/posts/new-objective-c-literal-syntax-for-nsarray-nsdictionary-nsnumber This is a link post about http://joris.kluivers.nl/blog/2012/03/13/new-objectivec-literal-syntax/ I can't tell you how long I've been waiting for this. As [Joris points out](http://joris.kluivers.nl/blog/2012/03/13/new-objectivec-literal-syntax/), it appears that Apple has [committed the necessary changes](http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/?view=log&pathrev=152137) to the LLVM project to allow LLVM to fully support the latest Objective-C language features. > Apple committed a new patch to the llvm project adding support for new Objective-C literal syntax for `NSArray`, `NSDictionary` and `NSNumber`. These have previously been documented in the Mountain Lion Xcode release notes but that was still under NDA. Now that these features have been committed to llvm I guess we’re allowed to speak about it. ...and since LLVM isn't under NDA like most of the "developer preview" stuff, this means we can all finally discuss this stuff on our blogs! Here's a (small) taste of the great new syntax: ### NSNumber ``` objc NSNumber *someNumber = @31; // [NSNumber numberWithInt:31] ``` ### NSArray ``` objc //NSArray *doctors = [NSArray arrayWithObjects:@"Matt Smith", @"David Tennant", @"Tom Baker", nil]; NSArray *doctors = @[@"Matt Smith", @"David Tennant", @"Tom Baker"]; ``` ### NSDictionary ``` objc NSDictionary *tweet = @{ @"text": @"Hi! I'm a tweet!", @"user": @"jakemarsh", @"timestamp": @1331664532 }; ``` --- # Protect Your Users' Privacy With DTSHashedContacts By Jake Marsh, February 15, 2012. Canonical URL: https://deallocatedobjects.com/posts/protect-your-users-privacy-with-dtshashedcontacts This is a link post about https://github.com/crossforward/HashedContacts As I'm sure many readers have heard, there has been [some](http://mclov.in/2012/02/08/path-uploads-your-entire-address-book-to-their-servers.html) [public](https://web.archive.org/web/20120216225825/http://blog.path.com/post/17274932484/we-are-sorry) [outcry](http://www.macrumors.com/2012/02/15/congress-weighs-in-on-ios-apps-collecting-address-book-and-other-personal-data/) lately on the subject of iOS apps accessing the Address Book contacts of a their users and then sending the whole lot of them off to their servers, to accomplish their "friend matching" features. Many companies have [already](https://web.archive.org/web/20120216225825/http://blog.path.com/post/17274932484/we-are-sorry) [corrected](http://www.pcmag.com/article2/0,2817,2400154,00.asp) the error in their ways, (partially), and [even Apple has stated](http://www.macrumors.com/2012/02/15/apple-to-require-explicit-permission-for-ios-apps-accessing-address-book-data/) that a future iOS release will lock down Address Book access, in the same way that permission is required to access a user's geographic location now. In the meantime however, if you'd like a quick, easy and safe way to build a "find my friends" type of feature into your app, I'd recommend looking at [`DTSHashedContacts`](https://github.com/crossforward/HashedContacts). It's is a drop-in iOS library that provides a wrapper around the Address Book frameworks designed to ensure the privacy of user data. Before access is ever made to the Address Book the user will first be prompted for permission with a customizable `UIAlertView` prompt. Once access is granted the library returns hashed tokens representing the user's private data rather than the data itself. Here's what it looks like to use it: ``` objc [hashedContactsProvider emailTokensWithConfirmation:^(NSArray* tokens) { //When permission given } whenDeclined:^{ //When permission denied }]; ``` [Read more about `DTSHashedContacts` on Github](https://github.com/crossforward/HashedContacts) --- # Building Xcode Projects from the Command Line By Jake Marsh, February 11, 2012. Canonical URL: https://deallocatedobjects.com/posts/building-xcode-projects-from-the-command-line Building iOS and Mac projects from the command-line could be a lot easier to work with. Hopefully this post will give you a couple ways to make that happen. I wanna talk about two different little tools that help ease the process of scripting or working with Xcode projects from the command line. ### xcodebuild-rb [`xcodebuild-rb`](https://github.com/lukeredpath/xcodebuild-rb]) is a neat little ruby gem that lets you create a `Rakefile` inside the root of your Xcode project's folder that looks like this: ``` ruby require 'rubygems' require 'xcodebuild' XcodeBuild::Tasks::BuildTask.new ``` What does that get you? Well, after creating that `Rakefile`, running a quick `rake -T` (which will list all available `rake` tasks) will output something like this: ``` bash rake xcode:build # Builds the specified target(s). rake xcode:clean # Cleans the build using the same build settings. rake xcode:cleanbuild # Builds the specified target(s) from a clean slate. ``` One of the coolest features of `xcodebuild-rb` is it's use of "formatters". One of my favorite formatters is called "progress". You can enable it like this: ``` ruby XcodeBuild::Tasks::BuildTask.new do |t| t.formatter = XcodeBuild::Formatters::ProgressFormatter.new end ``` Then when you build using `xcodebuild-rb`, your output will look something like this: ``` bash Building target: ExampleProject (in ExampleProject.xcproject) ============================================================= Configuration: Release .............. Finished in 2.226883 seconds. Build succeeded. ``` [Read more about `xcodebuild-rb` on Github](https://github.com/lukeredpath/xcodebuild-rb) ### xcodearchive Apple ships Xcode with a command line tool called `xcodebuild`, which as the name suggests, builds an Xcode project. One drawback about the built-in `xcodebuild` tool is that it can't create `.ipa` archive files. Well, enter [`xcodearchive`](https://github.com/gcerquant/xcodearchive/blob/master/xcodearchive.rb). Unlike `xcodebuild-rb`, `xcodearchive` isn't a ruby gem. It is just a `.rb` file that you can put anywhere you'd like and run. `xcodearchive` has a ton of great features, check out the USAGE output: ``` bash Usage: xcodearchive [OPTIONS] --version Show version number -v, --verbose Output more information -g, --growl Show growl alerts to inform about progress of the build -n, --do_not_keep_dsym_symbols Do not keep the dSYM symbols -s, --show Show archive in Finder once created -c, --clean Do a clean before building the Xcode project -o, --ipa_export_path FOLDER Set the path of the folder where the ipa will be saved. Default is '~/Desktop' -i DEVELOPPER_IDENTITY, Force the developper identity value --developper_identity -p, --project PROJECT Specifiy xcode project -h, --help Display this screen ``` [Read more about `xcodearchive` on Github](https://github.com/gcerquant/xcodearchive/blob/master/xcodearchive.rb) If you aren't already automating the tedious parts of your build and release processes, you are missing out. As any iOS developer knows, building and releasing can become some of the most monotonous and annoying parts of our jobs, hopefully these little tools will inspire you to start scripting your way to a smoother build/release cycle. --- # The Apple Voice By Jake Marsh, February 11, 2012. Canonical URL: https://deallocatedobjects.com/posts/the-apple-voice This is a link post about http://zachholman.com/posts/the-apple-voice/ [Zach Holman](https://twitter.com/#!/holman) does a great job of succinctly describing something that I've been having trouble quantifying into words for a while now. > Apple commands their words exceedingly well. They aren’t the originator — or even the owner — of their particular voice, but they are the most visible. > Mechanically, The Apple Voice is characterized by short, declarative sentences that are informally and personally delivered to you with a hint of smugness. The Apple "voice", as Zach names it, is probably one of the most underrated parts of Apple's success. Zach goes on to talk about how you can shape and choose your company or product's "voice". **The upshot:** You need to do this. *This matters*, a lot. --- # Phantom Buttons on the iPad's Split Keyboard By Jake Marsh, February 11, 2012. Canonical URL: https://deallocatedobjects.com/posts/phantom-buttons-on-the-ipad's-split-keyboard This is a link post about http://ios.finerthingsin.com/post/16982049392/ipad-keyboard-phantom-buttons Yet another example of details that 99.9% of users would never notice but use constantly. > The iPad’s split keyboard has phantom buttons. If you’re used to typing Y with your left hand, you can. > To enable this keyboard, tap-hold on the “toggle keyboard” button in the lower right to get a menu, or tap-hold on it and drag upwards. Reverse that to reunite the two halves back to normal at the bottom. ![Screenshot](https://deallocatedobjects.com/media/ca72b810569a.png) I love discovering little tid bits like this. Apple (among others) manage to sprinkle them in the strangest and most obvious places. --- # QuickLook Plugin for Mobile Provision Files By Jake Marsh, January 22, 2012. Canonical URL: https://deallocatedobjects.com/posts/quicklook-plugin-for-mobile-provision-files This is a link post about http://www.macmation.com/blog/2011/10/quicklook-plugin-for-mobile-provision-files/ How many times has this happened to you? > - I received the new mobileprovision file. - Great. - No. - What? - You still haven’t added my UDID in it. - I have. - No you have not. - Yes I have. - No you haven’t. - Yes. - No! Why don’t you just
 - 
 - Look, I’m sure. Can you generate it again? - Ok, I will. Wait
 ok, it’s done. - Let me check. No, sorry, still not ok. - Are you sure? [END OF CHAT CONVERSATION CENSORED] MacMotion brings something to relieve the pain (slightly) of dealing with Apple Provisioning Profiles, and it uses one of my favorite OS X features, QuickLook. After [installing MacMotion's new QuickLook plugin](https://web.archive.org/web/20120115084411/http://www.macmation.com/blog/2011/10/quicklook-plugin-for-mobile-provision-files/) Simply press the spacebar on any `.mobileprovision` file in the finder and instead of some boring 1 line summary, you'll get something like this: ![Screenshot](https://deallocatedobjects.com/media/e54499a8e44f.png) It also has some great enhancements to Finder icons to quickly tell you if a profile is valid or not. You can [download the plugin here](https://web.archive.org/web/20120115084411/http://www.macmation.com/blog/2011/10/quicklook-plugin-for-mobile-provision-files/) (at the bottom of the post). --- # Parse JSON Directly into NSManagedObjects By Jake Marsh, January 22, 2012. Canonical URL: https://deallocatedobjects.com/posts/parse-json-directly-into-nsmanagedobjects This is a link post about http://www.cimgf.com/2012/01/11/handling-incoming-json-redux/ [Tom Harrington](https://twitter.com/#!/atomicbird) brings us another insanely valuable little bit of code that does some simple, yet awesome things with a parsed NSDictionary of JSON content: > - Provide a safe, generic alternative to Cocoa’s -setValuesForKeysWithDictionary: for use with NSManagedObject and its subclasses - Handle cases where JSON data didn’t match up with what the managed objects expected. Getting a string where you expect a numeric value, or vice versa, for example, or getting a string representation of a date when you want a real NSDate object. Basically Tom is examining his managed object's defined properties, and then looking into the NSDictionary he got when he parsed some JSON, and if any of the property key names exist in both structures, he sets the value. The end result is being able to do something like this: ``` objc [myObj setValuesForKeysWithDictionary:jsonDict]; ``` I love little tools and case studies like this as they always help to enlighten more of us to the awesomeness that is the Objective-C runtime. --- # iPad Retina Images Found in iTunes U and iBooks 2 Files By Jake Marsh, January 22, 2012. Canonical URL: https://deallocatedobjects.com/posts/ipad-retina-images-found-in-itunes-u-and-ibooks-2-files This is a link post about http://9to5mac.com/2012/01/19/more-ipad-retina-images-found-in-ibooks-2-files/?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed%3A+9To5Mac-MacAllDay+%289+to+5+Mac+-+Apple+Intelligence%29 This one is sort of a given these days, but appears we now have even stronger evidence that the almost-certainly forthcoming iPad 3 will have a *Retina* class screen. Shown here is an iPad bookmark image resource with an *@2x* version: ![iBooks 2 Retina Image Resource Screenshot](https://deallocatedobjects.com/media/95e65e5b3ce7.png) > We have been finding references to 2X iPad images for [well over a year](http://9to5mac.com/2011/06/14/ios-5-sdk-includes-retina-display-graphics-for-next-generation-ipad/) (including iBooks 1.2), (...) I'm posting about this as a *nudge-nudge* to my fellow iOS developers to keep this in mind if you are starting out on any new iPad projects, you'll need to whip up a new *2048×1536* resolution Photoshop document. Should make designing iPad apps a little more *interesting*. --- # Misconceptions About iOS Multitasking By Jake Marsh, January 2, 2012. Canonical URL: https://deallocatedobjects.com/posts/misconceptions-about-ios-multitasking This is a link post about http://speirs.org/blog/2012/1/2/misconceptions-about-ios-multitasking.html Fantastic writeup from [Fraser Speirs](https://twitter.com/fraserspeirs) about iOS's multitasking capabilities and behavior. He goes into great detail about the ins and outs of things and covers all the different scenarios really well. The problem is this: > If someone tells you that all the apps in the multitasking bar are running, using up memory or sucking power, they are wrong. I too have heard the "advice" quite a bit recently that users should "clear out" their multitasking tray to "free up" memory and improve performance. This would be bad enough coming from "your buddy who read it on some forum", but apparently there are [reports](https://twitter.com/#!/edfladung/status/153918479915950080) of Apple Genius Bar employees feeding this crap out to members of the unknowing public. For the last time, (Fraser puts it perfectly): > The iOS multitasking bar does not contain "a list of all running apps". It contains "a list of recently used apps". The user never has to manage background tasks on iOS. Most iOS developers know this stuff like the back of our hands, but it's important to remember that most of your users have no idea how any of this stuff is "supposed" to work. --- # Zucchini: iOS Testing Written in Ruby & CoffeeScript By Jake Marsh, December 23, 2011. Canonical URL: https://deallocatedobjects.com/posts/zucchini-visual-ios-testing-written-in-coffeescript This is a link post about http://www.zucchiniframework.org/ [Zucchini](https://web.archive.org/web/20120107231845/http://www.zucchiniframework.org/) is an awesome [cucumber](https://web.archive.org/web/20120101212428/http://cukes.info/)-like visual testing framework for iOS. It works in a pretty awesome way by compiling [CoffeeScript](http://coffeescript.org/) down to [UIAutomation](https://web.archive.org/web/20120102170531/http://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/_index.html)-compliant Javascript, and then running the test with Instruments.app's command-line tool. Also, As their site describes further, the whole system works very much like [Cucumber](https://web.archive.org/web/20120101212428/http://cukes.info/), the popular ruby/rails testing gem: > A Zucchini feature file consists of sections bound to contexts of different application screens. Every screen you proceed to needs to be backed up by a CoffeeScript class describing all UI elements you want Zucchini to interact with as well as custom actions you feel like performing on that screen. Here's an example of one such class: ``` coffeescript class PostScreen extends Screen anchor: -> view.navigationBars()["Post"] constructor: -> super 'post' extend @elements, 'Post': -> view.navigationBars()["Post"].buttons()["Post"] extend @actions, 'Type "([^"]*)"$': (text) -> messageArea = view.elements()['Message Text Area'] messageArea.setValue text ``` Zucchini has an impressive set of features including: * Using a natural language for interaction scenarios, such as `Then on the "Menu" screen:`, etc. * The ability test/compare against screenshots. * Integration with Jenkins for full-on regression testing. > Zucchini only runs on Mac OS X 10.6 and 10.7 and requires XCode 4.2 as well as Ruby (at least 1.8.7). [The Zucchini site](https://web.archive.org/web/20120107231845/http://www.zucchiniframework.org/) is full of really helpful links and installation instructions, so check it out, you can also find [the Zucchini project on Github here](https://github.com/playup/zucchini). --- # Creating the iOS 5 UITableView Bevel Effect By Jake Marsh, December 15, 2011. Canonical URL: https://deallocatedobjects.com/posts/creating-the-ios-5-uitableview-bevel-effect This is a link post about http://www.tim-oliver.com/2011/10/23/creating-the-uitableview-bevel-effect-in-coregraphics/ Oh man, I wish I had found [Tim Oliver](https://twitter.com/#!/Tim0liver)'s [writeup about this](https://web.archive.org/web/20111130221631/http://www.tim-oliver.com/2011/10/23/creating-the-uitableview-bevel-effect-in-coregraphics/) sooner (includes diagrams and sample code). I just wrote all of this code myself, and had to do all of my own research. Serves me right for not properly Googling. *Pro Tip*: Google everything before you begin coding a solution for a problem you assume everyone in your field must have. You see, in iOS 5, Apple refreshed the look of a standard `UITableViewStyleGrouped` style `UITableView`. (You know, the ones with the rounded corners). No longer were they actually white (like `255, 255, 255` or `#FFFFFF`). They were now a refreshing shade of `255, 255, 255, 0.8`. That's still pure white, but with an opacity of *80%*. Also, they added a 1 point tall drop shadow, as well as a 1 point tall inner shadow to each `UITableViewCell`. They've also still got a 1 point border around them. I actually think the new cells looks *much* better, but they definitely break any custom code anyone had written to make their own custom UI or buttons match `UIKit`'s. I can't tell you how often I need to replicate this look and feel. Glad someone put together [a comprehensive article about the topic](https://web.archive.org/web/20111130221631/http://www.tim-oliver.com/2011/10/23/creating-the-uitableview-bevel-effect-in-coregraphics/). *Pro Tip #2*: This is a pretty small detail, and sure, most people probably won't even notice. However, in my own anecdotal side-by-side tests, I was able to get an Oh this looks much better! reaction out of people by simply making my custom drawn stuff correctly match the system drawn bits. --- # Connect, Discover, Edit, Inspect, Customize By Jake Marsh, December 13, 2011. Canonical URL: https://deallocatedobjects.com/posts/connect-discover-edit-inspect-customize This is a link post about http://tidbits.tedchoward.com/2011/12/12/what-does-discover-mean.html#fn-2-2011-12-12 A brilliant article by my buddy [Ted Howard](https://twitter.com/#!/tedchoward) on the trials and tribulations of properly naming pieces of your user interface. > We needed a name for the button that brought up the stack editor. We wanted to convey to the user that launching the editor was a safe operation, that any changes they made would not be applied to the stack they were viewing. For that reason, we didn’t want to use ‘Edit’, because ‘Edit’ made it sound like you could modify something that someone else had made. We had many long conversations and debates about what to call the button. The thesaurus was consulted. Finally we chose a word: ‘Customize this stack’. A good user interface can be killed by forgetting to think about these crucial details. Kudos to Ted for reminding us. --- # Using Blocks for Drawing By Jake Marsh, December 11, 2011. Canonical URL: https://deallocatedobjects.com/posts/using-blocks-for-drawing This is a link post about http://www.davidhamrick.com/2011/08/07/using-blocks-for-drawing-to-avoid-subclasssing-in-objective-c.html I'm absolutely in love with the technique [David Hamrick](https://twitter.com/#!/davidhamrick) lays out in this post. > Instead of subclassing UIView every time we need to draw something what if we were to have one subclass that allowed us to pass in a block that performed the drawing code. So I’ve created a class called DrawView that does exactly that. It also passes itself and the graphics context since that was going to be needed in every block’s implementation so including them as parameters reduced the amount of boiler plate code needed. It's a pretty simple idea: you shouldn't need to subclass just to do a tiny bit of custom drawing. Now you don't have to. With David's simple `DrawView` class, you can do your drawing like this: ``` objc DrawView *drawableView = [[[DrawView alloc] initWithFrame:CGRectMake(0.0 ,0.0, 320.0, 50.0)] autorelease]; drawableView.drawBlock = ^(UIView* v,CGContextRef context) { CGPoint startPoint = CGPointMake(0,v.bounds.size.height-1); CGPoint endPoint = CGPointMake(v.bounds.size.width,v.bounds.size.height-1); CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor); CGContextSetLineWidth(context, 1.0); CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5); CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5); CGContextStrokePath(context); }; [self.view addSubview:drawableView]; ``` I wouldn't be surprised to see something like this show up in a future update to `UIKit`. Apple is starting to use blocks everywhere. This is just good sense. --- # Attaching a UIView to the UIScrollViewIndicator By Jake Marsh, December 11, 2011. Canonical URL: https://deallocatedobjects.com/posts/attaching-a-uiview-to-the-uiscrollviewindicator This is a link post about http://blog.madefm.com/post/13817640556/ios-devcorner-attaching-an-info-panel-to-a Here's a neat little write up (sample code included) from [Florian Mielke](https://twitter.com/#!/FlorianMielke/) of how to replicate [Path 2.0](https://web.archive.org/web/20111214213951/https://path.com/)'s neat behavior of "attaching" a timestamp indicator that follows iOS's built-in scroll indicator as you scroll. > The basic idea is to add the info panel’s root layer as a sublayer to the indicator’s root layer. With that, the info panel scrolls smoothly and stays in parallel to the indicator automatically. In the case were the scroll view hit the edges, we want the info panel to stay visible at the top or bottom of the screen, so we need to do some extra calculation to let it stay centered.
![Screenshot](https://deallocatedobjects.com/media/229b7bebd039.png)
Love the technique, can't wait to see something like this start showing up in more apps. I think anything that intuitively allows developers and designers a way to remove ugly information like timestamps from rows of data is awesome. *Update*: Here's a [web-based implementation of the same effect](http://jsfiddle.net/michaelhue/7NAvm/7/light/). --- # Remote Debugging UIWebView By Jake Marsh, December 6, 2011. Canonical URL: https://deallocatedobjects.com/posts/remote-debugging-uiwebview This is a link post about http://hiediutley.com/2011/11/22/debugging-ios-apps-using-safari-web-inspector/ [Hiedi Utley](https://twitter.com/#!/hiediutley/) has completely brought the awesome with a way to use desktop Safari's WebKit inspector to debug iOS `UIWebView` objects: > Wow! What a day! While researching debugging techniques for an upcoming training class I am teaching on PhoneGap, I stumbled over a couple of blogs about a private API in iOS5 that will allow you to debug your UIWebViews right inside desktop Safari using the Web Inspector! Enabling the trick requires part of a private API in iOS 5, so don't ship it. It does seem to work great though, and it's pretty simple: ``` objc - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Uncomment to enable remote debugging [NSClassFromString(@"WebView") _enableRemoteInspector]; return YES; } ``` Then open up desktop Safari and head over to [http://localhost:9999](http://localhost:9999). It requires that you be running iOS 5 and running inside the iOS Simulator, but still, what a HUGE help. (via [Mike Rundle](https://twitter.com/flyosity)) *Update:* Turns out [Nathan de Vries](https://twitter.com/#!/atnan) did a lot of the original research and discovery on this one, here's his original (and in-depth) write up of it: [Enabling Remote Debugging via Private APIs in Mobile Safari](https://web.archive.org/web/20111129160255/http://atnan.com/blog/2011/11/17/enabling-remote-debugging-via-private-apis-in-mobile-safari/) --- # Android Graphics Truth Facts By Jake Marsh, December 6, 2011. Canonical URL: https://deallocatedobjects.com/posts/android-graphics-truth-facts This is a link post about https://plus.google.com/100838276097451809262/posts/VDkV9XaJRGS [Andrew Munn](https://twitter.com/#!/andrewmunn) points out a simple truth about Android vs. iOS graphics rendering: > It’s because on iOS all UI rendering occurs in a dedicated UI thread with real-time priority. He also clarifies: > 1. Compositing and previously set-up animations—all the stuff that involves the Core Animation rendering layer tree—do indeed happen on a background thread. > 2. Drawing new content into Core Animation layers and setting up their animations happens on the main thread. This is the same thread that user interface actions occur on. > 3. In naively written code, all developer-written code would occur on the main thread. However, Apple provides very easy APIs (Grand Central Dispatch and `NSOperation`) to move things into system-managed background threads. In iOS 5, you can even declare that a Core Data (object-relational database) context cannot be used directly on the main thread. I love that we're finally starting to see some in-depth writing about the meat of these issues. Pretty much everyone I speak to on a regular basis tells me "Android just feels laggy" or something of that nature. I can't speak to the specific causes of Android's hiccups in this department, but Andrew's post sounds pretty accurate to me in regards to Core Animation and UIKit rendering behavior. --- # Gradient.app By Jake Marsh, December 1, 2011. Canonical URL: https://deallocatedobjects.com/posts/gradient-app This is a link post about http://www.gradientapp.com/ A fantastic little OS X app here for configuring CSS gradients. The interface of Gradient is really fantastic and pretty close to perfect of this simple task. ![Screenshot](http://f.cl.ly/items/0L3F2y2O0f0U290m2t25/Image%202011.12.01%209:06:06%20AM.png) You simply choose your color, and generate the CSS. It has all sorts of configuration options to support every modern browser. ![Screenshot 2](http://f.cl.ly/items/0D2P400g2I2A000r271l/Image%202011.12.01%209:06:40%20AM.png) Love little tools like this. It's $4.99 in the app store, [grab it here](https://web.archive.org/web/20111203035412/http://itunes.apple.com/us/app/gradient/id481981128?ls=1&mt=12). --- # SNRFetchedResultsController By Jake Marsh, November 27, 2011. Canonical URL: https://deallocatedobjects.com/posts/snrfetchedresultscontroller This is a link post about https://github.com/indragiek/SNRFetchedResultsController > `SNRFetchedResultsController` is a "port" (not exactly) of `NSFetchedResultsController` from iOS to OS X. It is not a drop in replacement for `NSFetchedResultsController`, but performs many of the same tasks in relation to managing results from a Core Data fetch and notifying a delegate when objects are inserted, deleted, updated, or moved in order to update the UI. As someone who is primarily an iOS guy, having this class around makes the thought of doing some larger Mac OS X and AppKit-based stuff much more inviting. Implementing it is this easy: ``` objc NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:context]; request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"year" ascending:YES], nil]; request.predicate = [NSPredicate predicateWithFormat:@"wheels.@count != 0"]; request.fetchBatchSize = 20; self.fetchedResultsController = [[SNRFetchedResultsController alloc] initWithManagedObjectContext:context fetchRequest:request]; self.fetchedResultsController.delegate = self; NSError *error = nil; [self.fetchedResultsController performFetch:&error]; if (error) { NSLog(@"Unresolved error: %@ %@", error, [error userInfo]); } ``` ``` objc - (NSInteger) numberOfRowsInTableView:(NSTableView *)aTableView { return [self.fetchedResultsController count]; } - (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { return [self.fetchedResultsController objectAtIndex:rowIndex]; } ``` ``` objc - (void) controller:(SNRFetchedResultsController *)controller didChangeObject:(id)anObject atIndex:(NSUInteger)index forChangeType:(SNRFetchedResultsChangeType)type newIndex:(NSUInteger)newIndex { switch (type) { case SNRFetchedResultsChangeDelete: [self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:index] withAnimation:NSTableViewAnimationSlideLeft]; break; case SNRFetchedResultsChangeInsert: [self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:newIndex] withAnimation:NSTableViewAnimationSlideDown]; break; case SNRFetchedResultsChangeUpdate: [self.tableView reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:index] columnIndexes:[NSIndexSet indexSetWithIndex:0]]; break; case SNRFetchedResultsChangeMove: [self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:index] withAnimation:NSTableViewAnimationSlideLeft]; [self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:newIndex] withAnimation:NSTableViewAnimationSlideDown]; break; default: break; } } ``` `SNRFetchedResultsController` is created by [Indragie Karunaratne](http://twitter.com/#!/indragie). He has been rocking the Mac OS X open source stuff lately and this latest one doesn't disappoint. --- # Compiling Doom 3 in Xcode 4 By Jake Marsh, November 27, 2011. Canonical URL: https://deallocatedobjects.com/posts/compiling-doom-3-in-xcode-4 This is a link post about http://fabiensanglard.net/doom3_macosx/index.php [Fabien Sanglard](http://twitter.com/#!/fabynou) brings us an extremely comprehensive guide to getting the [recently](http://www.engadget.com/2011/11/23/doom-3-source-code-available-now-gory-customizations-welcomed/) open-sourced [Doom 3 source code](https://github.com/TTimo/doom3.gpl) up and running on OS X using Xcode 4. Love it: ![Doom 3 Screenshot](http://f.cl.ly/items/2j473S0L1h2W3k2i3a09/step13.png) --- # Scrapbook of an Advanced Core Animation View By Jake Marsh, November 18, 2011. Canonical URL: https://deallocatedobjects.com/posts/scrapbook-of-an-advanced-core-animation-view This is a link post about http://www.macresearch.org/cocoa-scientists-xxxiv-scrapbook-advanced-core-animation-view Found this article that [Drew McCormack](https://twitter.com/#!/drewmccormack) put together while searching around for some CoreAnimation techniques this afternoon. It basically covers the process of conceptualizing, imagining, wire framing, designing, implemented, performance tuning and testing a really awesome CoreAnimation interface. ![Screenshot](https://deallocatedobjects.com/media/6572fa08403f.png) These type of complete, comprehensive guides are quite rare in the Mac/iOS world and Drew really brings the awesome with it. I highly suggest you [check it out](https://web.archive.org/web/20111127002616/http://www.macresearch.org/cocoa-scientists-xxxiv-scrapbook-advanced-core-animation-view). --- # iOS Settings Shortcuts By Jake Marsh, November 18, 2011. Canonical URL: https://deallocatedobjects.com/posts/ios-settings-shortcuts This is a link post about http://brdrck.me/settings/ ![iOS Settings Shortcuts](https://deallocatedobjects.com/media/d72a6d436912.png) From the uber-talented [Jeff Broderick](http://twitter.com/brdrck) comes [this beautiful and awesome collection of iOS homescreen shortcuts](https://web.archive.org/web/20111121234106/http://brdrck.me/settings/) to the major parts of iOS's settings app. Finally, you can have beautiful, quick ways to get to the parts of Settings.app you use the most. Also make sure to check out [Jeff on Dribbble](http://dribbble.com/brdrck), his work is awesome! --- # On Skeuomorphism By Jake Marsh, November 3, 2011. Canonical URL: https://deallocatedobjects.com/posts/on-skeuomorphism
![iPad Calendar & Contacts](https://deallocatedobjects.com/media/bbe0cb596fdf.jpg)
Skeuomorphism is a fantastic technique and I couldn't be happier with how it is used in the design of some applications. When used both properly and effectively, I believe it can lead to some of the best user interfaces the world has seen. The "official" definition: > A skeuomorph or skeuomorphism is a derivative object that retains ornamental design cues to a structure that was necessary in the original. In our world it's actually something a little more specific. I think my buddy [Mike Rundle](https://twitter.com/#!/flyosity) summed it up best in his [post on Hacker News](http://news.ycombinator.com/item?id=3193103) today: > There's a difference between "looking like something I'm familiar with" and "working like something I'm familiar with". The problem with bad skeuomorphic design is when it looks familiar but doesn't act like the thing it's mimicking. I couldn't agree more. I would take it a step further and say that the interactions of such an interface need to be intuitive and discoverable on the platform. Take this app:
![Korg iELECTRIBE](http://f.cl.ly/items/3x2W2h2Z2f0b0q3b2p1U/Korg_iELECTRIBE_Gorillaz_Front.jpeg)
Yes, it does *somewhat* resemble a real world object. But, putting aside my own personal disdain for how hideous it looks, it has a major flaw: *It is not usable*. The minimum usable height for tap targets on iOS is *44 points*. Take `UIBarButtonItem` for example, here's one:
![UIBarButtonSystemItemAction](http://f.cl.ly/items/442p1p1R2N0C1b2N213J/Screen%20Shot%202011-11-03%20at%208.26.55%20PM.png "UIBarButtonSystemItemAction")
The good folks over at Korg completely ignore this fact. They have many buttons that are only 20 points tall. This not only makes the buttons hard to tap, but their placement makes the virtual "knobs" quite difficult to interact with. Also, given the large and clumsy nature of our pointing devices (otherwise known as "fingers"), turning virtual knobs is a very non-intuitive method of choosing a value from a range of values on a digital screen. A better way of handling this type of interaction could be something like the iOS movie player, which allows you to intuitively scrub through the timeline of the movie at high and slow speeds depending on the vertical position of your finger after beginning your action. My point is that an app doesn't have to completely replicate the real-world interface to which it's referring. You merely have to remind the user with subtle but recognizable visual cues, then embrace the platform. [The Early Edition 2](https://web.archive.org/web/20120317000124/http://itunes.apple.com/us/app/the-early-edition-2/id471813327?mt=8) for iPad does a pretty great job of this:
![The Early Edition 2](http://f.cl.ly/items/0K0d0Z3O2c3c1G3w3p1C/tee2-screen1c-s.png)
![The Early Edition 2 Sharing Screen](http://f.cl.ly/items/023B0r050q3z1G1B332z/tee2-screen4-s.jpeg)
Their story-sharing screen is one of my favorites in any app, you really have to see the animations and interactions to truly appreciate it. They remind the user of a newspaper, even allow you to pull down the corner of the page and turn to the next, but they don't go too far. They don't make you un-fold the paper, shake to make the ads fall out, or (an unrelated rant) throw in full page ads in between the content you're trying to read. Their sharing screen is so elegant. It sort of mentally nudges you into understanding what's going on by emulating a manila envelope, even taping it closed for you. Then we come to this little bastard:
![Find My Friends](http://f.cl.ly/items/032V2j2S2K082b3T1i07/find-my-friends-ipad-screenshot-001.jpeg)
It resembles no actual recognizable interface or object (other than maybe a super shiny baseball glove or a native american friend-finding dreamcatcher). It is themed, at least it would seem, for the sake of being themed. At a glance, it doesn't necessarily look bad, it just doesn't make much sense. Apple has top-notch designers. I almost feel bad bringing Find My Friends up as it has been sort of hammered to death recently. However, I couldn't finish out this post without mentioning it. If you aren't going to make a *truly* skeuomorphic interface, but are just going for a good looking app, then use textures and patterns with extreme care. Your users, and hyper critical bloggers like myself, will thank you. --- # Slide Design for Developers By Jake Marsh, October 31, 2011. Canonical URL: https://deallocatedobjects.com/posts/slide-design-for-developers This is a link post about http://zachholman.com/posts/slide-design-for-developers/ Great slides make for great presentations. But more than that, great slides really help people understand the information you're trying to present to them. [Zach Holman](https://twitter.com/#!/holman) outlines the finer points of this in a post on slide design targeted towards developers. > My slides are not designed for people who didn’t see the talk in person. They’re designed to support my words, not some online audience. What’s more, many commented that they found the *design of the slides* to be noteworthy. I’m expressly *not* a designer. You really have to give Zach's post a read, there's a ton of great information in it, and to be honest, I'm loving the design of his slides, the typography really shines. --- # Linens 'n Things By Jake Marsh, October 28, 2011. Canonical URL: https://deallocatedobjects.com/posts/linens-n-things If you'll indulge me, I'd like to take a minute to talk about this little bastard:
![Linen](https://deallocatedobjects.com/media/2ea05c3a802e.png)
In recent months, the conversation amongst many of my designer friends has often drifted to something like this: > What the hell is with all the crazy textures and patterns in Apple's user interfaces lately? I personally don't really mind all the texture, it's usually used fairly tastefully, and doesn't bother me at all. I gained some insight into Apple's use of texture by reading [this post](http://mrgan.tumblr.com/post/11090229578/steve) by [Nevan Mrgan](https://twitter.com/#!/mrgan). Perhaps we can attribute everything, from the horizontal stripes of OS X's Aqua, or the vertical pinstripes of iOS's `UITableView`, to Steve. However, ever since I first saw Notification Center, something didn't quite make sense to me. First, a couple of important user interface metaphors in iOS: ### Notification Center The metaphor of the main Notification Center panel is that it slides down over whatever content is currently on your device's screen. ### Multitasking Tray Here there's a similar interfacing layering metaphor going on. No matter what part of the OS you're in, double-tapping the home button causes whatever content is on your screen to slide up, revealing a "tray" containing icons of your most recently used applications. Both of these interfaces have our friendly neighborhood linen as their background texture. On their own, this wouldn't be too much of an issue but consider what Apple's goals are with the linen texture. I would argue it is to establish a clear *hierarchy* of content and controls, from *back* to *front*. The linen was used early on as the "underneath" texture of `UIScrollViews` and `UIWebViews`. Assuming these goals, take a look at what's really going on here:
![Strange Z-Order](https://deallocatedobjects.com/media/2676116c3f81.png)
The linen texture now shows up at *multiple* points in the hierarchy. This completely destroys the illusion of seeing *behind* or *underneath* the layers of the user interface. I'd love to see Apple remedy this and assign clear layers to the different pieces of the interface. It could be as simple as revising Notification Center to have a simple black background with beveled section headers, similar to what the fantastic [Nik Radjenovic](https://web.archive.org/web/20140417222223/https://twitter.com/icontwist) mocked up and posted [on Dribbble](http://dribbble.com/shots/304014-Notification-Center). Shown here:
![MoreSensible Notification Center](https://deallocatedobjects.com/media/0824ba06d560.png)
Something like what Nik has mocked up would easily establish a *top* position for Notification Center, thus restoring balance and order to the force. Apple designers: please let the reign of the dark lords of linen end soon. --- # Subtle Design Changes in iOS 5 By Jake Marsh, October 28, 2011. Canonical URL: https://deallocatedobjects.com/posts/subtle-design-changes-in-ios-5 This is a link post about http://stam-design-stam.blogspot.com/2011/10/ios-5.html I always find it fun to try to spot all the tiny design differences in Apple's user interfaces whenever a new update comes out. A blog called [Design Archive](https://web.archive.org/web/20111212214509/http://stam-design-stam.blogspot.com/) has put together some comparison shots of iOS 4 and iOS 5 highlighting some of the more fun differences. Normally I would quote the site I'm linking to, but this one is in Japanese, and Google Translate doesn't exactly offer grammatically readable sentences either, so here's a few of the fun ones they found:
![Badge Shadow](http://f.cl.ly/items/3d1S3E1S3S1X3A1Q0A31/vm_01_iconbadge.jpeg) ![Home Icon Space](http://f.cl.ly/items/3R421G1g1c230g0L3h3p/vm_05_homeicon2.jpeg)
I love that Apple's designers revisit things like this so often. --- # CSS4 Selectors By Jake Marsh, October 27, 2011. Canonical URL: https://deallocatedobjects.com/posts/css4-selectors This is a link post about http://dstorey.tumblr.com/post/10865123182/selectors4 Looks like the [CSS Working Group](http://www.w3.org/Style/CSS/members) has published their [first working draft](http://www.w3.org/News/2011#entry-9219) of how they'd like CSS4 selectors to work. Here are some of the highlights: ``` javascript var el = document.querySelector("#foo"); // returns first element with ID of foo var bar = document.querySelector(":scope > p", el); // returns equivalent of "#foo > p" ``` ``` css li a:matches(:link, :hover, :visited) ``` ``` css a:local-link /* Matches anything that links to the current page */ a:local-link(0) /* Matches any link that is the same domain */ ``` There's tons more and [David Storey](http://about.me/dstorey) does a great job of explaining stuff in [his blog post](http://dstorey.tumblr.com/post/10865123182/selectors4). --- # Developer Color Picker By Jake Marsh, October 27, 2011. Canonical URL: https://deallocatedobjects.com/posts/developer-color-picker This is a link post about http://panic.com/~wade/picker/ Yes. This is so helpful it's not even funny. This little baby comes to us thanks to [Wade Cosgrove](http://twitter.com/wadeco). > A custom color picker designed specifically for developers. Makes getting colors out of Photoshop/Acorn mock-ups quick and easy. Currently supports NSColor, UIColor, CGColorRef, CSS and HTML styles.
![Screenshot](http://panic.com/~wade/picker/screenshot.png)
Supplements the features of the standard color picker in OS X. Simple and perfect. [Download it now](http://panic.com/~wade/picker/). --- # Accessing Image Properties Without Loading the Image By Jake Marsh, October 27, 2011. Canonical URL: https://deallocatedobjects.com/posts/accessing-image-properties-without-loading-the-image-into-memory This is a link post about http://oleb.net/blog/2011/09/accessing-image-properties-without-loading-the-image-into-memory/ I see this type of stuff a lot in other people's code: ``` objc UIImage *image = [UIImage imageWithContentsOfFile:@"lolcats.jpg"]; CGSize imageSize = image.size; ``` It's certainly not *wrong*, but you are incurring a huge performance and memory usage hit just to get the width and height of an image. Enter the `CGImageSource...` methods. > As of iOS 4, the SDK includes a better solution in the form of the `CGImageSource...` set of functions, which have been available on the Mac since forever. These functions allow you to access certain image metadata without having to load the actual pixel data into memory. [Ole Begemann](https://web.archive.org/web/20110820025141/https://twitter.com/olebegemann) has put together [a great article](http://oleb.net/blog/2011/09/accessing-image-properties-without-loading-the-image-into-memory/) explaining the ways around such performance hits, and how you can get pretty much any metadata you could want about an image, without incurring a performance or memory usage hit. --- # GAJavaScript By Jake Marsh, October 26, 2011. Canonical URL: https://deallocatedobjects.com/posts/gajavascript This is a link post about https://github.com/newyankeecodeshop/GAJavaScript Been wanting something like this for a long time. [`GAJavaScript`](https://github.com/newyankeecodeshop/GAJavaScript) is a Cocoa Touch library that makes working with JavaScript from inside native code much more tolerable, maybe even fun. > JavaScript is accessed from Cocoa Touch using UIWebView. GAJavaScript has the concept of a "script engine", which provides the primary interface to the JavaScript runtime inside the UIWebView. Essentially, the UIWebView is an implementation detail of this library, but you may want to manage the UIWebView instance used by the script engine. Some might say it's a nasty hack, but in certain situations I can see this totally coming in handy. I work on a product regularly that needs to facilitate complex communication between remote web view content and local native code, and boy, I really wish I'd known about this library back when I started that project. [`GAJavaScript`](https://github.com/newyankeecodeshop/GAJavaScript) was built by [Andrew Goodale](http://twitter.com/andrewg95) and if you like it you should definitely take a look at one of his other projects, [`GAViewStyling`](https://github.com/newyankeecodeshop/GAViewStyling) which is a neat little library letting you style `UIView` objects with `CSS` style declarations. --- # 7 Keys to Unlock an Apple Design Award By Jake Marsh, October 26, 2011. Canonical URL: https://deallocatedobjects.com/posts/7-keys-to-unlock-an-apple-design-award This is a link post about http://uxmag.com/articles/7-keys-to-unlock-an-apple-design-award > Delight is in the details. Subtle hints, humor, metaphor, animation, and beautiful visuals are some of the tools we use give our app character. Fantastic article on the things Apple Design Awards apps do to become so great. --- # Syncing Your App's Preferences with iCloud By Jake Marsh, October 25, 2011. Canonical URL: https://deallocatedobjects.com/posts/syncing-your-apps-preferences-with-icloud This is a link post about http://useyourloaf.com/blog/2011/10/24/sync-preference-data-with-icloud.html > One of the most interesting additions to iOS 5 was iCloud storage which makes it easy to sync data between apps running on different iOS and OS X devices. Effectively you can store key application data in the cloud and have it propagate to all instances of the app wherever they are running. Nice writeup about syncing `NSUserDefaults` data to iCloud using `NSUbiquitousKeyValueStore`. --- # Animate.css - a bunch of plug-and-play CSS animations By Jake Marsh, October 25, 2011. Canonical URL: https://deallocatedobjects.com/posts/animate-css This is a link post about http://daneden.me/animate/#cta > `animate.css` is a bunch of cool, fun, and cross-browser animations for you to use in your projects. Great for emphasis, home pages, sliders, and general just-add-water-awesomeness. Great little library for generating a pre-made `.css` file filled with ready-to-use CSS3 keyframe animations. Useful and a good way to learn about doing animations like this in CSS. --- # Nest - The Learning Thermostat By Jake Marsh, October 25, 2011. Canonical URL: https://deallocatedobjects.com/posts/nest This is a link post about http://www.nest.com/living-with-nest/index.html From former members of the iPod and iOS design teams, interface design by [Mike Matas](http://www.mikematas.com/#!2Rs/2iiB/ui_design/nest_learning_thermostat) > No more programming, no more constantly changing the temperature. The NestTM Learning ThermostatTM programs itself in a week to keep you comfortable and save energy. ![Nest Thermostat](https://deallocatedobjects.com/media/dde6f38365e1.png) Neat idea, price is a little steep at *$249* but the idea is so simple and elegant it could catch on. --- # How the CSS Animations on Apple's iPhone 4S Page Work By Jake Marsh, October 25, 2011. Canonical URL: https://deallocatedobjects.com/posts/an-explanation-of-the-css-animation-on-apple's-iphone-4s-webpage This is a link post about http://johnbhall.com/iphone-4s/ Love seeing stuff like this, really helps illustrate how far the web has come. --- # IRIS 9000 Voice Control Module for Siri By Jake Marsh, October 25, 2011. Canonical URL: https://deallocatedobjects.com/posts/iris-9000-voice-control-module-for-siri This is a link post about http://www.thinkgeek.com/gadgets/cellphone/eb7d/ Oh man. ![Iris 9000](http://f.cl.ly/items/3v1k202Y0n0S272N0S2p/Screen%20Shot%202011-10-25%20at%2012.49.47%20PM.png) > Simply place your iPhone into the Iris 9000 cradle and use the included micro remote to trigger Siri up to 50 feet away. Just tap the Iris 9000 remote button once, listen for the Siri chime, and speak your command. The built in mic on the Iris 9000 picks up your voice from across the room and the embedded speaker amplifies Siri's spoken responses. Can't wait to get one of these, says they're coming in 2012. --- # What If Apple Made a TV? By Jake Marsh, October 25, 2011. Canonical URL: https://deallocatedobjects.com/posts/what-if-apple-made-a-tv Let me just say that I'm still rather undecided as to whether or not Apple will in fact bring their own television set to market. I did, however, find it a really fun challenge to try to imagine what a *true* Apple TV might be a like. Take from it what you will. First off let's assume a few things. Let's just assume, for the sake of this article, that Apple is unrestrained in terms of having to bend to the whims of the content owners, cable companies and "traditional" television business practices. We all know this antiquated business is clinging on to their archaic business plans with a death grip of what I like to call *future-blindness*. What I'm going to describe is what an Apple TV might be like in a world where these problems had been solved or surpassed somehow. ### The Hardware #### Form Factor Simple. 3 sizes. 30 inch, 40 inch, and 50 inch screen models. Each with a 7 millimeter black bezel around the edge. No Apple logo on the front. #### Input & Output Ports 2 HDMI inputs. 1 ethernet port. Built-In 802.11n WiFi. iMac style removable power cord. 1 optical out port. 1 Thunderbolt port allowing you to use the TV as a monitor, or to connect an external hard drive, or many other peripherals. #### The Remote An iPod Touch. In the box, included with the purchase of the TV. Comes pre-installed with new version of the official Remote app. This new version of Remote.app uses Apple's Bonjour technology to automatically find the TV and begin guiding you through the setup process (more on that later). It has features that allow labeling and selecting of your 2 HDMI inputs, with pre-made beautiful icons for Xbox 360, PS3, Blu-ray players, etc. Much in the same way that Mac OS X displays beautifully renderred icons for most printers you connect to. Switch between the devices and your main TV with a simple scroll view control (similar to your iPhone's homescreen). ### Software and Content This is the fun part. Forget the entirety of the current Apple TV interface. #### Muggles & Luddites Apple makes products to serve the masses. The current Apple TV (the hockey puck shaped one) is awesome for geeks like you (assuming most reading this would consider themselves, at least in part, a geek). It does not however, serve the muggles and luddites out there who want to come home after a long day of work, flip on the TV, instantly be seeing some content, kick back, have a brewsky and take a load off. The hockey puck's software serves those of us who want to watch specific things at specific times very well, but doesn't even try to accomodate what I would call the "average" viewer. How do we solve this problem without also removing the power of the on-demand style viewing? You do both at once. Here's how it could work: You turn on the TV, it's instantly on, I'm talking no more than a second. There are channels, just like your current TV. They correspond to each of broadcast and cable networks. So there's an NBC channel, there's a Discovery channel, there's an ABC, a CBS, a Sci-Fi, a Food Network, etc, etc. Sound familiar? What is this channel showing? Well it's showing whatever would currently be on that channel at that time if you were watching a "regular" TV. Instead it's coming to you over the internet. The tech behind this is that Apple already has every single episode of all the shows they offer in iTunes. The networks and content providers often upload the whole season to Apple's servers ahead of time with scheduled release dates and times. So what Apple does is simply stream each of these episodes on their respective channels at their respective times. No commercials, for one monthly price (more on that later). I know what you're thinking, "But Jake! What about my live content?! News? Sports?" Don't worry, Apple has you covered, they've arranged deals with the major networks (again we're ignoring the difficulty of signing such deals) to simulcast these sorts of programs on their respective channels at their specific times. There's a CNN that is basically the same CNN you're used to seeing now. They even broadcast things like sports games, breaking news and "special extreme car-chase coverage" events in such a way that the viewer could choose, for example, to instead of watching that ball game that somehow has gone into 6 extra innings, watch tonight's epsiode of "Conan", which normally would have been pre-empted. Thanks to the Apple TV software, the viewer can choose to watch the ball game stream on TBS, or switch to the "regularly" scheduled program of "Conan". The remote simply displays a screenshot of both possible peices of content on that "channel" and the user can switch back and forth between them. The user can obviously now pause, rewind, and even fast-forward almost *anything* they are watching, no matter what. No more DVRs, no more scheduling, no more hassle. It all just works. Content is available to watch as soon as it would have broadcasted to "regular" TV. Movies are available to be viewed as soon as they are released in theaters. Think kicking back and watching "The Dark Knight Rises" at midnight on release night. (Again suspend your disbelief and pessimism about how insanenly difficult it would be to get board-room types to agree to this, we're into pie-in-the-sky, in-a-perfect-world type stuff here.) #### On-Demand Like I said before, many users would likely still want to pick and choose a show or movie at random to watch at their leisure. No problem, simply switch the "Browse" vs. "Live" toggle at the top of the app to "Browse", and instantly the app lets you browse through a beautifully redesigned iTunes store-like view to find a peice of content to watch. See something interesting? Drill in to read a full synopsis, see reviews, etc. Tap one button to watch a preview of any content you find, it will begin playing on your TV. Like what you see? Just tap "Start Watching Now" to start the full version of that piece of content from the beginning. Change your mind? Flip the "Browse" switch back to "Live" and you're controlling live TV again, the app never loses your place or stops playing. #### Other Content What about YouTube? Vimeo? They're gone. These are apps that are meant to live on the iPod Touch that came with your TV. All of these "external" sources of content are gone from this Apple TV. #### The Interface Almost non-existant. Almost everything happens on your Remote app on the screen of the included iPod Touch. The TV itself will display things like whether or not the TV is muted or not muted, or identifying information when the current program, channel, or input source changes (only for a brief moment of course). #### Under The Hood It's running iOS. It does *not* have an App Store. This is done purposefully to encourage developers to deliver content by using AirPlay. In Apple's world, The [Twit.tv](http://twit.tv)'s and [Revision3](https://web.archive.org/web/20111025080433/http://revision3.com)'s should make apps for the phone or tablet platforms that offer rich content browsing expieriences, with a simple AirPlay mechanism to "sling" it up to the TV, much as they encourage content providers to do today, with iOS 5 and the hockey puck model. It *does* support iCloud and can instantly browse through your photos, movies, etc. ### Pricing & Plans #### The Device Itself The new Apple TV starts at *$999* for the 30 inch model, *$1499* for the 40 inch, and *$1999* for the 50 inch model. #### The Content This one is the key. Apple is going to replace your cable company, your Netflix, your Hulu, everything. One plan, one signup, one monthly bill. The price? *$49 USD* a month. High enough to pay the content providers enough to make them happy, low enough to entice most people to make the switch. For your money, you get everything I've described above, all the content, all the movies, all the TV shows, anytime, all the time. No more buying single episodes, no more renting or buying movies. It's all right at your fingertips. ### Conclusion I hope you've enjoyed this hypothetical trip into the proverbial chocolate factory that is Apple's design studio. Just so we're clear, I do want Apple to make a TV. I'm sure it would be awesome, otherwise they wouldn't waste their time making it. I'd love to see some of the ideas I've described here in some form or fashion show up in that final product, but even if they don't, I'm sure it would still be something pretty great. --- # Grove Bamboo MacBook Backs By Jake Marsh, October 24, 2011. Canonical URL: https://deallocatedobjects.com/posts/grove-bamboo-macbook-backs This is a link post about http://www.grovemade.com/collections/bamboo-backs#command Received my Grove Bamboo Back for my Macbook Pro today. Here's my quick review: * They are really high quality, loving the sturdiness. * The adhesive was actually a lot more forgiving than I expected. * The built-in Apple logo is still slightly visible through the wood, not immediately noticeable, but visible in lower light rooms. Here's a hipster shot of what it looks like on my 15" Macbook Pro: ![Macbook Bamboo Back](http://f.cl.ly/items/1e3w3q2C3O1G3w0I293e/Image%202011.10.24%206:53:49%20PM.png "Macbook Bamboo Back") The guys over at [http://grovemade.com](Grove) are an awesome little company, they make some neat stuff, check them out if you get a chance. --- # The Metaphors Breaking The Future By Jake Marsh, October 24, 2011. Canonical URL: https://deallocatedobjects.com/posts/the-metaphors-breaking-the-future This is a link post about http://designedbygold.com/2011/10/the-metaphors-breaking-the-future/ > Calendar, Notes and Contacts are all explainable — they reference real world things (even if they shouldn’t). My Mum likes that her calendar looks more like a Filofax than Outlook 2003. Fair enough. A Filofax is a thing. I get it. And the Compass app is based on a compass. Another thing. > But I’m pretty sure there’s not a thing in my physical living room called a ‘Find My Friends’. The metaphor is empty. It’s not referring to anything. It’s just a leather texture. A great piece about skeuomorphic design by [Jon Gold](https://web.archive.org/web/20111101025743/http://designedbygold.com/) --- # Show TODO's And FIXME's As Warnings In Xcode By Jake Marsh, May 11, 2011. Canonical URL: https://deallocatedobjects.com/posts/show-todos-and-fixmes-as-warnings-in-xcode-4 ![](https://deallocatedobjects.com/media/a3c081884079.png) Here's a neat little snippet for Xcode 4 that will cause all of your `//TODO: ` and `//FIXME: ` comments in your code to appear as compiler warnings when you build. Here's how to use it: ### Instructions * Head over to your project's item in the Project Navigator (usually at the very top) * Find your target in the list of targets on the left, select it * Head over to the "Build Phases" tab. * Click the "Add Build Phase" in the bottom right of this screen. * In the editor that appears insert the bash script shown below. Now just build and you'll see all your `//TODO: ` and `//FIXME: ` comments have become warnings. I love this technique, it might not be right for everyone, but hope it helps someone. ### Bash Script For "Run Script" Build Phase KEYWORDS="TODO:|FIXME:|\?\?\?:|\!\!\!:" find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | perl -p -e "s/($KEYWORDS)/ warning: \$1/" You'll also be able to click on each of the warnings in the issue navigator to go right to the file and point in your code where you left the original `//TODO: ` or `//FIXME: ` Extra pro tip: Make sure you're using phrases to describe your `//TODO: ` comments like `//TODO: Handle this error gracefully`, and things like that. The phrases will show up in the issues list beside each warning. Credit for the little tidbit should go to "Tim" on the Cocos2D forums, (found after Googling for a bit), I believe his solution originally was intended for Xcode 3 and didn't work if you had spaces in your path name, my script here doesn't have those restrictions, still he should get full credit [here's his original post](http://cocos2d-central.com/topic/236-xcode-todos-and-fixmes/page__view__findpost__p__1005). --- # Save Time and Code With JMWhenTapped By Jake Marsh, April 27, 2011. Canonical URL: https://deallocatedobjects.com/posts/jmwhentapped I've just released a new little helper library for iOS development. It's called `JMWhenTapped`. It's is a simple little syntactical-sugar addition to all `UIView` objects, as well as any class that inherits from `UIView`. It allows you to assign touch-up, touch-down, and tapped (touched down then up) actions to a `UIView` object using a convenient blocks-style syntax. ### Installation Clone [the repo](http://github.com/jakemarsh/JMWhenTapped). Add the `JMWhenTapped` folder to your iOS 4 project. `#import "JMWhenTapped.h"` wherever you'd like to use the syntax. ### Examples & Usage Use it like this: ``` objc [myView whenTapped:^{ NSLog(@"I was tapped!"); }]; ``` Or like this: ``` objc [myView whenTouchedDown:^{ NSLog(@"I was touched down!"); }]; ``` And also like this: ``` objc [myView whenTouchedUp:^{ NSLog(@"I was touched up!"); }]; ``` ### The Different Actions The `whenTapped:` method should be used in cases where you simply want something to happen when the user taps on a view (i.e. you are concerned with performing some action when their finger is down then up, like changing to a "pressed" state.) The `whenTouchedDown:` method should be used when you want to trigger some action when the user touches down on your view. The `whenTouchedUp:` method should be used when you want to trigger some action when the user touches up on your view. ### Demo Included in [the repo](http://github.com/jakemarsh/JMWhenTapped) is a demo Xcode project that illustrates a quick example of how to use `JMWhenTapped`. --- # The Art Of The Reveal By Jake Marsh, March 18, 2011. Canonical URL: https://deallocatedobjects.com/posts/the-art-of-the-reveal Ever been so excited for a new app that you just can't wait till you get to download it? I'm going to tell you how to make people feel that way about your app. ### The Reveal What do I mean by "the art of the reveal"? It's the way you announce your new product. It's the way you release that product. It's even how you structure your business model around that product. The reveal happens every step of the way in software development. It appears in its most obvious and blatant form in places like the famous Steve Jobs keynote-style addresses. But it also shows up in the "Coming Soon" website for your app, and later in the website you create for announcing and releasing your new app on launch day. It even shows up in the way your company structures its business models and pricing offerings. Let me explain: ### The Reveal In Business Don't release 10 different versions of your app. Don't make your purchase options so confusing and daunting that your customers give up half way through. By all means make money, but think about every tiny detail from the consumer's perspective. This goes for all software. It doesn't matter if your business is building a super simple utility app for iOS, or a full-featured desktop word processing platform. Don't make the user think about *how* you are selling them something, make them think about *what* you are selling them. Price should be a feature. Don't price to sell. Price your app at what you would be willing to pay for it. Pricing your app appropriately also helps solidify your app's place in the market. Don't charge $9.99 for a flashlight app, but don't make a flashlight app that is only worth $0.99. Tweetie (now the official Twitter app for iOS) sold incredibly well at iTunes price tier 3 ($2.99 USD) for years. It did so because it was a fantastic app, which is what I will cover in the next section. ### The Reveal In Your Product Alright, first off: Do *not* make crap apps. Do *not* make apps to make a quick buck. Just don't do it. *Do* make apps that surprise and delight users with their simplicity, ease-of-use, performance, and of course, their look and feel. Okay, now that we have that out of the way:
Your users form their opinions in the first 10 seconds of using your app. Never forget that. Make those first 10 seconds as impressive and delightful as you possibly can. Take iMovie for iOS. Apple could have faded in from a black screen, and showed you an empty list of your movie projects. They could have made a nice looking list view with thumbnails, titles, movie durations, and it probably would look pretty nice. But no, they chose to make an opening screen that impresses and "wows" the user with the neatest little retro movie theater neon visual (shown above). The lights flickr, the marquee glows and you've even got full sound effects to go along with it. This is the art of the reveal working at its finest, if you were waiting to form your opinion about the app, this does it. Immediately your user feels gratified, and they feel like they've just made a good purchase. Never skimp on the details. Never underestimate the power of polish. ### The Reveal In Announcements It's all about the build up. Take the time to explain yourself, but be brief. Be direct. Make every sentence a soundbite. I can't stress that enough. If you are trying to get people both excited and interested in your product or service, do not oversell, just sell. These are clichés and I may just as well have told you to "Always Be Closing!", I know, but the art of the reveal is in making people hang on your every word. The art doesn't happen when you make a sale, the art happens when people are constantly clicking refresh on your site on launch day just waiting for the "Download Now" button to appear, so they can click it. Don't use buzz words. Use "because" words. Use words that explain how or why your app should matter to the user. People do not care about how you built your app. Do not drone on about technical specifications, or how your app downloads RSS feed entries in less than 10 milliseconds because you wrote an awesome multi-threaded subroutine that delays until the next run loop. Instead, tell people about the great auto-discovery feature that "just works." Explain to people *why* and *how* your app is going to change their life. People are selfish. They want to know the answers to a few simple questions: * What does it do? * What can I do with it? * When can I get it? This stuff is hard. If it were easy, everyone would do it. Know your audience. If possible, *be* your audience. Try not to build apps that you don't want to use yourself. This way, when it comes time to announce it, you'll know exactly what the coolest features are, and why. It's up to you whether or not you pre-announce anything about your app, but if you do, follow these rules. If not, read on to the "Releases" section. Want to see a master at work? Check out this clip of Steve Jobs announcing some improvements to the iTunes Store's movie offerings from Macworld back in 2008. This is a simple content announcement, but he manages to get screaming cheers and thundering applause from the crowd. How? He makes it exciting and displays one of the most classic examples of "the art of the reveal" I've ever seen. Check it out:
### The Reveal In Releases The first release of your app should be an event. Don't settle for any less. Pull out all of the stops. Any significant release of your app should be a similar spectacle. Never have a lame release. Take yourself seriously, but not *too* seriously. Make your release fun. Make it fun for your potential new users to see a link about your app on Twitter, visit its new release-day website, and then download it. Make discovering and learning about your app for the first time an *experience*.
Include a video on your release-website. *A* video. Singular. Do not make users click through 10 demo videos of all your app's features. Boil it down for them. Become a television commercial director. Do not use Flash for playing this video. Check out the promo video for Cultured Code's "Things for iPad" up above. It is a perfect example of what I'm talking about. Beautiful, simple, wonderfully effective. Make your website look great on all iOS devices, large and small. Make your website look great in all browsers. Again, details. Make them count. Do not ever settle just to get to market quicker. Don't release early just because you're done. Plan your release. Make it count. For example, if your app has a free and paid version, and the paid one gets approved into the App Store first, do not simply release it just because you're excited and want to get going. Wait. Release both versions simultaneously. Doing so will help sell your message of what exactly you are offering your users. You don't want to spoil the surprise when you press the button on release-day and launch your awesome release-day website. Create an awesome release-day website. It has to look amazing. It has to be visually stunning. It has to grab everyone's attention and make them go "What is that?!" Even for subsequent releases, have a special release splash on your website. Your release-day website for your app should be something you would link to on Twitter, even if you weren't involved with its creation. Think outside the box. I can't give you specific advice here. Make it fun, add some CSS animations, add some interactivity. Make those clouds at the top of your graphic move. That's the point, do something neat. Do something original. Impress people who stumble upon your little app. ### No One More Thing Here That's it. It can and should be as simple as that. I will likely be putting up more detailed posts on this topic, and user experience in your apps in general. Hope you enjoyed these tips, [let me know what you think on Twitter](http://twitter.com/jakemarsh). --- # Introducing: JMImageCache By Jake Marsh, February 19, 2011. Canonical URL: https://deallocatedobjects.com/posts/jmimagecache Today I'm open-sourcing a small project I use to do remote image downloading and caching on iOS called `JMImageCache`. It uses an `NSCache` based remote-image caching mechanism that can be easily integrated into any project. It is very light weight and isn't meant to be a replacement for `UIImageView` or anything like that. Just drop it into your project, grab a reference to it and start using it where ever it makes sense. ### How It Works (Logically) There are three states an image can be in: * Cached In Memory * Cached On Disk * Not Cached If an image is requested from cache, and it has never been cached, it is downloaded, stored on disk, put into memory and returned via a delegate callback. If an image is requested from cache, and it has been cached, but hasn't been requested this session, it is read from disk, brought into memory and returned immediately. If an image is requested from cache, and it has been cached and it is already in memory, it is simply returned immediately. The idea behind `JMImageCache` is to always return images the **fastest** way possible, thus the in-memory caching. Reading from disk can be expensive, and should only be done if it has to be. ### How It Works (Code) Request an image like so: ``` objc UIImage *mScott = [[JMImageCache sharedCache] imageForURL:@"http://dundermifflin.com/i/MichaelScott.png" delegate:self]; ``` `imageForURL:delegate:` will return either a `UIImage` object, or `nil`. If it returns `nil`, then that means the image needs to be downloaded. If the image needs to be downloaded, you'll be notified via a callback to the delegate object you specified in `imageForURL:delegate:`: ``` objc - (void) cache:(JMImageCache *)c didDownloadImage:(UIImage *)i forURL:(NSString *)url { NSLog(@"Downloaded (And Cached) Image From URL: %@", url); } ``` ### Clearing The Cache The beauty of building on top of `NSCache` is that`JMImageCache` handles low memory situations gracefully. It will evict objects on its own when memory gets tight, you don't need to worry about it. However, if you really need to, clearing the cache manually is this simple: ``` objc [[JMImageCache sharedCache] removeAllObjects]; ``` If you'd like to remove a specific image from the cache, you can do this: ``` objc [[JMImageCache sharedCache] removeImageForURL:@"http://dundermifflin.com/i/MichaelScott.png"]; ``` ### Demo App The [Github repository](https://github.com/jakemarsh/JMImageCache) includes a demo project. Just a simple `UITableViewController` app that loads a few images. It does so by calling `imageForURL:delegate:` and passing in the `UITableViewCell` as the `JMImageCacheDelegate` to respond to when an image is downloaded. Then we simply set the `image` of the cell's `imageView` and then call `setNeedsLayout` on the cell to refresh the view. Nothing too fancy, but it should give you a good idea of a standard usage of `JMImageCache`. ### Using JMImageCache In Your App All you need to do is copy `JMImageCache.h` and `JMImageCache.m` into your project, `#import` the header where you need it, and start using it. ### Notes `JMImageCache` purposefully uses `NSString` objects instead of `NSURL`'s to make things easier and cut down on `[NSURL URLWithString:@"..."]` bits everywhere. Just something to notice in case you see any strange `EXC_BAD_ACCESS` exceptions, make sure you're passing in `NSString`'s and not `NSURL`'s. --- # Custom Sections Title Selectors By Jake Marsh, October 31, 2010. Canonical URL: https://deallocatedobjects.com/posts/custom-sections-title-selectors Recently, I've been struggling with `NSFetchedResultsController`. I was trying to get it to section my objects by a "pretty date", but still have them sorted properly. Thanks to a great post on [stackoverflow](http://stackoverflow.com/questions/1384345/using-custom-sections-with-nsfetchedresultscontroller/), I realized the beauty and simplicity of just adding an Objective-C Category to the `NSDate` property on my model object. My managed object had a property called `scanTimestamp`, which was an `NSDate`. When configuring the `NSFetchedResultsController`, I was able to simply use `@"scanTimestamp.prettySectionHeaderDateSring"` as the `sectionKeyPath`. ``` objc NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"PKScan" inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"scanTimestamp" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; [fetchRequest setFetchBatchSize:20]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"scanTimestamp.prettySectionHeaderDateSring" cacheName:nil]; ``` Then, I just set `scanTimestamp` to be the `sortDescriptor` for the `NSFetchRequest` of the `NSFetchedResultsController`, and everything worked both smoothly, and correctly. In the Category, the `- (NSString *) prettySectionHeaderDateSring` method was declared as returning an `NSString` and also as a readonly property (either of which would have been sufficient, but it's always nice to have both explicitly declared). Then I simply implemented the `prettySectionHeaderDateSring` method using some `NSDateFormatter` magic to transform the ugly `"2010-10-13 10:33:12 -0400"` NSDate value into a nice and pretty `"Wednesday, October 13th"` string. Here's the NSDate category: ``` objc #import @interface NSDate (PrettySectionHeaderAdditions) - (NSString *) prettySectionHeaderDateSring; @end @implementation NSDate (PrettySectionHeaderAdditions) - (NSString *) prettySectionHeaderDateSring { NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease]; [formatter setDateFormat:@"EEEE, LLLL d"]; //Resolves to: "Wednesday, September 13" [formatter setAMSymbol:@"am"]; [formatter setPMSymbol:@"pm"]; return [formatter stringFromDate:self]; } @end ``` --- # [JMBlog new] By Jake Marsh, October 18, 2010. Canonical URL: https://deallocatedobjects.com/posts/jmblog-new Welcome to Deallocated Objects. This is where I'm writing now. I would like to start writing more, so I've decided to do that here from now on. ``` objc [oldBlog release]; JMBlog *newBlog = [[JMBlog alloc] initWithAwesomeLevel:JMAwesomeLevelLegendary]; ``` I've had a website or blog since `1998`. ### Why Stop Now? Every few years or so I say "I'm going to start blogging again." and then spend a wealth of time building a great set of code and templates, and designs, etc. to do so and then never seem to keep up with it. Well, 17th (or so) time's a charm and here's my latest creation. `Deallocated Objects` will be a stream of my consciousness about Mac, iPhone & iPad application development, interface design, and interaction design. Along the way I'll post code snippets, walk-throughs, as well as tips and tricks on building awesome stuff. I'll also likely be re-coding this blog in the near future. So there will likely be a series on that process. I wanted to wait until I completed my full vision for this blog before going public, but I've been dying to have a clean place to post this types of things for a long time. I've given `tumblr` a fair shot and its great for somethings, but for what I want to do it just isn't going to cut it. Right now this site is running on `wordpress` simply because I wanted something up quickly that I didn't have to think about too much. In the future, however, my plans are to write a custom system with a `Rails 3` backend and... wait for it... an `Objective-J/Cappuccino` front-end. That's right. I'm going to write my website in Cappuccino. I know what you're thinking. But I don't care, it will be awesome. Thanks for visiting and keep an eye on my twitter as I'll be posting a bunch of other cool stuff soon.