<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedpress="https://feed.press/xmlns" version="2.0">
  <channel>
    <feedpress:locale>en</feedpress:locale>
    <atom:link rel="hub" href="http://feedpress.superfeedr.com/"/>
    <title>Unredacted</title>
    <description>Thoughts and opinions of a software designer.</description>
    <link>https://unredacted.redalemeden.com/</link>
    <atom:link href="http://feedpress.me/unredacted" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 10 Feb 2017 00:20:47 +0100</pubDate>
    <lastBuildDate>Fri, 10 Feb 2017 00:20:47 +0100</lastBuildDate>
    <item>
      <title>Achievement Unlocked: January 2017</title>
      <description>&lt;p&gt;Amidst all the depressing stuff going on, it is sometimes healthy to celebrate the little victories of everyday life. Here is a round-up to follow up on &lt;a href="/2015/achievement-unlocked-2015"&gt;the one&lt;/a&gt; I wrote a little over a year ago.&lt;/p&gt;

&lt;h3 id="restrospective"&gt;2016 Restrospective&lt;/h3&gt;

&lt;p&gt;Between a new job, a house move, and a flurry of depressing news, my productivity took a hit in 2016. I was nevertheless able to do some fun things on the side:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Built and launched &lt;a href="https://speedsterapp.com"&gt;Speedster&lt;/a&gt;, a native bandwidth speed testing app for macOS. The feedback was very positive, but I &lt;a href="/2016/speedster-a-retrospective"&gt;struggled with the business model&lt;/a&gt;. As of now, the app is no longer available on the App Store, and version 3.0 is in the works (more on that later).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Launched then open-sourced &lt;a href="https://github.com/thoughtbot/Markoff"&gt;Markoff&lt;/a&gt;, a lightweight Markdown previewer app for macOS.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Published &lt;a href="https://robots.thoughtbot.com/building-ios-interfaces-views"&gt;three&lt;/a&gt; &lt;a href="https://robots.thoughtbot.com/building-ios-interfaces-custom-button"&gt;more&lt;/a&gt; &lt;a href="https://robots.thoughtbot.com/building-ios-interfaces-subclassing-views"&gt;articles&lt;/a&gt; in the &lt;em&gt;Designing for iOS&lt;/em&gt; series that I started back in 2015.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://twitter.com/kaishin/status/706076592976629761"&gt;Customized an arcade stick&lt;/a&gt; 🕹 and had a ton of fun doing it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Designed a macOS &lt;a href="https://dribbble.com/shots/2730205-Undertale-Replacement-Icon"&gt;replacement icon&lt;/a&gt; for &lt;a href="http://undertale.com/"&gt;Undertale&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Released &lt;a href="https://github.com/kaishin/ImageScout"&gt;ImageScout 1.0&lt;/a&gt;, a Swift implementation of fastimage.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Made a &lt;a href="https://swiftbits.redalemeden.com/resources/swift-3-access-control/"&gt;visualization&lt;/a&gt; on Swift 3.0 Access control.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Gave &lt;a href="https://speakerdeck.com/kaishin/swift-3-api-best-practices-by-example"&gt;a talk&lt;/a&gt; about Swift API guidelines at Cocoaheads Stockholm.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="january-2017"&gt;January 2017&lt;/h3&gt;

&lt;h4 id="code"&gt;Code&lt;/h4&gt;

&lt;p&gt;Even though I’ve been writing less code outside of my full-time job, I managed to do a complete rewrite of &lt;a href="https://speedsterapp.com"&gt;Speedster&lt;/a&gt; 3.0 since last September. The app is now written in Swift 3.0 and no longer relies on the &lt;a href="https://speedof.me"&gt;SpeedOfMe&lt;/a&gt; API for the tests (good riddance). A good chunk of my time off last month went into revisiting the UI and hunting down a couple of timeout issues that I’d like to fix before pushing the first beta.&lt;/p&gt;

&lt;p&gt;On the open-source front, I managed to release &lt;a href="https://cocoapods.org/pods/Gifu"&gt;Gifu&lt;/a&gt; 2.0 after 3 months of testing. The new version is written in Swift 3.0 and introduces a new protocol-based API that makes the library a lot more versatile.&lt;/p&gt;

&lt;p&gt;Last but not least I managed to remove all anayltics from my websites. Yay privacy!&lt;/p&gt;

&lt;h4 id="design"&gt;Design&lt;/h4&gt;

&lt;p&gt;I took a little break from code and spent some time refreshing the Speedster icon. I swapped the color palette and added some extra details to the needle as you can see on the &lt;a href="https://dribbble.com/shots/3252363-Speedster-3-0-Icon"&gt;Dribbble shot&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="podcasting"&gt;Podcasting&lt;/h4&gt;

&lt;p&gt;We resumed recording &lt;a href="http://tentative.fm"&gt;Tentative&lt;/a&gt; and the &lt;a href="http://tentative.fm/31"&gt;1st episode&lt;/a&gt; of the season is already out! We discussed our new year’s resolutions in a quite spontaneous and laid back episode.&lt;/p&gt;

&lt;h4 id="writing"&gt;Writing&lt;/h4&gt;

&lt;p&gt;A little over ten years ago, I started a &lt;em&gt;manga&lt;/em&gt; (Japanese comic) side project. I have been sporadically revisiting it since, adding tiny bits to the story and characters.&lt;br /&gt;
As time went by however, I started losing the spark that initially got me going.&lt;/p&gt;

&lt;p&gt;Last month, I discarded all but the name of the main protagonist the overall tone of the story. A new direction that will hopefully get the creative juices flowing and help me keep the momentum.&lt;/p&gt;

&lt;p&gt;Creative writing aside, I’d like to push these updates more frequently to stay motivated and keep everyone interested in my side projects in the loop.&lt;/p&gt;

<![CDATA[<img src="http://feedpress.me/9731/5292000.gif" height="1" width="1"/>]]></description>
      <pubDate>Thu, 02 Feb 2017 09:52:55 +0100</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/5292000</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2017/achievement-unlocked-january-2017/</guid>
      <category>personal</category>
      <category>motivation</category>
      <category>round-up</category>
    </item>
    <item>
      <title>Speedster: A Retrospective</title>
      <description>&lt;p&gt;Last year, I had the &lt;del&gt;not so&lt;/del&gt; brilliant idea to build a connection speed testing app for OS X. Between a full-time job and summer vacations, it took me about 6 months to wrap up a 1.0 using the &lt;a href="http://speedof.me"&gt;SpeedOfMe&lt;/a&gt; free-while-in-beta API. &lt;a href="https://speedsterapp.com"&gt;Speedster&lt;/a&gt; was born.&lt;/p&gt;

&lt;p&gt;Speed tests are a tricky business. I wasn’t convinced that the app would work for everyone, so I made it free. I also capped the number of daily tests per user to not get my API key revoked, and added an &lt;abbr title="In-app purchase"&gt;IAP&lt;/abbr&gt; to remove that limitation for good measure.&lt;/p&gt;

&lt;p&gt;Shortly after submitting 1.0 for review, the app was rejected for violating section 2.9 of the review guidelines:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;2.9 Apps that are “demo”, “trial”, or “test” versions will be rejected. Beta Apps may only be submitted through TestFlight and must follow the TestFlight guidelines&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It seems like I wasn’t the only one sailing uncharted waters here. After a couple of back and forths, the app went live on February 1st. Here are some relevant numbers from the first month:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Downloads:&lt;/em&gt; 14k.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;&lt;abbr title="In-app purchase"&gt;IAP&lt;/abbr&gt;:&lt;/em&gt; 212 units.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Revenue:&lt;/em&gt; $620.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;API usage&lt;/em&gt;: 20k requests.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Conversion:&lt;/em&gt; 1.5%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the revenue was generated during the first 2 weeks as the weekly average dropped from $285 to $23 by the end of the month.&lt;/p&gt;

&lt;p&gt;On February 20th, I woke up to an email from SpeedOfMe announcing their pricing plans and prompting me to update my billing information.&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/speedofme-plans.png" alt="SpeedOfMe Pricing" /&gt;
    
      &lt;figcaption&gt;
        SpeedOfMe API plans.
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;Uh-oh.&lt;/p&gt;

&lt;p&gt;Going with the Pro plan as the only reasonable option, I projected cumulative revenue and costs for the next 12 months, as they taught me in business school:&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/graphs/cumulative-costs-sales.svg" alt="[Chart] Cumulative Revenue Projection" /&gt;
    
      &lt;figcaption&gt;
        Projected cumulative revenue/costs (purple/orange).
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;This did not bode well. Even an optimistic revenue projection wasn’t enough to offset the costs for more than 3 months. Without recurring revenue, Speedster would not be sustainable on the long run.&lt;/p&gt;

&lt;p&gt;After 24 hours of hesitation, I pulled the trigger on the &lt;em&gt;Speedster Hero&lt;/em&gt; &lt;abbr title="In-app purchase"&gt;IAP&lt;/abbr&gt; and replaced it with consumable tests packs in 1.1. Here’s how things went since:&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/graphs/march-may-sales.svg" alt="[Chart] Daily Sales" /&gt;
    
      &lt;figcaption&gt;
        Daily revenue between March 1st and May 12th. Total: $148.
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;Oops. Consumables aren’t popular outside of games for a reason. The app made a measly $148 since March 1st and the pricing tweaks I did in the course of the last two months did not move the needle.&lt;/p&gt;

&lt;p&gt;Remember that projection graph from earlier? Now it looks like this:&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/graphs/sales-adjusted-cumulative-costs-sales.svg" alt="[Chart] Readjusted Cumulative Revenue/Cost Projection" /&gt;
    
      &lt;figcaption&gt;
        Readjusted cumulative revenue and costs projection (purple and orange respectively).
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;Did these changes make things worse? Absoluely. Do I have a clue why? Maybe. Let’s look at some ★☆☆☆☆ reviews:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I would stay away from this. Says free but its more like test three times and you must buy it. — Jatilq&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;no ping and 3x per day? — Ojaste&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Why pay for a speed test when there are dozens of websites that provide this for free? limit the free version to 3 daily tests? $4 for unlimited? I will use speedtest.net for free — Legatony&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The list goes on, but I will stop here. The gist of it is that the vast majority of users do not see enough value to justify paying for a consumable &lt;abbr title="In-app purchase"&gt;IAP&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;With downloads hovering around a weekly average of 600, the prospects of a surge in revenue are bleak. Something’s gotta give.&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/graphs/weekly-downloads.svg" alt="[Chart] Weekly Downloads" /&gt;
    
      &lt;figcaption&gt;
        Weekly downloads. Total as of May 12th: 21442.
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;In my last attempt to make this work, I am introducing some breaking changes in 2.0. Here’s an outline:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The app will no longer be free.&lt;/li&gt;
  &lt;li&gt;Users will be prompted to use their own SpeedOfMe API keys.&lt;/li&gt;
  &lt;li&gt;Existing &lt;em&gt;Hero&lt;/em&gt; customers will be grand-fathered until further notice.&lt;/li&gt;
  &lt;li&gt;Test packs will remain as a secondary option for those who don’t want to manage their own API keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Will these changes net me a few more ★☆☆☆☆ reviews? I betcha. But at this point that is the least of my concerns.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To be continued&lt;/em&gt;.&lt;/p&gt;

<![CDATA[<img src="http://feedpress.me/9731/3355592.gif" height="1" width="1"/>]]></description>
      <pubDate>Tue, 17 May 2016 01:50:22 +0200</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/3355592</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2016/speedster-a-retrospective/</guid>
      <category>osx</category>
      <category>app</category>
      <category>announcement</category>
    </item>
    <item>
      <title>Announcing Nope for Safari</title>
      <description>&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/nope-safari-icon.jpg" alt="Nope Icon" /&gt;
    
&lt;/figure&gt;

&lt;p&gt;Two months ago I started working on &lt;a href="https://redalemeden.com/nope"&gt;Nope&lt;/a&gt;, a content blocking extension for Safari 9. Today I am happy to launch &lt;a href="https://github.com/kaishin/Nope/releases/v1.2.0/"&gt;a stable version&lt;/a&gt; and get more people to try it.&lt;/p&gt;

&lt;h2 id="another-content-blocker"&gt;Another Content Blocker?&lt;/h2&gt;

&lt;p&gt;There is no shortage of feature-packed ad blocking extensions such as &lt;a href="https://getadblock.com"&gt;AdBlock&lt;/a&gt;, &lt;a href="https://www.ghostery.com"&gt;Ghostery&lt;/a&gt;, and &lt;a href="https://disconnect.me/disconnect"&gt;Disconnect&lt;/a&gt;. But as effective as these can be, they rely on JavaScript to identify and block resources, which has a non-trivial performance cost as Benjamin Poulain &lt;a href="https://webkit.org/blog/3476/content-blockers-first-look/"&gt;outlines&lt;/a&gt; on the WebKit blog:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The reason we are unhappy about the JavaScript-based content blocking extensions is they have significant performance drawbacks. The current model uses a lot of energy, reducing battery life, and increases page load time by adding latency for each resource. Certain kinds of extensions also reduce the runtime performance of webpages. Sometimes, they can allocate tremendous amounts of memory, which goes against our efforts to reduce WebKit’s memory footprint.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The new content blocking extension &lt;a href="https://developer.apple.com/library/prerelease/mac/documentation/Extensions/Conceptual/ContentBlockingRules/Introduction/Introduction.html"&gt;APIs&lt;/a&gt; in WebKit were designed to solve this very problem by compiling the rules into an efficient bytecode format that executes for each request, eliminating the need to run custom scripts code to determine what should be blocked and what should not.&lt;/p&gt;

&lt;p&gt;After trying out the &lt;a href="https://beta-extensions.apple.com/?q=block"&gt;new batch&lt;/a&gt; of content blocking extensions in the hope of finding a replacement for &lt;a href="https://getadblock.com"&gt;AdBlock&lt;/a&gt;, I decided to take matters into my own hands and start from scratch with an increased focus on &lt;a href="https://webkit.org/blog/4062/targeting-domains-with-content-blockers/"&gt;performance&lt;/a&gt; and privacy.&lt;/p&gt;

&lt;h2 id="how-it-works"&gt;How it Works&lt;/h2&gt;

&lt;p&gt;Once Nope is enabled, every website you visit will fall into one of these three categories:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Yep&lt;/em&gt;: Nothing is blocked.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Nope&lt;/em&gt;: Third party resources belonging to any of the enabled categories (ads, tracking, social) are blocked. This is the default behavior.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Mega Nope&lt;/em&gt;: All third party resources are blocked, regardless of whether they are on the rules list or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can view a list of all the (sub)domains that you’ve already categorized in the settings accessible from  &lt;em&gt;Safari &amp;gt; Preferences &amp;gt; Extensions &amp;gt; Nope&lt;/em&gt;. It’s also possible to manually edit the comma-separated list to add new (sub)domains or remove existing ones.&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/nope-screenshot.jpg" alt="Nope Screenshot" /&gt;
    
      &lt;figcaption&gt;
        You can set the behavior for a specific domain or subdomain using the toolbar button.
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;h2 id="api-limitations"&gt;API Limitations&lt;/h2&gt;

&lt;p&gt;Currently the content blocking APIs don’t expose the blocked resources to the extension. This means that there is no way of displaying what has been blocked outside of the &lt;em&gt;Console&lt;/em&gt; logs in the developer console—not a great user experience for the average user.&lt;/p&gt;

&lt;p&gt;Those who are happy to make this—hopefully temporary—tradeoff will see improved Safari performance, especially on sites that load dozens of third party scripts.&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/content-blocked-console.jpg" alt="Safari Developer Console" /&gt;
    
      &lt;figcaption&gt;
        Logging blocked resources in the Safari Developer Console.
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;h2 id="roadmap"&gt;Roadmap&lt;/h2&gt;

&lt;p&gt;One of the goals that motivated me to work on Nope is to make an open-source blocking database that anyone can contribute to. Since the initial database I scrapped together ended up breaking a large number of popular sites, I opted for the open-source &lt;a href="https://github.com/disconnectme/disconnect-tracking-protection"&gt;Disconnect database&lt;/a&gt; to get things off the ground more quickly. Going forward, I would like to drop this dependency and move the rules to a separate repository for more flexibility and transparency.&lt;/p&gt;

&lt;p&gt;So, how about you give &lt;a href="https://redalemeden.com/nope"&gt;Nope&lt;/a&gt; a try and let me know what you think by opening issues or pull-requests on &lt;a href="https://github.com/kaishin/Nope"&gt;the repository&lt;/a&gt;?&lt;/p&gt;

<![CDATA[<img src="http://feedpress.me/9731/2244087.gif" height="1" width="1"/>]]></description>
      <pubDate>Mon, 28 Dec 2015 22:30:00 +0100</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2244087</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2015/announcing-nope/</guid>
      <category>safari</category>
      <category>extension</category>
      <category>web</category>
      <category>announcement</category>
    </item>
    <item>
      <title>Achievement Unlocked: 2015 Edition</title>
      <description>&lt;p&gt;It’s that time of the year where we mull over what we accomplished in the past twelve months. Here is my list.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Stopped using Google products for personal use.&lt;/strong&gt; Migrating my half dozen Gmail accounts was the hardest part. That and finding a viable replacement for YouTube. Spoiler: It does not exist.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Deleted unused online accounts.&lt;/strong&gt; This includes Linkedin, Hulu, and other online retailers. Needless to say, I had some unpleasant experiences during this process.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Uninstalled Flash and Java on OS X.&lt;/strong&gt; Surprised I didn’t get to this sooner.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Enabled two-factor authentication when available.&lt;/strong&gt; &lt;a href="https://www.authy.com"&gt;Authy&lt;/a&gt; and &lt;a href="https://agilebits.com/onepassword"&gt;1Password&lt;/a&gt; for the win.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Launched a Mac app on the App Store.&lt;/strong&gt; &lt;a href="https://ipinator.kaishin.co"&gt;A utility&lt;/a&gt; that brings native IP geocoding to OS X.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Designed a mobile game.&lt;/strong&gt; An unforgiving &lt;a href="http://playroto.to"&gt;space survival&lt;/a&gt; with a whiff of nostalgia.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Co-hosted a podcast.&lt;/strong&gt; Props to &lt;a href="https://twitter.com/kylefiedler"&gt;Kyle Fiedler&lt;/a&gt; for putting up with &lt;a href="https://twitter.com/tentativefm"&gt;my never-ending rants&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Co-organized a Swift workshop.&lt;/strong&gt; &lt;a href="http://codeswift.thoughtbot.com"&gt;It was a lot of fun&lt;/a&gt;, especially the part where I had to sit back and listen to &lt;a href="https://twitter.com/jacknutting"&gt;Jack Nutting&lt;/a&gt; explain optionals.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Released a Safari extension.&lt;/strong&gt; It serves to scratch my own &lt;a href="https://redalemeden.com/syndicate/"&gt;RSS discovery&lt;/a&gt; itch.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Got interviewed.&lt;/strong&gt; It’s on &lt;a href="http://workspiration.org/reda-lemeden"&gt;Workspiration&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Visited San Francisco during WWDC week.&lt;/strong&gt; &lt;a href="https://twitter.com/kaishin/status/608815115643686913"&gt;It was totally worth it&lt;/a&gt;, even without a ticket.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Avoided buying an Apple Watch.&lt;/strong&gt; Believe me, this one was particularly challenging.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Earned a Platinum trophy on PSN&lt;/strong&gt;. Better yet, it’s from &lt;a href="https://www.playstation.com/en-us/games/bloodborne-ps4/"&gt;Bloodborne&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

<![CDATA[<img src="http://feedpress.me/9731/2237799.gif" height="1" width="1"/>]]></description>
      <pubDate>Sun, 27 Dec 2015 12:02:37 +0100</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2237799</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2015/achievement-unlocked-2015/</guid>
      <category>personal</category>
      <category>motivation</category>
      <category>yolo</category>
      <category>round-up</category>
    </item>
    <item>
      <title>tvOS HIG: Too Long; Didn't Read</title>
      <description>&lt;p&gt;I often joke about the &lt;a href="https://developer.apple.com/tvos/human-interface-guidelines/"&gt;&lt;abbr title="Human Interface Guidelines"&gt;HIG&lt;/abbr&gt;&lt;/a&gt; being an acronym for &lt;em&gt;Highly Ignored Guidelines&lt;/em&gt;.&lt;br /&gt;
This is an effort to change that, at least for tvOS.&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/tvos.jpg" alt="Apple TV UI" /&gt;
    
      &lt;figcaption&gt;
        The user interface of Apple TV.
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;h2 id="glossary"&gt;Glossary&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Click&lt;/strong&gt;. One-finger quick press on the center of the touch surface. The primary way of triggering actions.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Click-and-hold&lt;/strong&gt;. One-finger long press on the center of the touch surface. Used to trigger context-specific actions, like entering edit mode.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Focus&lt;/strong&gt;. The state of the currently selected interface element.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Parallax&lt;/strong&gt;. An effect applied to focused app icons and content elements using multiple layered images.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Siri Remote&lt;/strong&gt;. The Siri-enabled remote used as the primary input method for Apple TV. It comes with 6 buttons, a touch surface, an accelerometer, and a gyroscope.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Swipe&lt;/strong&gt;. One-finger press followed by a quick movement in any direction on the touch surface. Used to move focus vertically or horizontally.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Tap&lt;/strong&gt;. One-finger quick press on one of the four directions (top, right, bottom, left) of the touch surface. Used for single-item directional navigation.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Top Shelf&lt;/strong&gt;. The area above the first row of apps where featured content of the focused app appears.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: My colleague &lt;a href="https://twitter.com/jacknutting"&gt;Jack Nutting&lt;/a&gt; pointed out that clicks require you to press the touch surface until it clicks, whereas taps don’t.&lt;/p&gt;

&lt;h2 id="general"&gt;General&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Design with multiple simultaneous users in mind.&lt;/li&gt;
  &lt;li&gt;Prefer showing old data to no data at all.&lt;/li&gt;
  &lt;li&gt;Avoid excessive animation.&lt;/li&gt;
  &lt;li&gt;Avoid using alerts unless it’s for a critical user decision. When you do, provide no more than two choices.&lt;/li&gt;
  &lt;li&gt;Don’t display your logo throughout the app UI.&lt;/li&gt;
  &lt;li&gt;Use the system video player to get advantage of all its interactive features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="focus"&gt;Focus&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Make focus obvious using labels, transforms, and other effects.&lt;/li&gt;
  &lt;li&gt;Use parallax on focused elements to make the UI more responsive to user interaction.&lt;/li&gt;
  &lt;li&gt;Prefer light backgrounds so that focus shadows remain visible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="controls"&gt;Controls&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Keep the difference between click and tap in mind. See the &lt;a href="#glossary"&gt;glossary&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Avoid using taps for triggering actions other than navigation.&lt;/li&gt;
  &lt;li&gt;Avoid using standard gestures to perform non-standard actions.&lt;/li&gt;
  &lt;li&gt;Avoid defining new gestures to perform standard actions.&lt;/li&gt;
  &lt;li&gt;Make sure your controller-compatible game works with the remote as well.&lt;/li&gt;
  &lt;li&gt;Always enable the Play/Pause button on the Siri Remote. If you are running out of ideas, make it at least perform a click.&lt;/li&gt;
  &lt;li&gt;Use gestures to move focus, not content. For instance, a left swipe would move focus to the left, making the content move to the right.&lt;/li&gt;
  &lt;li&gt;Use gestures to move content when displayed full-screen. For instance. a left swipe on a full-screen image would move the image to the left.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="navigation"&gt;Navigation&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Use the tab bar for the main navigation of your app.&lt;/li&gt;
  &lt;li&gt;Allow your users to navigate back to the previous screen or out of your app/game using the Menu button.&lt;/li&gt;
  &lt;li&gt;Don’t display a back button.&lt;/li&gt;
  &lt;li&gt;Keep your content structure simple for easier navigation.&lt;/li&gt;
  &lt;li&gt;Prefer text, more specifically nouns and verbs for your tab titles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="visual-design"&gt;Visual Design&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Design your interface for a 1920 x 1080 pixels (16:9) screen in mind.&lt;/li&gt;
  &lt;li&gt;Use @1x resolution for all image assets.&lt;/li&gt;
  &lt;li&gt;Use an opaque background layer when making your layered images.&lt;/li&gt;
  &lt;li&gt;Provide at least one static Top Shelf image (1920px by 720px) if you don’t have any dynamic content to showcase.&lt;/li&gt;
  &lt;li&gt;Use the sRGB color space.&lt;/li&gt;
  &lt;li&gt;Favor muted color for better results on highly saturated TVs.&lt;/li&gt;
  &lt;li&gt;Prefer top-to-bottom, light-to-dark gradients.&lt;/li&gt;
  &lt;li&gt;Prefer horizontal layouts.&lt;/li&gt;
  &lt;li&gt;Leave 60 pixels on the top and bottom, and 90 pixels on the right and left as padding around the edges of the screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="text"&gt;Text&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Use San Francisco Text for text 39 points or smaller, and San Francisco Display for text that’s 40 points or larger.&lt;/li&gt;
  &lt;li&gt;Put text in the top-most layer of your layered images.&lt;/li&gt;
  &lt;li&gt;Use the built-in text styles to take advantage of features like Dynamic Type.&lt;/li&gt;
  &lt;li&gt;Use title-case in your text buttons.&lt;/li&gt;
  &lt;li&gt;Avoid combining both icons and text in buttons.&lt;/li&gt;
  &lt;li&gt;Try to limit text-input in your app since typing on the Apple TV can be tedious.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="app-icon"&gt;App Icon&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Use a layered image (2-5 layers) for your app icon (1280px by 768px for large version and 400px by 240px for the small one).&lt;/li&gt;
  &lt;li&gt;Leave a padding around the content of your foreground layers.&lt;/li&gt;
  &lt;li&gt;Don’t include screenshots in your app icon.&lt;/li&gt;
  &lt;li&gt;Avoid text in your app icon, unless it’s part of the brand.&lt;/li&gt;
&lt;/ul&gt;

<![CDATA[<img src="http://feedpress.me/9731/2228277.gif" height="1" width="1"/>]]></description>
      <pubDate>Mon, 05 Oct 2015 00:39:09 +0200</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2228277</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2015/tvos-hig-tldr/</guid>
      <category>apple</category>
      <category>hig</category>
      <category>tvos</category>
      <category>resource</category>
    </item>
    <item>
      <title>React Native: Initial Thoughts</title>
      <description>&lt;p&gt;I spent a couple of days toying with &lt;a href="http://reactnative.com"&gt;React Native&lt;/a&gt; since it was open-sourced by Facebook last week. Here are my initial thoughts as someone who works with both iOS and Web development:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Good&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Immutable user interface&lt;/em&gt;. You no longer have to track state in both the model and the view; the latter is a function of the former. As soon as the model changes, React Native re-renders a virtual tree of the view hierarchy, then applies the delta to the native views. This approach feels superior to bindings or &lt;abbr title="Functional Reactive Programming"&gt;FRP&lt;/abbr&gt;, and is certainly light-years ahead of the official APIs.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Instant feedback loop&lt;/em&gt;. Once you build your app in Xcode, you can instantly refresh it from within the simulator using &lt;code class="highlighter-rouge"&gt;Command + R&lt;/code&gt;. You can even enable auto-refresh and forget about it. Going forward, I will dearly miss this feature in every non-React project.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Perceived&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; performance&lt;/em&gt;. I haven’t experienced any hiccups while working on a simple navigation-based app. The interface is 100% native and performs like one.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Bad&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Javascript&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;No Swift support&lt;/em&gt;. Native modules should be written in Objective-C.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Additional abstraction layer&lt;/em&gt;. If you already do iOS development, you will be relearning a lot. For instance, &lt;code class="highlighter-rouge"&gt;ListView&lt;/code&gt; is the new &lt;code class="highlighter-rouge"&gt;TableView&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;SDK limitations&lt;/em&gt;. Unless you want to subclass an unhealthy amount of &lt;code class="highlighter-rouge"&gt;UIKit&lt;/code&gt; using Objective-C (hint: I don’t), you will be rather restrained in what you can do out-of-the-box. I have yet to figure out how to change the &lt;code class="highlighter-rouge"&gt;barTintColor&lt;/code&gt; of a &lt;code class="highlighter-rouge"&gt;NavigatorIOS&lt;/code&gt;, the &lt;code class="highlighter-rouge"&gt;UINavigationBar&lt;/code&gt; equivalent.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;No Interface Builder support&lt;/em&gt;. I typically use storyboards as a visual representation of user flow. Perhaps more importantly, I enjoy having the freedom of using the right tool for the job.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Component-based file structure&lt;/em&gt;. Handling styles, view hierarchy, and business logic all in one file is a step backwards. Poor style reusability is one direct consequence of this approach.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;&lt;code class="highlighter-rouge"&gt;StyleSheet&lt;/code&gt; is not CSS&lt;/em&gt;. You will be quickly disappointed if you adventure outside the few CSS-inspired properties that React Native ships with.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Styling nested view controllers is a pain&lt;/em&gt;. You are taken back to the root view controller after each refresh.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Meh&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Flexbox&lt;/em&gt;. The authors missed the opportunity of offering a saner API and favored sticking to the official spec instead.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Chrome Dev Tools&lt;/em&gt;. Browsers are doing too much already.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though a good number of these issues is very likely to be addressed as the framework matures, I find the abstraction overhead off-putting considering the current limitations. On the bright side, React Native introduces concepts that could potentially change the way we build native applications, and I am looking forward to seeing how that will unfold.&lt;/p&gt;

&lt;div class="footnotes"&gt;
  &lt;ol&gt;
    &lt;li id="fn:1"&gt;
      &lt;p&gt;Purely based on perception with with no benchmarks to back it up. &lt;a href="#fnref:1" class="reversefootnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
<![CDATA[<img src="http://feedpress.me/9731/2228278.gif" height="1" width="1"/>]]></description>
      <pubDate>Sun, 29 Mar 2015 16:00:00 +0200</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2228278</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2015/initial-thoughts-about-react-native/</guid>
      <category>code</category>
      <category>tools</category>
      <category>open-source</category>
      <category>mobile</category>
      <category>opinion</category>
    </item>
    <item>
      <title>IPinator</title>
      <description>&lt;p&gt;I am happy to announce that &lt;a href="http://ipinator.kaishin.co"&gt;IPinator&lt;/a&gt; is &lt;em&gt;finally&lt;/em&gt; &lt;a href="https://itunes.apple.com/us/app/ipinator/id959111981"&gt;live on the App Store&lt;/a&gt;. It’s a utility app and Notification Center widget that geocodes your external IP address and displays it alongside your local one for easy copy-pasting during local development, VPN setup, etc.&lt;/p&gt;

&lt;figure&gt;
  &lt;img src="https://unredacted.redalemeden.com/images/ipinator-screenshot.jpg" alt="IPinator screenshot" /&gt;
    
      &lt;figcaption&gt;
        Application window and Notification Center extension.
      &lt;/figcaption&gt;
    
&lt;/figure&gt;

&lt;p&gt;IPinator is written in Swift and uses &lt;a href="https://github.com/thoughtbot/Argo"&gt;Argo&lt;/a&gt; for JSON parsing and &lt;a href="https://github.com/LlamaKit/LlamaKit"&gt;Llamakit&lt;/a&gt; for &lt;code class="highlighter-rouge"&gt;Result&lt;/code&gt;. The code-base is straightforward, save for one limitation related to the inability to display an &lt;code class="highlighter-rouge"&gt;MKMapView&lt;/code&gt; in a Today extension. The solution I came up with involved generating a map screenshot and passing it to the extension as an &lt;code class="highlighter-rouge"&gt;NSImage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you’d like to write about IPinator, feel free to &lt;a href="http://ipinator.kaishin.co/support"&gt;drop a line&lt;/a&gt; for a promo code.&lt;/p&gt;

<![CDATA[<img src="http://feedpress.me/9731/2228279.gif" height="1" width="1"/>]]></description>
      <pubDate>Sat, 07 Mar 2015 12:24:52 +0100</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2228279</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2015/ipinator/</guid>
      <category>osx</category>
      <category>app</category>
      <category>widget</category>
      <category>announcement</category>
    </item>
    <item>
      <title>Back to Writing</title>
      <description>&lt;p&gt;It feels like forever since the last time I wrote something. And it kind of is, given that I haven’t updated &lt;a href="http://kaishinlab.com"&gt;my personal blog&lt;/a&gt; ever since I joined thoughtbot in 2012. That was due to a combination of lacking the time to do proper research outside work hours and finding &lt;a href="https://robots.thoughtbot.com"&gt;better&lt;/a&gt; &lt;a href="http://www.smashingmagazine.com/"&gt;venues&lt;/a&gt; for technical writing.&lt;/p&gt;

&lt;p&gt;In a way, I was trying to spend my time fixing the things that irk me rather than writing about them. Actions speak louder than words has become my motto. But as time went on, I started to realize that writing about something as way of getting it out of your system is highly effective, especially when you consider the constraint of time.&lt;/p&gt;

&lt;p&gt;Given how tiny my blog audience got over the last 3 years, I considered moving to Medium as a way to revitalize my readership though social connections. I quickly discarded the idea; no amount of perks can convince me to write on a closed platform.&lt;/p&gt;

&lt;p&gt;With that out of the picture, I had to figure out whether I want to resume from where I left off or start from scratch. To get the SEO benefits of the former and the freedom of the latter, I decided to move the old content to a new home and set up redirects from the old one. Having total control over your data always pays off.&lt;/p&gt;

&lt;p&gt;It feels good to be back.&lt;/p&gt;

<![CDATA[<img src="http://feedpress.me/9731/2228280.gif" height="1" width="1"/>]]></description>
      <pubDate>Sun, 01 Mar 2015 01:16:33 +0100</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2228280</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2015/writing/</guid>
      <category>announcement</category>
    </item>
    <item>
      <title>Twitter Client Showdown: Round 2</title>
      <description>&lt;p&gt;It has been almost a year since the &lt;a href="/2011/twitter-client-showdown/"&gt;original showdown&lt;/a&gt; pitting the user interfaces of the Twitter official client and Tweetbot. Since the latter got a major update last week, it is a good opportunity to revisit the Twitter client landscape on iOS.&lt;/p&gt;

&lt;p&gt;For starters, here is a quick summary of the simplified &lt;abbr title="Human Information Processing"&gt;HIP&lt;/abbr&gt; model used in this showdown:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Touch interactions are assigned a value based on the precision and time required to execute them. Single taps take in average 165 milliseconds, while double taps and swipes take 350ms and 400ms respectively. The single tap is given a nominal value of 1 and will serve as the base unit of other interactions. For instance, assigning the value of 2 to a swipe means that it’s twice harder to execute than a single tap.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A task is a chain of user interactions with an end goal. The effort required to achieve a certain task equals the sum of the individual values of each interaction involved. The lower the sum, the more efficient the interface.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Typing time is zeroed out.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Only the shortest routes were used (lowest scores).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For long-time readers, here is what’s new:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Here comes a new challenger: Twitterrific.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;User flow is taken into account this time by adding the interactions required to take the user back to the main timeline in each task.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The interaction scores have been revised since. Swipes and double taps call for twice the effort required by single taps. Triple taps are the most taxing in terms of precision, long presses in term of execution time.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The tasks have been divided into two main groups: basic and advanced.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The new scores used in the test are as follows:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Interaction&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Tap&lt;/td&gt;
      &lt;td style="text-align: center"&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Double tap&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Swipe&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Triple tap&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Long tap&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Multi-option prompt&lt;/td&gt;
      &lt;td style="text-align: center"&gt;0.5&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="basic-tasks"&gt;Basic tasks&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Task&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Tweetbot&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Twitter&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Twitterrific&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Compose a Tweet&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Open a link&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Reply&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Retweet&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;View conversation&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Favorite a tweet&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Follow user&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Unfollow user&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
      &lt;td style="text-align: center"&gt;6&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;24.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;30.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;26&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Tweetbot has clearly the upper-hand even though little has changed since the initial release. In contrast, the redesigned interface of Twitter 4 forces the user to navigate constantly back and forth between the main timeline and individual tweets, resulting in a less fluid experience; opening a link in the official client and coming back to the timeline takes twice as many taps as the other third part clients. Twitterrific lands very close to Tweetbot but does a better job in terms of consistency and ease of use: all primary tasks can be carried out using only single taps.&lt;/p&gt;

&lt;h3 id="advanced-tasks"&gt;Advanced tasks&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Task&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Tweetbot&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Twitter&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Twitterrific&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Reply all (&lt;abbr title="Multi-Mention Tweet"&gt;MMT&lt;/abbr&gt;)&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Reply one user (&lt;abbr title="Multi-Mention Tweet"&gt;MMT&lt;/abbr&gt;)&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;8.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Send a new &lt;abbr title="Direct Message"&gt;DM&lt;/abbr&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;7.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;8.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;7&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Reply to &lt;abbr title="Direct Message"&gt;DM&lt;/abbr&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;8&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Compose a tweet with # and @&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Report a user&lt;/td&gt;
      &lt;td style="text-align: center"&gt;5.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;6&lt;/td&gt;
      &lt;td style="text-align: center"&gt;6.5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Delete a tweet&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
      &lt;td style="text-align: center"&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Switch time-lines&lt;/td&gt;
      &lt;td style="text-align: center"&gt;2.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3&lt;/td&gt;
      &lt;td style="text-align: center"&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;39.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;44.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;41&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Tweetbot still comes out ahead of the official client, and barely ahead of Twitterrific. Tapbots’ popover implementation of account switching contrasts heavily with the 2 layer deep navigation required to do the same task in Twitter 4. Twitterrific does direct messages best, despite the 2 penalty points tied to the impossibility of sending a new &lt;abbr title="Direct Message"&gt;DM&lt;/abbr&gt; without resorting to the obscure trick of adding a lowercase “d” to the beginning of the tweet.&lt;/p&gt;

&lt;h3 id="verdict"&gt;Verdict&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Task&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Tweetbot&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Twitter&lt;/th&gt;
      &lt;th style="text-align: center"&gt;Twitterrific&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Basic&lt;/td&gt;
      &lt;td style="text-align: center"&gt;24.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;30.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Advanced&lt;/td&gt;
      &lt;td style="text-align: center"&gt;39.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;44.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;64.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;75&lt;/strong&gt;&lt;/td&gt;
      &lt;td style="text-align: center"&gt;&lt;strong&gt;67&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Total (Uncalibrated)&lt;/td&gt;
      &lt;td style="text-align: center"&gt;61.5&lt;/td&gt;
      &lt;td style="text-align: center"&gt;76&lt;/td&gt;
      &lt;td style="text-align: center"&gt;66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Previous Total&lt;/td&gt;
      &lt;td style="text-align: center"&gt;71.0&lt;/td&gt;
      &lt;td style="text-align: center"&gt;68&lt;/td&gt;
      &lt;td style="text-align: center"&gt;74&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Tweetbot wins. Twitterrific closes in second and Twitter 4 lands third with a significant margin. The uncalibrated new scores&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; and the old scores were adde for comparison purposes. Of the three, only the official client regressed.&lt;/p&gt;

&lt;p&gt;The detailed methodology and results can be viewed in this &lt;a href="http://goo.gl/Ydh6vR"&gt;spreadsheet&lt;/a&gt;.&lt;/p&gt;

&lt;div class="footnotes"&gt;
  &lt;ol&gt;
    &lt;li id="fn:1"&gt;
      &lt;p&gt;The uncalibrated scores were calculated using the original interaction cost values. &lt;a href="#fnref:1" class="reversefootnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
<![CDATA[<img src="http://feedpress.me/9731/2228281.gif" height="1" width="1"/>]]></description>
      <pubDate>Mon, 13 Feb 2012 15:38:51 +0100</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2228281</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2012/twitter-client-showdown-round-2/</guid>
      <category>interactions</category>
      <category>ios</category>
      <category>mobile</category>
      <category>usability</category>
      <category>research</category>
    </item>
    <item>
      <title>2011: A year in Interface Design</title>
      <description>&lt;p&gt;This is a summary of what happened in the world of interface and interaction design in 2011.&lt;/p&gt;

&lt;h3 id="desktop-identity-crisis"&gt;Desktop Identity Crisis&lt;/h3&gt;

&lt;p&gt;Following a series of leaks, Microsoft finally unveiled Windows 8, pitching it as a “no compromise” operating system that brings the best of their desktop and mobile offerings. The typography-centric design language that they perfected in recent years, &lt;em&gt;Metro&lt;/em&gt;, will in all likelihood become their bread and butter in the consumer market and will remain a hot topic for years to come.&lt;/p&gt;

&lt;p&gt;Meanwhile, Apple was busy shipping Lion, a milestone update that brought multi-touch gestures, native fullscreen support, and other iOS-inspired interface elements to the desktop &lt;abbr title="Operating System"&gt;OS&lt;/abbr&gt;. They also made sure to upset legions of users by changing the scroll paradigm to match their mobile implementation. Mac third-party apps are coming in all sorts of flavors, and the somewhat unified look and feel of yore gave place to a hodgepodge of visual styles and design patterns: popovers, pull-to-refresh, icon-based tab navigation, monochrome icons, you name it.&lt;/p&gt;

&lt;h3 id="social-innovation"&gt;Social Innovation&lt;/h3&gt;

&lt;p&gt;After several attempts to make a dent in the social space, Google finally decided to get its act together and build a design-driven product that can potentially dethrone Facebook. Led by Andy Hertzfeld, a prominent member of the original Macintosh team, Google+ has indisputably introduced some clever interactions such as &lt;em&gt;circles&lt;/em&gt;, the group management interface. The refreshed visual style they deployed on Google+ already started seeping into other flagship products.&lt;/p&gt;

&lt;p&gt;Facebook retaliated by introducing one of the most radical UI changes in its recent history, the profile timeline. On the mobile front, they managed to ship the eagerly awaited iPad app as a universal package that uses and abuses vertical tab navigation. Overall, the mobile apps &lt;em&gt;look&lt;/em&gt; significantly better thanks to the recent design talent acquisitions; whether they work and feel as good is a whole other story.&lt;/p&gt;

&lt;p&gt;Twitter overhauled their interface in an attempt to make it less intimidating to new users and more accommodating to advertisers. They also ended up ditching swipe gestures from their iPhone app as the last UI vestiges of the original Tweetie app acquired a year earlier.&lt;/p&gt;

&lt;p&gt;Speaking of mobile apps, Path has managed to steal the spotlight from major social players by releasing a completely revamped interface that showcases some playful interactions and experimental design patterns.&lt;/p&gt;

&lt;h3 id="honorable-mentions"&gt;Honorable Mentions&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Web, Native,or Hybrid?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The bi-polar tone of this pointless debate has given place to another discussion about the UX implications of Web views, a new hybrid technique that involves displaying Web pages within native containers. Even though this approach garnered widespread adoption by large companies such as Google, Facebook, and even Apple, it has yet to prove itself by curbing the user experience inconsistencies it entails.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Gestures vs. Buttons&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As touch screens are in the process of becoming the prevalent form factor, the transition to gestural interfaces is dividing the design community. As users, our interaction mental model is currently in a limbo state; we can hardly keep up with the overwhelming number of new interactions that we have to deal with on a daily basis. As designers, striking the balance between ease of use, memorability and discoverability is becoming increasingly hard in the lack of industry-wide standards.&lt;/p&gt;

&lt;p&gt;The question is no longer whether a radical shift in our field is underway, but rather where it will be taking us in the years to come.&lt;/p&gt;

&lt;p&gt;Goodbye 2011, welcome 2012.&lt;/p&gt;

<![CDATA[<img src="http://feedpress.me/9731/2228282.gif" height="1" width="1"/>]]></description>
      <pubDate>Sun, 01 Jan 2012 06:51:32 +0100</pubDate>
      <author>hello@redalemeden.com (Reda Lemeden)</author>
      <link>http://tracking.feedpress.it/link/9731/2228282</link>
      <guid isPermaLink="true">https://unredacted.redalemeden.com/2012/2011-ui-design/</guid>
      <category>industry</category>
      <category>social</category>
      <category>osx</category>
      <category>ios</category>
      <category>windows</category>
      <category>round-up</category>
    </item>
  </channel>
</rss>
