<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>John Marstall</title>
	<atom:link href="https://theiconmaster.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://theiconmaster.com</link>
	<description></description>
	<lastBuildDate>Tue, 16 Jun 2015 15:54:45 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
	<item>
		<title>Transitioning between view controllers in the same window, with Swift &#8211; Mac</title>
		<link>https://theiconmaster.com/2015/03/transitioning-between-view-controllers-in-the-same-window-with-swift-mac/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Tue, 24 Mar 2015 22:01:33 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=668</guid>

					<description><![CDATA[I suppose because both storyboards for Mac projects and the Swift language are so new, figuring out how to use them together was more aggravating than expected. This overview is offered as a resource to help others skip some of the pain I encountered, though it should not be taken as a recommendation for production [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I suppose because both storyboards for Mac projects and the Swift language are so new, figuring out how to use them together was more aggravating than expected.</p>
<p>This overview is offered as a resource to help others skip some of the pain I encountered, though it should not be taken as a recommendation for production code. I am primarily a designer, and was trying to build a quick-and-dirty prototype. This is not a reference for programmers, but prototypers, and frequently glosses over Swift features that programmers would consider fundamental.</p>
<p>What we want to do is animate nicely between two views in the same window, with the window resizing as necessary to match whichever is the current view.</p>
<blockquote><p>Launch Xcode. Select File &gt; New &gt; Project. Choose OS X &gt; Application &gt; Cocoa Application. Hit Next. Fill out the product details however you like, but make sure the language is set to Swift (I&rsquo;m no use to you with Objective-C) and &ldquo;Use Storyboards&rdquo; is checked. After the project is created, select &ldquo;Main.storyboard&rdquo; in the Project navigator (folder icon in the left-most pane.)</p></blockquote>
<p>To do this, we&rsquo;ll need four things on our storyboard:</p>
<blockquote>
<ul>
<li>
<div class="page" title="Page 2">
<div class="section">
<div class="layoutArea">
<div class="column">
<p>The window controller, already provided. Its size doesn&rsquo;t matter, but <strong>you need to turn off its &ldquo;Resize&rdquo; capability</strong> in the Attributes Inspector (that&rsquo;s the fourth button in the inspector on the right side of the Xcode window.) View transitions within user-resizable windows are possible, but beyond the scope of this project.</p>
<p>Really, turn off window resizing. It&rsquo;ll be a big headache later if you don&rsquo;t.</p>
</div>
</div>
</div>
</div>
</li>
<li>
<div class="page" title="Page 2">
<div class="section">
<div class="layoutArea">
<div class="column">
<p>A &ldquo;container&rdquo; view controller occupying the &ldquo;window content&rdquo; relationship to the window controller. Again, just use the initially provided view controlller. Its size doesn&rsquo;t matter either &ndash; we&rsquo;ll set that in code; but keep in mind anything you place within this view controller&rsquo;s view will be visible in the app at runtime. (You therefore probably want to leave it devoid of content.)</p>
</div>
</div>
</div>
</div>
</li>
<li>An &ldquo;origin&rdquo; view controller that will contain the initial view the user sees. The size you assign its view will determine the size of the window at runtime.</li>
</ul>
<p>From the Object library in the lower right, find the View Controller and drag it onto the storyboard. Then find the Push Button and place one inside the view controller.</p></blockquote>
<ul>
<li>A &ldquo;destination&rdquo; view controller that will contain the view at which the user arrives after interacting with the origin view. The size you assign its view will determine how the window resizes following that interaction.</li>
</ul>
<blockquote><p>Again, drag a view controller onto the storyboard and place a push button within it.</p></blockquote>
<p>You&rsquo;ve probably noticed the &ldquo;origin&rdquo; and &ldquo;destination&rdquo; view controllers display no obvious relationship to the window or &ldquo;container&rdquo; controllers. This is because making the transition happen requires <em>both</em> the origin and destination to be designated as children of the container, and this is not possible via storyboard manipulation alone.</p>
<p>We need to build that relationship with Swift code, and that means we need to be able to identify some of these storyboard identities in code. For that, we&rsquo;ll need the name of the storyboard file &ndash; usually &ldquo;Main.storyboard&rdquo; &ndash; and a couple &ldquo;Storyboard IDs&rdquo; we&rsquo;ll set. Storyboard IDs are set via the Identity inspector, the third button in the inspector on the right side of the Xcode window.</p>
<p>In my example, I&rsquo;m identifying the &ldquo;container&rdquo; view controller as &ldquo;containerViewController&rdquo; and the &ldquo;origin&rdquo; view controller as &ldquo;sourceViewController.&rdquo; It&rsquo;s not necessary to set a Storyboard ID for the &ldquo;destination&rdquo; view controller, which is lucky for us &ndash; it means we could set up an indefinite chain of destinations and not have to rewrite any code for the additional view controllers. For clarity&rsquo;s sake, however, I will refer to the &ldquo;destination&rdquo; view controller as if we&rsquo;d assigned it the Storyboard ID &ldquo;destinationViewController.&rdquo;</p>
<blockquote><p>Assign Storyboard IDs &ldquo;containerViewController&rdquo; to the window&rsquo;s attached view controller and &ldquo;sourceViewController&rdquo; to the first additional view controller you created. Make sure you&rsquo;re selecting the view controller itself and not anything within the controller. Click the blue icon at the top of the controller if you&rsquo;re unsure. The Storyboard ID field is found in the Identity inspector.</p></blockquote>
<p>Building the initial parent-child relationship will only involve connecting containerViewController and sourceViewController. We&rsquo;ll hold off on adding destinationViewController as a child until we really need it.</p>
<p>To do this, we&rsquo;ll create a new kind of view controller &ndash; that is, a &ldquo;subclass&rdquo; of Apple&rsquo;s own NSViewController.</p>
<blockquote><p>That&rsquo;s done with File &gt; New &gt; File and selecting OS X &gt; Source &gt; Cocoa Class. Use &ldquo;ContainerViewController&rdquo; for the class name and NSViewController for the thing it&rsquo;s subclassing. Uncheck &ldquo;Also create XIB file&rdquo; and leave the language as Swift.</p></blockquote>
<p>Set the containerViewController to use the ContainerViewController class by selecting it on the storyboard and entering &ldquo;ContainerViewController&rdquo; in the Class field on the Identity inspector (third inspector button).</p>
<p>We want the containerViewController to do several things when it first loads, so we&rsquo;re going to add several expressions within the <code>viewDidLoad()</code> function. Everything we add should be entered following the <code>// Do view setup here</code> comment but before the curly bracket that follows it.</p>
<p>We want to point containerViewController at sourceViewController, which would be easy if they were connected on the storyboard. Since we can&rsquo;t do it that way, we&rsquo;re going to direct the ContainerViewController class to the storyboard instead. But the Main.storyboard file isn&rsquo;t yet something ContainerViewController knows about. We have to &ldquo;import&rdquo; it, if you will, as an NSStoryboard object. That looks like this:</p>
<pre><code class="language-swift">let mainStoryboard: NSStoryboard = NSStoryboard(name: "Main", bundle: nil)!</code></pre>
<p>This is not a Swift language guide, but I&rsquo;ll break this down a bit. <code>let</code> is a Swift keyword that means we&rsquo;re going to create a new constant &ndash; a variable that doesn&rsquo;t vary. <code>mainStoryBoard</code> is just the name of the constant, which could be anything, but we want the name to make clear what it is. <code>: NSStoryboard</code> signifies this constant will be of the type &ldquo;NSStoryboard&rdquo;. The equals sign means that constant will be made equal to what follows, and what follows is a method for getting the storyboard file named &ldquo;Main.&rdquo;</p>
<blockquote><p>The exclamation mark is used to insist on something we know exists but which Xcode isn&rsquo;t so sure about. As we said, ContainerViewController doesn&rsquo;t normally know about Main.storyboard; so we&rsquo;re telling Xcode to take our word for it that there is a storyboard named &ldquo;Main.&rdquo;</p>
<p>Programmers refer to this use of the exclamation mark as forced unwrapping, but I prefer to think of it as an &ldquo;insist.&rdquo;</p></blockquote>
<p>Now we have the storyboard as a Swift object and can address anything within it that we&rsquo;ve assigned a Storyboard ID. Handy!</p>
<p>Next we grab our sourceViewController off the storyboard and render it to another constant:</p>
<pre><code class="language-swift">let sourceViewController = mainStoryboard.instantiateControllerWithIdentifier("sourceViewController") as NSViewController</code></pre>
<p>Since we established mainStoryboard is an NSStoryboard, we can do NSStoryboard things with it like <code>.instantiateControllerWithIdentifier()</code>. That means we tell Swift to grab the view controller with the Storyboard ID in the parentheses &ndash; &ldquo;sourceViewController&rdquo; &ndash; and spin it up so we can put it to use.</p>
<p>(It&rsquo;s also possible to use <code>.instantiateControllerWithIdentifier()</code> to grab that other kind of controller, a window controller. That may be why we need to specify <code>as NSViewController</code> at the end there.)</p>
<p>At last we can connect containerViewController to sourceViewController as parent and child:</p>
<pre><code class="language-swift">self.insertChildViewController(sourceViewController, atIndex: 0)</code></pre>
<p>Since <code>self</code> here is going to be the containerViewController, we&rsquo;ve told it to insert sourceViewController as a child of itself. We have to provide the index value because containerViewController could have more than one child controller and we need to explain where in the stack sourceViewController is meant to go. Since it&rsquo;s the first child controller it goes in at the first index, index 0. (Programmers always start counting at zero, just accept it.)</p>
<p>Interestingly, if you run your app at this point you <em>won&rsquo;t</em> see sourceViewController get pulled in. That&rsquo;s because while it&rsquo;s being added as a child controller &ldquo;in the background&rdquo; we haven&rsquo;t expressly said we want to make it visible yet. (Sigh, I know. Always explaining to computers the obvious&#8230;)</p>
<p>Tell containerViewController to show the view in sourceViewController as a subview of its own:</p>
<pre><code class="language-swift">self.view.addSubview(sourceViewController.view)</code></pre>
<p>Now it will show up, but it&rsquo;s likely your window size will be out of whack. We fix that by getting containerViewController to resize itself according to the size of the view in sourceViewController. What we want to mess with is the box around the view, which is called the view&rsquo;s &ldquo;frame.&rdquo; The frame includes both the view box&rsquo;s point of origin as well as its width and height.</p>
<p>Here&rsquo;s how we tell containerViewController to match its view&rsquo;s frame to that of the sourceViewController:</p>
<pre><code class="language-swift">self.view.frame = sourceViewController.view.frame</code></pre>
<p>That&rsquo;s all we need to do in ContainerViewController. If you run your app now, you should see sourceViewController appear in the app window; but the button you added won&rsquo;t do anything yet. That&rsquo;s next.</p>
<p>Return to Main.storyboard. Select the push button you added to sourceViewController. Hold down the control key and drag the blue connecting line into destinationViewController. Release the mouse button, then select &ldquo;custom&rdquo; from the Action Segue popup.</p>
<p>What we&rsquo;ve done is create a new &ldquo;segue&rdquo; from sourceViewController to destinationViewController. Custom segues require custom code &ndash; that we haven&rsquo;t written &ndash; so this won&rsquo;t do much yet.</p>
<p>Next, select the push button in destinationViewController and control-drag back toward sourceViewController. Again, select &ldquo;custom&rdquo; segue.</p>
<p>A segue is just a transition from one view controller to another. Apple provides the built-in types shown in the Action Segue popup, but none of those will provide the kind of transition we want. That&rsquo;s why we&rsquo;re creating our own. Unfortunately this takes quite a bit of code. Hang in there.</p>
<p>We&rsquo;re going to create another subclass, this time of NSStoryboardSegue, and call it CrossfadeStoryboardSegue.</p>
<blockquote><p>Select File &gt; New &gt; File and OS X &gt; Source &gt; Cocoa Class. Use &ldquo;CrossfadeStoryboardSegue&rdquo; for the class name and NSStoryboardSegue for the thing it&rsquo;s subclassing. Leave the language as Swift.</p></blockquote>
<p>The first thing a custom segue has to do is pull in the identities of the controllers it&rsquo;s connecting. We do that with the following block of code:</p>
<pre><code class="language-swift">override init(identifier: String?,
    source sourceController: AnyObject,
    destination destinationController: AnyObject) {
            var myIdentifier : String
            if identifier == nil {
                myIdentifier = ""
            } else {
                myIdentifier = identifier!
            }
            super.init(identifier: myIdentifier, source: sourceController, destination: destinationController)
}</code></pre>
<p>Now we&rsquo;re going to customize what happens when our storyboard segue performs its animation. We do that by adding an</p>
<pre><code class="language-swift">override func perform() {
}</code></pre>
<p>function underneath the init function we just added. (Make sure both functions are still within the curly brackets which enclose the class definition.) We&#8217;re customizing <code>perform()</code> because it&#8217;s the block that will execute when the segue is performed.</p>
<p>At this point all three view controllers. (containerViewController, sourceViewController and destinationViewController) are hanging around in code, either initialized within ContainerViewController or connected by the segue. We&rsquo;re going to create handy references to each. Note that at this point we can count on containerViewController already being a parent to sourceViewController, so we point Xcode to it as such.</p>
<pre>let sourceViewController = self.sourceController as! NSViewController
let destinationViewController = self.destinationController as! NSViewController
let containerViewController = sourceViewController.parentViewController!</pre>
<blockquote><p>This last is an important line. My first instinct was to import the storyboard and re-initialize containerViewController by its Storyboard ID. But it seems that would actually create a second instance of the controller. By referring to it here via its parent relationship, we get the existing, already-initialized controller we need.</p></blockquote>
<p>The exclamation marks are especially confusing here. What we&rsquo;re saying is something like: for this to work, we really need sourceViewController and destinationViewController to be treated as NSViewControllers (rather than NSWindowControllers, which is the only other possibility). We also really need sourceViewController&rsquo;s parent controller. So long as we insist on all of that, the rest of our code will work.</p>
<p>So sourceViewController is already a set as a child of destinationViewController. It&rsquo;s time to do the same for destinationViewController:</p>
<pre><code class="language-swift">containerViewController.insertChildViewController(destinationViewController, atIndex: 1)</code></pre>
<p>We&rsquo;re inserting at index 1 this time because we don&rsquo;t want to lose our sourceViewController hanging out at index 0.</p>
<p>Because we&rsquo;re going to resize the window to match the dimensions of destinationViewController, it&rsquo;ll make our work easier if we store that size information in some handy variables now:</p>
<pre><code class="language-swift">var targetSize = destinationViewController.view.frame.size
var targetWidth = destinationViewController.view.frame.size.width
var targetHeight = destinationViewController.view.frame.size.height</code></pre>
<p>Remember, the view&rsquo;s frame is its box containing origin, width and height. So from <code>.view.frame</code> we can grab <code>.view.frame.size</code>, which includes the width and height but not the origin. From <code>.view.frame.size</code> we can grab <code>.view.frame.size.width</code> and <code>.view.frame.size.height</code>, each one still more narrowly focused than <code>.view.frame.size</code>.</p>
<p>(If you wanted to get at the origin alone, you could do <code>.view.frame.size.origin</code> or &ndash; more specifically &ndash; <code>.view.frame.size.origin.x</code> and <code>.view.frame.size.origin.y</code>. We don&rsquo;t need those in this case.)</p>
<p>We&rsquo;re finally ready to animate our view controllers. First we have to prep each controller for animation by granting it a Core Animation layer:</p>
<pre><code class="language-swift">sourceViewController.view.wantsLayer = true
destinationViewController.view.wantsLayer = true</code></pre>
<p>And then we tell containerViewController to make the transition happen:</p>
<pre><code class="language-swift">containerViewController.transitionFromViewController(sourceViewController, toViewController: destinationViewController, 
    options: NSViewControllerTransitionOptions.Crossfade, completionHandler: nil)</code></pre>
<p>All that is just to say: have containerViewController transition from sourceViewController to destinationViewController with the <code>Crossfade</code> option. <code>NSViewControllerTransitionOptions</code> offers a few methods for animating this transition, including sliding the new view controller in from one side or another.</p>
<p>I can only guess at what a <code>completionHandler</code> is, but setting it to &ldquo;nil&rdquo; makes Xcode happy.</p>
<p>At this point we have a custom segue that will mostly work, though we have to establish that this is the segue we want our view controllers to use. Go back to Main.storyboard, click on each of the segue arrows connecting sourceViewController and destinationViewController, and in the Attributes inspector (fourth button in the inspector on the right side of the Xcode window) enter &ldquo;CrossfadeStoryboard&rdquo; for Segue Class.</p>
<p>You can now run your app and try the button in sourceViewController. It will at least animate the transition to destinationViewController, though you may not like how destinationViewController fits in the window. That&rsquo;s because we haven&rsquo;t told the window to resize to fit it.</p>
<p>Go back to CrossfadeStoryboardSegue.swift and add the following on the next available line of the <code>perform()</code> function:</p>
<pre><code class="language-swift">sourceViewController.view.animator().setFrameSize(targetSize)
destinationViewController.view.animator().setFrameSize(targetSize)</code></pre>
<p>Because we set up sourceViewController and destinationViewController with Core Animation layers earlier, we can now use the <code>animator()</code> feature on their views. <code>animator()</code> can do many things, but here we&rsquo;re just using it to resize the frames for both source and destination controllers. Our end goal for both controllers is to be the size of the destination controller, which we captured earlier in the variable <code>targetSize</code>. sourceViewController needs to resize itself to match the size of destinationViewController as that controller fades in.</p>
<p>But why does destinationViewController need to resize itself to match the very size we grabbed from destinationViewController? I&rsquo;m not entirely sure, honestly. My best guess is somewhere in the process destinationViewController adapted its size to that of its parent, containerViewController, requiring us to get it straightened out here.</p>
<p>All that remains, really, is to resize the app window. First, we need to get the current size and location of the window by storing its frame:</p>
<pre><code class="language-swift">var currentFrame = containerViewController.view.window?.frame</code></pre>
<p>containerViewController is still the window&rsquo;s main view controller, so it&rsquo;s the best controller to ask about the current window size. <code>view.window</code> means something like &ldquo;the window containing this view.&rdquo; And what we need is not the window but its location and size &ndash; its frame.</p>
<p>Why the question mark? Question marks in Swift indicate a value that is optional. We&rsquo;re indicating that containerViewController&rsquo;s view may or may not be in a window at runtime. It&rsquo;s almost certainly going to be in a window because of the setup we&rsquo;ve done elsewhere, but Xcode can&rsquo;t know that just looking at our custom segue code. So we tell Xcode to relax a little.</p>
<p>What we&rsquo;re going to do with the next several lines of code is manipulate this <code>currentFrame</code> and then pass it back to the window so it resizes the way we want. There&rsquo;s a catch, though &ndash; we can&rsquo;t readily manipulate <code>currentFrame</code> in its current form. We have to convert it from its current form (NSRect, the usual for a view&rsquo;s frame) to a CGRect.</p>
<pre><code class="language-swift">var currentRect = NSRectToCGRect(currentFrame!)</code></pre>
<p>This time the &ldquo;insist&rdquo; is required because we indicated window may not be available (window?), but currentFrame depends on window. We could have &ldquo;insisted&rdquo; on window instead &ndash; window! &ndash; and Xcode would have allowed currentFrame to stand without the punctuation.</p>
<p>So now we have the window&rsquo;s frame stored as <code>currentFrame</code> and a CGRect version called <code>currentRect</code>. We want to resize this to match <code>targetFrame</code> (using <code>targetWidth</code> and <code>targetHeight</code>) but we also want to shift it along the x and y axes so the window seems to resize from the center rather than the top left.</p>
<p>Making that happen is a matter of shifting the frame one half of the difference in dimensions between the original <code>currentFrame</code> and the end goal <code>targetFrame</code>. We need to do the math to get those horizontal and vertical shifts first:</p>
<pre><code class="language-swift">var horizontalChange = (targetWidth - containerViewController.view.frame.size.width)/2
var verticalChange = (targetHeight - containerViewController.view.frame.size.height)/2</code></pre>
<p><code>horizontalChange</code> is the difference between <code>targetWidth</code> (the width of destinationViewController&rsquo;s view frame) and the width of containerViewController&rsquo;s view frame, divided by two. <code>verticalChange</code> is the difference between <code>targetHeight</code> (the height of destinationViewController&rsquo;s view frame) and the height of containerViewController&rsquo;s view frame, divided by two.</p>
<p>Now we can take <code>horizontalChange</code>, <code>verticalChange</code>, <code>targetWidth</code> and <code>targetHeight</code> and make a new NSRect from them.</p>
<pre><code class="language-swift">var newWindowRect = NSMakeRect(currentRect.origin.x - horizontalChange, 
    currentRect.origin.y - verticalChange, targetWidth, targetHeight)</code></pre>
<p><code>NSMakeRect</code> is a function for making rects, natch, and requires four components: the x and y for the upper left origin of the rect, and a width and height. We want our x and y to be the same as that of the current window, but adjusted for the difference between it and the destinationViewController frame origin. The width and height are just the <code>targetWidth</code> and <code>targetHeight</code> we&#8217;ve already established.</p>
<p><em>Finally</em> we can resize the window:</p>
<pre><code class="language-swift">containerViewController.view.window?.setFrame(newWindowRect, display: true, animate: true)</code></pre>
<p>We tell containerViewController to set the frame of its window (which continues to maybe not exist, hence the question mark) to the <code>newWindowRect</code> we just created.</p>
<p>It&rsquo;s fairly clear that setting <code>animate</code> to <code>false</code> will cause the window to snap to the new size instantly. It&rsquo;s less clear what <code>display</code> is doing there. Setting it to <code>false</code> has no obvious effect. Well, we certainly want to display the new window so <code>true</code> it is.</p>
<p>At this point your view controller transition, complete with window resize, is finished. Since sourceViewController is no longer visible in the window, it might be wise to dump it from the hierarchy:</p>
<pre><code class="language-swift">containerViewController.removeChildViewControllerAtIndex(0)</code></pre>
<p>And Bob&rsquo;s your uncle. For as much code as the custom segue requires, you only have to write it once &#8212; the same segue can be used anytime you want to create the same kind of transition &#8212; even if it&#8217;s in an entirely new project. You just have to make sure your source controller is connected as a child to a container controller first.</p>
<p><a href="http://theiconmaster.com/downloads/ViewControllerTransitionDemo.zip">Download the example project</a> (requires Xcode 6.2).</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Why I Scrub My Tweets</title>
		<link>https://theiconmaster.com/2015/03/why-i-scrub-my-tweets/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Tue, 17 Mar 2015 21:40:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=661</guid>

					<description><![CDATA[I'm on <a href="http://twitter.com/iconmaster">Twitter</a>. More than one person has noticed I've begun deleting old tweets, and asked me about it.

The short version of my reasoning is: in recent years I've seen the internet produce a tendency toward mob mentality that can accomplish scary effects.

The longer version is, I read <a href="http://www.nytimes.com/2015/02/15/magazine/how-one-stupid-tweet-ruined-justine-saccos-life.html">this article</a> about the lasting consequences for Justine Sacco produced by just one poor-taste tweet, and I got to thinking. Then I read <a href="http://fusion.net/story/50322/meet-the-tweet-deleters-people-who-are-making-their-twitter-histories-self-destruct/">this other article</a> about twitter users who regularly prune their timelines, and got to thinking some more.

Then I decided to wipe out my Twitter history, and keep it wiped.

It's unlikely I'll ever post anything as instantly offensive to such a large portion of the web-using population as Justine Sacco's heard-round-the-world tweet. But the thing with the modern internet is you can never tell just what's going to set it off. What you might consider a harmless snarky remark (and, honestly, that's about all for which I use Twitter) may offend the sensibilities of a stranger on the other side of the planet -- and then the rest of the web will gleefully roast you over it, for the lulz.

Effectively, with never a shot fired, the internet has become its own police state.

Wiping my Twitter history doesn't protect me from the web in all respects. But it should largely safeguard me against that particularly egregious online dogpiling tactic: digging up a remark made years ago in order to shame someone who's only just become noteworthy. 

(I do not foresee any reason I should become suddenly noteworthy in the near future; this is all done from an abundance of caution.)

<h4>How It's Done</h4>

There are two stages to wiping one's Twitter history -- deleting the existing history, and "ongoing maintenance." There are a number of tools which claim to be able to delete your old tweets in bulk, but after much trying I found only one that really works: the <a href="http://martani.github.io/Twitter-Archive-Eraser/">Twitter Archive Eraser</a> by Martani Fakhrou. It does only run on Windows, but these days that's no great hardship for the tenacious Mac user. Just get Oracle's free <a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a> and install on it the <a href="http://windows.microsoft.com/en-us/windows/preview-iso">Windows 10 Technical Preview</a>

Once you've signed in with the Archive Eraser it's easy to delete tweets whole months or years at a time.

After wiping the slate clean, you need a way to make sure your history gets pruned on an ongoing basis. I use <a href="http://www.tweetdelete.net/">TweetDelete</a> and set it to delete everything older than one week. Due to the frequency at which TweetDelete scans timelines, you'll occasionally see an eight-day-old tweet even with this setting. That's okay.

Short of shutting down Twitter (and, well, this blog) entirely, there's no ironclad protection from the internet mob. But following the steps above have allowed me to continue tweeting with a new peace of mind.]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m on <a href="http://twitter.com/iconmaster">Twitter</a>. More than one person has noticed I&#8217;ve begun deleting old tweets, and asked me about it.</p>
<p>The short version of my reasoning is: in recent years I&#8217;ve seen the internet produce a tendency toward mob mentality that can accomplish scary effects.</p>
<p>The longer version is, I read <a href="http://www.nytimes.com/2015/02/15/magazine/how-one-stupid-tweet-ruined-justine-saccos-life.html">this article</a> about the lasting consequences for Justine Sacco produced by just one poor-taste tweet, and I got to thinking. Then I read <a href="http://fusion.net/story/50322/meet-the-tweet-deleters-people-who-are-making-their-twitter-histories-self-destruct/">this other article</a> about twitter users who regularly prune their timelines, and got to thinking some more.</p>
<p>Then I decided to wipe out my Twitter history, and keep it wiped.</p>
<p>It&#8217;s unlikely I&#8217;ll ever post anything as instantly offensive to such a large portion of the web-using population as Justine Sacco&#8217;s heard-round-the-world tweet. But the thing with the modern internet is you can never tell just what&#8217;s going to set it off. What you might consider a harmless snarky remark (and, honestly, that&#8217;s about all for which I use Twitter) may offend the sensibilities of a stranger on the other side of the planet &#8212; and then the rest of the web will gleefully roast you over it, for the lulz.</p>
<p>Effectively, with never a shot fired, the internet has become its own police state.</p>
<p>Wiping my Twitter history doesn&#8217;t protect me from the web in all respects. But it should largely safeguard me against that particularly egregious online dogpiling tactic: digging up a remark made years ago in order to shame someone who&#8217;s only just become noteworthy. </p>
<p>(I do not foresee any reason I should become suddenly noteworthy in the near future; this is all done from an abundance of caution.)</p>
<h4>How It&#8217;s Done</h4>
<p>There are two stages to wiping one&#8217;s Twitter history &#8212; deleting the existing history, and &#8220;ongoing maintenance.&#8221; There are a number of tools which claim to be able to delete your old tweets in bulk, but after much trying I found only one that really works: the <a href="http://martani.github.io/Twitter-Archive-Eraser/">Twitter Archive Eraser</a> by Martani Fakhrou. It does only run on Windows, but these days that&#8217;s no great hardship for the tenacious Mac user. Just get Oracle&#8217;s free <a href="https://www.virtualbox.org/wiki/Downloads">Virtual Box</a> and install on it the <a href="http://windows.microsoft.com/en-us/windows/preview-iso">Windows 10 Technical Preview</a></p>
<p>Once you&#8217;ve signed in with the Archive Eraser it&#8217;s easy to delete tweets whole months or years at a time.</p>
<p>After wiping the slate clean, you need a way to make sure your history gets pruned on an ongoing basis. I use <a href="http://www.tweetdelete.net/">TweetDelete</a> and set it to delete everything older than one week. Due to the frequency at which TweetDelete scans timelines, you&#8217;ll occasionally see an eight-day-old tweet even with this setting. That&#8217;s okay.</p>
<p>Short of shutting down Twitter (and, well, this blog) entirely, there&#8217;s no ironclad protection from the internet mob. But following the steps above have allowed me to continue tweeting with a new peace of mind.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gamers: Still Alive</title>
		<link>https://theiconmaster.com/2014/09/gamers-still-alive/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Sat, 06 Sep 2014 18:22:50 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[gaming]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=643</guid>

					<description><![CDATA[<p>Gamers are under attack.</p>
<p>I&#8217;m not going to recap the current gaming industry brouhaha here. If you need a summary, I like this one from Slate:</p>
<p><a href="http://www.slate.com/articles/technology/bitwise/2014/09/gamergate_explodes_gaming_journalists_declare_the_gamers_are_over_but_they.html">Gaming Journalists Declare That &#8220;Gamers Are Over,&#8221; But They Are the Ones Becoming Obsolete</a></p>
<p>(It&#8217;s worth it for the last sentence.)</p>
<p>There are a couple angles to this assault on the gamer identity. The first has been floating around a while, but the second is new and more vehement. I&#8217;ll try to address each in turn.</p>
<p>You see, I am myself a gamer.</p>
<h3>The concept of gamer has become obsolete</h3>
<p>First, there is the notion that as gaming matures the need to differentiate the &#8220;gamer&#8221; from the rest of the populace will dwindle. This is clearly expressed in <a href="http://bogost.com/writing/the_end_of_gamers/">the work of Ian Bogost</a> (sorry, Ian):</p>
<blockquote>
<p>When we acknowledge videogames as a medium, the notion of a monolithic games industry, which creates a few kinds of games for a few kinds of players, stops making any sense. As does the idea of a demographic category called &#8220;gamers&#8221;&#157; who are the ones who play these games.</p>
</blockquote>
<p>The issue I take with this is that &#8220;gamer&#8221; is something more than its base denotation of &#8220;one who plays games.&#8221; As Ian <a href="https://twitter.com/ibogost/status/504603311228477442">has himself said</a>, &#8220;The problem with this &#8216;women are the majority of gamers&#8217; line the press loves is that most women (rightly) want nothing to do with being &#8216;gamers.&#8217;&#8221;</p>
<p>So if a gamer is not just anyone who plays games, what is it? This turns out to be actually very simple: a gamer, I submit, is simply a <em>gaming enthusiast.</em> That&#8217;s all.</p>
<p>Do we need such a category? Well, we seem to draw the &#8220;enthusiast&#8221; distinction in many other areas of life. For example, there is no living man or woman who fails to eat on a fairly regular basis. Yet we would not consider every living man and woman a &#8220;foodie.&#8221; We have come up with the term &#8220;foodie&#8221; to describe those who do not merely eat, but display a refined and enthusiastic interest in their food. (And we&#8217;ve had similar terms, such as &#8220;gourmand,&#8221; for much longer.)</p>
<p>So the term &#8220;gamer&#8221; is not, in my book, terribly complicated nor especially redundant. And it&#8217;s certainly not derogatory, so long as you believe games can be worthwhile.</p>
<h3>The concept of gamer describes a reprehensible segment of society</h3>
<p>That brings me to the second, more current criticism: that &#8220;gamer&#8221; remains a useful category, but only because the body it delineates is one which ought to be singled out for censure.</p>
<p>This argument seems to have been first advanced by Leigh Alexander in her piece, <a href="http://www.gamasutra.com/view/news/224400/Gamers_dont_have_to_be_your_audience_Gamers_are_over.php">'Gamers' don't have to be your audience. 'Gamers' are over</a>:</p>
<blockquote>
<p>[I]t&#8217;s not even culture. It&#8217;s buying things, spackling over memes and in-jokes repeatedly, and it&#8217;s getting mad on the internet&#8230;These obtuse sh**slingers, these wailing hyper-consumers, these childish internet-arguers &#8211; they are not my audience. They don&#8217;t have to be yours. There is no &#8216;side&#8217; to be on, there is no &#8216;debate&#8217; to be had.</p>
</blockquote>
<blockquote>
<p>There is what&#8217;s past and there is what&#8217;s now.</p>
</blockquote>
<p>This distinction &#8211; between reactionary gamers clinging to a dead past and progressive&#8230; non-gamers who still enjoy games, I suppose, working toward a new future &#8211; appears again in a <a href="http://time.com/3274247/video-game-culture-war/">subsequent piece</a> Alexander writes for Time magazine:</p>
<blockquote>
<p>As video games unshackle from old constraints, traditional fans double down on keeping the treehouse sacrosanct.</p>
</blockquote>
<p>(This is, by the way, the sort of &#8220;with us or against us&#8221;/&#8220;right side of history&#8221; triumphalist rhetoric that makes one devilishly hard to have a conversation with.)</p>
<p>What did gamers do to invite such vitriol? This is where some will accuse me of burying the lede, although anyone who&#8217;s followed this debate knew the lede already: certain game developers and critics have been taking tremendous heat for working to advance their causes within the games industry.</p>
<p>I don&#8217;t condone any of it. I&#8217;m especially distressed at the effect which this hostility seems to be having on games writer Jenn Frank. Anita Sarkeesian, who must have a skin of adamantium by now, is providing a useful critical counterpoint and ought to be allowed the space to continue doing so.</p>
<p>But a total conflation of &#8220;gamers&#8221; with the vocal mob will not withstand scrutiny. Some gamers are on the offensive; others are rallying to the affected. To ignore this fact would be to stoop to a level of broad-brush rhetoric no more sensible than the personal slurs which we decry.</p>
<p>As a gamer, I present the following principles for consideration:</p>
<ol>
<li>Gamers should be free to advance their worldviews, even if those views are unpopular. That&#8217;s as true for feminism as for Christianity, or for Marixsm.</li>
<li>Gamers should be as free to advance their worldviews through game criticism or through the medium of games itself.</li>
</ol>
<p>We need to make more careful distinctions. The gamer is not dying, nor does the gamer need snuffing out. On the contrary, I expect the gamer will only thrive. I love gamers. I&#8217;m proud to be one myself.</p>]]></description>
										<content:encoded><![CDATA[<p>Gamers are under attack, but I won’t recap the current gaming industry brouhaha here. If you need a summary, I like this one from Slate:</p>
<p><a href="http://www.slate.com/articles/technology/bitwise/2014/09/gamergate_explodes_gaming_journalists_declare_the_gamers_are_over_but_they.html">Gaming Journalists Declare That “Gamers Are Over,” But They Are the Ones Becoming Obsolete</a></p>
<p>(It’s worth it for the last sentence.)</p>
<p>There are a couple angles to this assault on the gamer identity. The first has been floating around a while, but the second is new and more vehement. I’ll try to address each in turn.</p>
<p>You see, I am myself a gamer.</p>
<h4>The concept of gamer has become obsolete</h4>
<p>First, there is the notion that as gaming matures the need to differentiate the “gamer” from the rest of the populace will dwindle. This is clearly expressed in <a href="http://bogost.com/writing/the_end_of_gamers/">the work of Ian Bogost</a> (sorry, Ian):</p>
<blockquote><p>When we acknowledge videogames as a medium, the notion of a monolithic games industry, which creates a few kinds of games for a few kinds of players, stops making any sense. As does the idea of a demographic category called “gamers” who are the ones who play these games.</p></blockquote>
<p>The issue I take with this is that “gamer” is something more than its base denotation of “one who plays games.” As Ian <a href="https://twitter.com/ibogost/status/504603311228477442">has himself said</a>, “The problem with this ‘women are the majority of gamers’ line the press loves is that most women (rightly) want nothing to do with being ‘gamers.’”</p>
<p>So if a gamer is not just anyone who plays games, what is it? This turns out to be actually very simple: a gamer, I submit, is simply a <em>gaming enthusiast.</em> That’s all.</p>
<p>Do we need such a category? Well, we seem to draw the “enthusiast” distinction in many other areas of life. For example, there is no living man or woman who fails to eat on a fairly regular basis. Yet we would not consider every living man and woman a “foodie.” We have come up with the term “foodie” to describe those who do not merely eat, but display a refined and enthusiastic interest in their food. (And we’ve had similar terms, such as “gourmand,” for much longer.)</p>
<p>So the term “gamer” is not, in my book, terribly complicated nor especially redundant. And it’s certainly not derogatory, so long as you believe games can be worthwhile.</p>
<h4>The concept of gamer describes a reprehensible segment of society</h4>
<p>That brings me to the second, more current criticism: that “gamer” remains a useful category, but only because the body it delineates is one which ought to be singled out for censure.</p>
<p>This argument seems to have been first advanced by Leigh Alexander in her piece, <a href="http://www.gamasutra.com/view/news/224400/Gamers_dont_have_to_be_your_audience_Gamers_are_over.php">&#8216;Gamers&#8217; don&#8217;t have to be your audience. &#8216;Gamers&#8217; are over</a>:</p>
<blockquote><p>[I]t’s not even culture. It’s buying things, spackling over memes and in-jokes repeatedly, and it’s getting mad on the internet…These obtuse sh**slingers, these wailing hyper-consumers, these childish internet-arguers – they are not my audience. They don’t have to be yours. There is no ‘side’ to be on, there is no ‘debate’ to be had.<br />
There is what’s past and there is what’s now.</p></blockquote>
<p>This distinction – between reactionary gamers clinging to a dead past and progressive… non-gamers who still enjoy games, I suppose, working toward a new future – appears again in a <a href="http://time.com/3274247/video-game-culture-war/">subsequent piece</a> Alexander writes for Time magazine:</p>
<blockquote><p>As video games unshackle from old constraints, traditional fans double down on keeping the treehouse sacrosanct.</p></blockquote>
<p>(This is, by the way, the sort of “with us or against us”/“right side of history” triumphalist rhetoric that makes one devilishly hard to have a conversation with.)</p>
<p>What did gamers do to invite such vitriol? This is where some will accuse me of burying the lede, although anyone who’s followed this debate knew the lede already: certain game developers and critics have been taking tremendous heat for working to advance their causes within the games industry.</p>
<p>I don’t condone any of it. I’m especially distressed at the effect which this hostility seems to be having on games writer Jenn Frank. Anita Sarkeesian, who must have a skin of adamantium by now, is providing a useful critical counterpoint and ought to be allowed the space to continue doing so.</p>
<p>But a total conflation of “gamers” with the vocal mob will not withstand scrutiny. Some gamers are on the offensive; others are rallying to the affected. To ignore this fact would be to stoop to a level of broad-brush rhetoric no more sensible than the personal slurs which we decry.</p>
<p>As a gamer, I present the following principles for consideration:</p>
<ol>
<li>Gamers should be free to advance their worldviews, even if those views are unpopular. That’s as true for feminism as for Christianity, or for Marixsm.</li>
<li>Gamers should be as free to advance their worldviews through game criticism as through the medium of games itself.</li>
</ol>
<p>On the other hand, we need to make more careful distinctions. The gamer is not dying, nor does the gamer need snuffing out. On the contrary, I expect the gamer will only thrive. I love gamers. I’m proud to be one myself.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Consequences</title>
		<link>https://theiconmaster.com/2013/03/consequences/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Tue, 19 Mar 2013 14:29:50 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=584</guid>

					<description><![CDATA[It&#8217;s just one anecdote, but it really brings Apple&#8217;s apparent dormancy out of the realm of the theoretical: &#8220;For years I stuck with my iPhone, not because it was the best phone on the market, but because of the app selection. It&#8217;s absolutely second to none. But every year I watched a new version of [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s just one anecdote, but it really brings Apple&#8217;s <a href="http://theiconmaster.com/2013/03/ceding-the-lead/">apparent dormancy</a> out of the realm of the theoretical:</p>
<p>&#8220;For years I stuck with my iPhone, not because it was the best phone on the market, but because of the app selection. It&#8217;s absolutely second to none. But every year I watched a new version of iOS announced with a slew of new features I didn&#8217;t care about, while core functionality (flaws and all) was left virtually unchanged.</p>
<p>&#8220;Meanwhile, I watched from afar as Google was iteratively improving Android into the open, flexible, intuitive OS that it is today. I recently made the switch from an iPhone 5 to a Nexus 4 and I haven&#8217;t looked back. All the things that bugged me about iOS were non-issues on this new platform. I found great substitutes for all my favourite iOS apps and even adopted a few new apps that were missing on iOS. Sure, there aren&#8217;t dozens of options for each individual app, but the quality of the top apps available today is really impressive.&#8221;</p>
<p>&#8220;For the first time, I&#8217;m looking forward to Google I/O more than WWDC this year to see what&#8217;s next for Android.&#8221;</p>
<p>From <a href="http://alpha.app.net/jsallis">Jason Sallis</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ceding the Lead</title>
		<link>https://theiconmaster.com/2013/03/ceding-the-lead/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Sat, 09 Mar 2013 18:11:57 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[ios]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=413</guid>

					<description><![CDATA[Apple is losing its lead in the area of user interface. I&#8217;m not talking about skeuomorphism, which is a poorly-understood concept anyway. Probably any good touch interface is skeuomorphic by nature: this is not really a page under glass that you&#8217;re sliding around in Safari or Chrome. Nor is this about the spectrum that lies [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Apple is losing its lead in the area of user interface. </p>
<p>I&#8217;m not talking about skeuomorphism, which is a poorly-understood concept anyway. Probably any good touch interface is skeuomorphic by nature: this is not really a page under glass that you&#8217;re sliding around in Safari or Chrome.</p>
<p>Nor is this about the spectrum that lies between totally flat design and extreme texture realism.<sup class='footnote'><a href='#fn-413-1' id='fnref-413-1' onclick='return fdfootnote_show(413)'>1</a></sup></p>
<p>Where I see Apple losing ground is in those areas which are really key to a user interface in the post-PC, touch-driven era. For me, that&#8217;s largely not about color, texture, shading or even icons(!).</p>
<p>Rather, interfaces succeed or fail on the basis of organization (of the whole), layout (of the immediate view), typography, responsiveness, constancy<sup class='footnote'><a href='#fn-413-2' id='fnref-413-2' onclick='return fdfootnote_show(413)'>2</a></sup> and accessibility. By “accessibility” I don&#8217;t mean only access for the impaired, but access to the features or information the user needs at any given moment. </p>
<p>So while Apple’s graphical surfaces continue to outshine the competition&#8217;s in attractiveness, its interfaces could be falling behind in other areas. </p>
<p>One of the most important issues of accessibility for modern touch devices is the virtual keyboard. It&#8217;s an interface we use constantly: for searching the web, for sending a message, for entering a password, for adding an appointment to a calendar or for adding comments to a photo.</p>
<p>As it stands, I&#8217;d rate Apple as holding a solid <em>third</em> place in keyboards. While it&#8217;s fast and responsive, offers user-definable shortcuts and includes a sometimes helpful, sometimes maddening autocorrection system, the iOS keyboard has changed very little since the iPhone was released in 2007. (Text fields did gain copy and paste, which are both helpful and maddening in other ways.) Meanwhile, keyboards in Android and Blackberry have pushed ahead with predictive auto-fill capabilities. These systems hone in on what your most likely next word is, and offer to let you insert it with a tap or gesture. Since typing on glass is never without some frustration, requiring fewer taps means fewer opportunities for aggravation.</p>
<p>Andy Ihnatko <a href="http://www.techhive.com/article/2030042/why-i-switched-from-iphone-to-android.html">switched to Android</a> in part because of its superior keyboard offerings; while <a href="http://arstechnica.com/gadgets/2013/02/review-blackberry-10-is-better-much-better-late-than-never/2/">Ars Technica concludes</a> &#8220;the BlackBerry 10 keyboard [with its flick-up-to-autofill feature] is one of the best virtual keyboards we&#8217;ve ever used.&#8221;</p>
<p>Good for Android and Blackberry 10. But it&#8217;s not just text <em>entry</em> where Apple is falling short; text <em>editing</em> remains remarkably painful on iOS. Having to fat-finger the insertion point into the hairline space between two letters so you can remove an unintended capitalization is a recipe for exasperation &#8212; and the need for doing so comes up multiple times a day. There are <a href="https://www.youtube.com/watch?v=RGQTaHGQ04Q">good ideas</a> out there for how iOS editing could be improved. So far, Apple hasn&#8217;t shown much zeal here.</p>
<p>There are accessibility issues beyond the keyboard. Toggling wifi or bluetooth connections and adjusting brightness remain points of annoyance on iOS. Switching apps on iPhone requires a clumsy double-click on a button that was never engineered for that purpose. And even on the large, pixel-rich display of the retina iPad, there is no way to load a social stream alongside a live video (as I&#8217;ve wanted to do during political debates) or keep an online article handy while writing a response to it.</p>
<p>These are all interface issues that have been addressed to one degree or another on other mobile platforms.</p>
<p>Sharing data between apps, or between devices, remains a profound hassle. Using a photo from one app in another usually requires the ridiculous step of saving it to a third app &#8212; Photos &#8212; first. And if you want to move that photo to another device (or to your Mac), well&#8230; I hope you&#8217;re a Dropbox user, because Apple can&#8217;t help you.</p>
<p>Nothing here represents a problem beyond Apple&#8217;s ability to solve.<sup class='footnote'><a href='#fn-413-3' id='fnref-413-3' onclick='return fdfootnote_show(413)'>3</a></sup> Instead, what we seem to be seeing here is an example of <a href="http://thetylerhayes.com/post/6614503705/ed-catmull-success-hides-problems">Ed Catmull&#8217;s adage</a>, &#8220;Success hides problems.&#8221; Apple continues to be monstrously successful across nearly every one of its product lines. If the iPhone 5 is the <a href="http://www.engadget.com/2013/02/20/iphone-5-tops-sales-q4-2012-strategy-analytics/">world&#8217;s best-selling smartphone</a> and the iPad is the leader among tablets, what can there be to fix? My fear is that at some point these little niggling annoyances &#8212; each minor enough when taken on its own &#8212; will cease to be worth putting up with as a whole. If these are all solved problems on other platforms, customers will start to wonder why they have to keep tolerating them on an Apple device.</p>
<p>At that point, it&#8217;s already too late.</p>
<p>Apple does many things exceptionally well. Its industrial design and hardware engineering aren&#8217;t in danger of being eclipsed anytime soon. But competitors are chipping away at its lead in user interface. If Apple means to stay at the top of the mobile market, it needs to start closing these gaps.</p>
<div class='footnotes' id='footnotes-413'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-413-1'> Talking about these design decisions as a matter of choosing one&#8217;s place on the spectrum, rather as a dichotomy which requires everyone choose a side, would be a helpful evolution of that discussion. <span class='footnotereverse'><a href='#fnref-413-1'>&#8617;</a></span></li>
<li id='fn-413-2'> Here I mean both &#8220;consistency&#8221; and &#8220;reliability.&#8221; An interface that changes with every view may suffer from inconstancy, but so might a particular view whose content fluctuates rapidly while struggling with sporadic availability of a server. <span class='footnotereverse'><a href='#fnref-413-2'>&#8617;</a></span></li>
<li id='fn-413-3'> Apple&#8217;s ongoing struggles with web services are another matter, but not an interface design issue. <span class='footnotereverse'><a href='#fnref-413-3'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Groceries Revolt</title>
		<link>https://theiconmaster.com/2013/03/the-groceries-revolt/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Wed, 06 Mar 2013 17:24:52 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[app store]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=398</guid>

					<description><![CDATA[One of my favorite iPhone apps, Groceries by Sophiestication Software, was recently updated to version 3.0. Its new features are mainly support for the taller screen of the iPhone 5 and a greater emphasis on adding items to grocery lists via autocompletion. In version 2.x, one could tap on a category &#8212; such as &#8220;Bakery&#8221; [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>One of my favorite iPhone apps, <a href="https://itunes.apple.com/us/app/groceries/id307711028?mt=8" title="Groceries on the App Store">Groceries</a> by Sophiestication Software, was recently updated to version 3.0. Its new features are mainly support for the taller screen of the iPhone 5 and a greater emphasis on adding items to grocery lists via autocompletion.</p>
<p>In version 2.x, one could tap on a category &#8212; such as &#8220;Bakery&#8221; or &#8220;Health &#038; Beauty&#8221; &#8212; then choose from a list of all known items in that category. As you can imagine, I never bothered with this approach. Instead, I used the search field. Start typing the name of your needed item, and Groceries would offer suggestions that matched your query. Tap to add the correct suggestion, then instantly start typing out your next item. </p>
<p>It was a fast input system, but there was room for improvement. Accessing the search field took one more tap than I preferred, and adding any information about the quantity needed (such as &#8220;2 dozen&#8221; or &#8220;1 gallon&#8221;) required backing out of the add-grocery mode and messing with the item you&#8217;d already added. Usually I just didn&#8217;t bother with quantities &#8212; too much trouble.</p>
<p>Enter version 3.0: autocompletion has now taken center stage. There are no categories to dig through &#8212; hitting the add-item plus sign button instantly lands you in the search field. Noting quantity is now integrated right into the grocery query. Typing &#8220;mil 2q&#8221; will offer &#8220;Milk (2 qt)&#8221; as the top hit. One tap adds both the item and its associated quantity. There&#8217;s no more backing out of the list-making process to add those details.</p>
<p>In my view, it&#8217;s hard to argue this isn&#8217;t a better system. It&#8217;s faster and requires several fewer taps per item. But the grocery-shopping public doesn&#8217;t agree. Since the release of version 3.0, Groceries has been hammered with 1-star reviews, and its rating stands at a positively-depressing 1.5 stars as of this writing.</p>
<p>What happened?</p>
<p>Incredibly, it seems quite a few users actually <em>preferred</em> digging through those old grocery store categories. They didn&#8217;t use the search field at all! And for those items which made the list frequently, they relied on the &#8220;Favorites&#8221; category to get at them without all the scrolling. Suddenly, that innocuous Update All button has completely changed the grocery game on these shoppers, and they are none too happy about it.</p>
<p>In the end, I don&#8217;t know how the update could have been better handled. There&#8217;s so much that&#8217;s better about Groceries 3.0, it would have been a shame to forego those improvements for the sake of maintaining the status quo. But one can understand why users who&#8217;ve come to rely on a particular interaction would be frustrated when that interaction changes with little warning. As <a href="http://twitter.com/hay" title="Mike Hay on Twitter">Mike Hay</a> suggests, this may just be an issue with how the App Store handles major updates. A user can be completely surprised by a strange, new version of an app; and she has no way to roll back to an earlier version.</p>
<p>I hope users of Groceries won&#8217;t give up on the new UI too quickly. It&#8217;s clever, easy to learn and more efficient once one gets the hang of it. It may be that Ms. Teutschler, the developer, can address some of the criticisms by adding a Favorites category back in somewhere. Meanwhile, I recommend you go <a href="https://itunes.apple.com/us/app/groceries/id307711028?mt=8" title="Groceries on the App Store">try it out</a>. If you come to it without preconceived notions of how a grocery list app should work, I think you&#8217;ll be very pleased.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Brave and the Individual</title>
		<link>https://theiconmaster.com/2012/06/brave-and-the-individual/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Sun, 24 Jun 2012 01:22:40 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[film]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=354</guid>

					<description><![CDATA[(Some spoilers below.)

Not every Pixar movie lends itself to extended discussion, but in my opinion two do: <em>The Incredibles</em>, and now <em>Brave</em>. 

Based on its trailers, I think many of us were expecting <em>Brave</em> to deliver a typically American story: bold heroine rejects the outmoded strictures of her time, meets resistance, ultimately triumphs and leaves everyone else a little wiser in the end. 

That's not <em>Brave.</em>

This is a good thing; because once you think about it, that typically American story is not especially sound. Though we conceive of ourselves as individuals, we necessarily live in society. We have to contend with families, neighborhoods, governments, workplaces, schools, teams, industry associations and more. We don't usually get to pick and choose which society's rules we want to abide by. In fact, we almost never do. We can at best nudge them in new directions, very slowly.

But this freedom to "nudge" reveals a profound degree of responsibility. Because all these societies are made up of <em>us,</em> they can only be of our making. As children, our instinct is to refuse responsibility for anything we did not "directly" cause. As adults, we begin to comprehend just how much of the world is on our shoulders. As we learn from <a href="http://en.wikipedia.org/wiki/Bug's_Life">another Pixar movie</a>, the first rule of leadership is "Everything is your fault." But it's also the first rule of adulthood. 

I do not operate every vehicle on the highway. But I take advantage of and contribute to a way of life that depends on the automobile. Thus, traffic congestion and air pollution are "my fault." I don't employ underpaid third-world workers, but I buy the products they assemble. Thus, their situation is "my fault." Maturity may be nothing more than embracing a wider and wider view of what ought rightfully to be considered to be my responsibility -- including responsibility for institutions we did not choose and might never have chosen given the opportunity. 

This is Merida's journey in <em>Brave.</em> She must move from a position of "It's not my fault" to "This is all my fault." She begins with rejecting the fabric of her society (made very explicit in one of the film's central metaphors!), but ends with both embracing it <em>and nudging</em> it along.[1. Bigger spoiler: Merida is allowed to marry for love, but as I understood it must still eventually marry for the sake of her kingdom.] Merida's tale is much more interesting than the mere iconoclast's journey, because her story is ours too. Like Merida, we have to learn how to become our best selves within a wider society. What does it mean to be brave within that framework? That's the question Pixar has put to us here.

(Besides offering food for thought, <em>Brave</em> is exciting, beautiful and touching. You should see it.)]]></description>
										<content:encoded><![CDATA[<p>(Some spoilers below.)</p>
<p>Not every Pixar movie lends itself to extended discussion, but in my opinion two do: <em>The Incredibles</em>, and now <em>Brave</em>. </p>
<p>Based on its trailers, I think many of us were expecting <em>Brave</em> to deliver a typically American story: bold heroine rejects the outmoded strictures of her time, meets resistance, ultimately triumphs and leaves everyone else a little wiser in the end. </p>
<p>That&#8217;s not <em>Brave.</em></p>
<p>This is a good thing; because once you think about it, that typically American story is not especially sound. Though we conceive of ourselves as individuals, we necessarily live in society. We have to contend with families, neighborhoods, governments, workplaces, schools, teams, industry associations and more. We don&#8217;t usually get to pick and choose which society&#8217;s rules we want to abide by. In fact, we almost never do. We can at best nudge them in new directions, very slowly.</p>
<p>But this freedom to &#8220;nudge&#8221; reveals a profound degree of responsibility. Because all these societies are made up of <em>us,</em> they can only be of our making. As children, our instinct is to refuse responsibility for anything we did not &#8220;directly&#8221; cause. As adults, we begin to comprehend just how much of the world is on our shoulders. As we learn from <a href="http://en.wikipedia.org/wiki/Bug's_Life">another Pixar movie</a>, the first rule of leadership is &#8220;Everything is your fault.&#8221; But it&#8217;s also the first rule of adulthood. </p>
<p>I do not operate every vehicle on the highway. But I take advantage of and contribute to a way of life that depends on the automobile. Thus, traffic congestion and air pollution are &#8220;my fault.&#8221; I don&#8217;t employ underpaid third-world workers, but I buy the products they assemble. Thus, their situation is &#8220;my fault.&#8221; Maturity may be nothing more than embracing a wider and wider view of what ought rightfully to be considered to be my responsibility &#8212; including responsibility for institutions we did not choose and might never have chosen given the opportunity. </p>
<p>This is Merida&#8217;s journey in <em>Brave.</em> She must move from a position of &#8220;It&#8217;s not my fault&#8221; to &#8220;This is all my fault.&#8221; She begins with rejecting the fabric of her society (made very explicit in one of the film&#8217;s central metaphors!), but ends with both embracing it <em>and nudging</em> it along.<sup class='footnote'><a href='#fn-354-1' id='fnref-354-1' onclick='return fdfootnote_show(354)'>1</a></sup> Merida&#8217;s tale is much more interesting than the mere iconoclast&#8217;s journey, because her story is ours too. Like Merida, we have to learn how to become our best selves within a wider society. What does it mean to be brave within that framework? That&#8217;s the question Pixar has put to us here.</p>
<p>(Besides offering food for thought, <em>Brave</em> is exciting, beautiful and touching. You should see it.)</p>
<div class='footnotes' id='footnotes-354'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-354-1'> Bigger spoiler: Merida is allowed to marry for love, but as I understood it must still eventually marry for the sake of her kingdom. <span class='footnotereverse'><a href='#fnref-354-1'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Inaugural WWDC Game Night</title>
		<link>https://theiconmaster.com/2012/06/wwdc-game-night/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Tue, 19 Jun 2012 15:22:28 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[wwdc]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=328</guid>

					<description><![CDATA[I love board games. Specifically, I love <a href="http://en.wikipedia.org/wiki/German-style_board_game">Euro games</a>. When I realized I'd be attending my first <a href="https://developer.apple.com/wwdc/">WWDC</a>, I decided there was a peanut-butter-and-chocolate intersection of interests that (as far as I know) had not been previously explored.

I floated the idea on Twitter and gauged the interest level. There seemed to be some, so I packed my copy of <a href="http://boardgamegeek.com/boardgame/36218/dominion">Dominion</a> -- counting on other gamers to flesh out the supply.

We were going to need the help, because once a time and place were set (June 13th, 8:30 in <a href="http://twitter.com/bilm">Bil Moorhead's</a> luxurious hotel suite), word spread. At its height, Game Night saw over 25 attendees -- not a massive party by WWDC standards, but certainly bigger than any social event I've organized. Dominion supports only four players. This could have been bad.

Fortunately, a number of guests showed up with games in tow. <a href="http://twitter.com/ashponders">Ash Ponders</a> brought Backgammon and <a href="http://twitter.com/katlillie">Katrina Montgomery</a> (who stomped over everyone in Dominion). <a href="http://twitter.com/MrRooni">Michael Fey</a> showed up with <a href="http://boardgamegeek.com/boardgame/1927/munchkin">Munchkin</a>, which kept the bulk of the guests entertained. And <a href="http://twitter.com/synstelien">Don Synstelien</a> provided <a href="http://boardgamegeek.com/boardgame/39463/cosmic-encounter">Cosmic Encounter</a>, perhaps the only "true" board game featured that night. Big thanks to everyone who helped out -- Game Night would have landed with a thud if not for you.

Will there be a WWDC Game Night 2013? Possibly. If you made it to WWDC 2012 you know how incredibly difficult tickets are becoming to get. There's no guarantee I'll make it back next year. But if I do, I'll be bringing one game or another.

<img src="http://theiconmaster.com/blog/wp-content/uploads/2012/06/dominion-300x300.jpg" alt="" title="dominion" width="300" height="300" class="aligncenter size-medium wp-image-331" /><p class="caption">Dominion in progress. Katrina, on the right, was the winner by a mile.</p>

<img src="http://theiconmaster.com/blog/wp-content/uploads/2012/06/munchkin-300x300.jpg" alt="" title="munchkin" width="300" height="300" class="aligncenter size-medium wp-image-336" /><p class="caption">Munchkin was able to entertain a small crowd.</p>

<img src="http://theiconmaster.com/blog/wp-content/uploads/2012/06/cosmic-encounter-300x300.jpg" alt="" title="cosmic-encounter" width="300" height="300" class="size-medium wp-image-337" /><p class="caption">Cosmic Encounter is a good game for making friends... and enemies.</p>]]></description>
										<content:encoded><![CDATA[<p>I love board games. Specifically, I love <a href="http://en.wikipedia.org/wiki/German-style_board_game">Euro games</a>. When I realized I&#8217;d be attending my first <a href="https://developer.apple.com/wwdc/">WWDC</a>, I decided there was a peanut-butter-and-chocolate intersection of interests that (as far as I know) had not been previously explored.</p>
<p>I floated the idea on Twitter and gauged the interest level. There seemed to be some, so I packed my copy of <a href="http://boardgamegeek.com/boardgame/36218/dominion">Dominion</a> &#8212; counting on other gamers to flesh out the supply.</p>
<p>We were going to need the help, because once a time and place were set (June 13th, 8:30 in <a href="http://twitter.com/bilm">Bil Moorhead&#8217;s</a> luxurious hotel suite), word spread. At its height, Game Night saw over 25 attendees &#8212; not a massive party by WWDC standards, but certainly bigger than any social event I&#8217;ve organized. Dominion supports only four players. This could have been bad.</p>
<p>Fortunately, a number of guests showed up with games in tow. <a href="http://twitter.com/ashponders">Ash Ponders</a> brought Backgammon and <a href="http://twitter.com/katlillie">Katrina Montgomery</a> (who stomped over everyone in Dominion). <a href="http://twitter.com/MrRooni">Michael Fey</a> showed up with <a href="http://boardgamegeek.com/boardgame/1927/munchkin">Munchkin</a>, which kept the bulk of the guests entertained. And <a href="http://twitter.com/synstelien">Don Synstelien</a> provided <a href="http://boardgamegeek.com/boardgame/39463/cosmic-encounter">Cosmic Encounter</a>, perhaps the only &#8220;true&#8221; board game featured that night. Big thanks to everyone who helped out &#8212; Game Night would have landed with a thud if not for you.</p>
<p>Will there be a WWDC Game Night 2013? Possibly. If you made it to WWDC 2012 you know how incredibly difficult tickets are becoming to get. There&#8217;s no guarantee I&#8217;ll make it back next year. But if I do, I&#8217;ll be bringing one game or another.</p>
<p><img fetchpriority="high" decoding="async" src="http://theiconmaster.com/blog/wp-content/uploads/2012/06/dominion-300x300.jpg" alt="" title="dominion" width="300" height="300" class="aligncenter size-medium wp-image-331" srcset="https://theiconmaster.com/blog/wp-content/uploads/2012/06/dominion-300x300.jpg 300w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/dominion-150x150.jpg 150w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/dominion-1024x1024.jpg 1024w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/dominion.jpg 1280w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="caption">Dominion in progress. Katrina, on the right, was the winner by a mile.</p>
<p><img decoding="async" src="http://theiconmaster.com/blog/wp-content/uploads/2012/06/munchkin-300x300.jpg" alt="" title="munchkin" width="300" height="300" class="aligncenter size-medium wp-image-336" srcset="https://theiconmaster.com/blog/wp-content/uploads/2012/06/munchkin-300x300.jpg 300w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/munchkin-150x150.jpg 150w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/munchkin-1024x1024.jpg 1024w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/munchkin.jpg 1280w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="caption">Munchkin was able to entertain a small crowd.</p>
<p><img decoding="async" src="http://theiconmaster.com/blog/wp-content/uploads/2012/06/cosmic-encounter-300x300.jpg" alt="" title="cosmic-encounter" width="300" height="300" class="size-medium wp-image-337" srcset="https://theiconmaster.com/blog/wp-content/uploads/2012/06/cosmic-encounter-300x300.jpg 300w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/cosmic-encounter-150x150.jpg 150w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/cosmic-encounter-1024x1024.jpg 1024w, https://theiconmaster.com/blog/wp-content/uploads/2012/06/cosmic-encounter.jpg 1280w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="caption">Cosmic Encounter is a good game for making friends&#8230; and enemies.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Give img set a chance</title>
		<link>https://theiconmaster.com/2012/05/give-img-set-a-chance/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Thu, 17 May 2012 02:33:12 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[out of my league on this one]]></category>
		<category><![CDATA[web design]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=309</guid>

					<description><![CDATA[Oh the drama. 

Web standards wonks are hashing out a new standard for serving the appropriate version of an image given the resolution of a user's device. Unfortunately, that single standard has turned into <a href="http://www.alistapart.com/articles/responsive-images-and-web-standards-at-the-turning-point/">two competing proposals</a>, feelings are hurt, etc. 

If we're going to improve web images, these two assumptions seem sensible to me:

<ol>
<li><strong>One should modify the &#60;img&#62; tag as little as possible.</strong> Web designers know how the &#60;img&#62; tag works. It's not the most elegant thing imaginable, but it's familiar. We should work with what we've got. </li>


<li><strong>The new syntax should be as compact as possible.</strong> &#60;img&#62; tags get used a lot. Anything that gets added to &#60;img&#62; could potentially need to be added to a page dozens of times. We should save ourselves some keystrokes.</li>
 
</ol>

Let's look at the contenders. First, the offering from the Responsive Images Community Group, the &#60;picture&#62; element:

<div class="code">&#60;picture&#62;
   &#60;source src="image.png" /&#62; 
   &#60;source src="image@2x.png" media="min-width: 600px, min-device-pixel-ratio: 2" /&#62;
   &#60;img src="image.png" /&#62;
&#60;/picture&#62;</div>

To me, this looks like a pain. It requires the new tags be wrapped around every &#60;img&#62; element which needs to be made responsive (likely all of them). The &#60;source&#62; has to be spelled out for every alternate version. And while the "min-width" and "min-device-pixel-ratio" syntax matches that of a media query stylesheet, in a media query stylesheet these need only be typed once per media type. With the &#60;picture&#62; element proposal, those queries will need to be added to every image. 

Below is the version Apple suggested, "img set." And let's just acknowledge the elephant in the room: iOS retina devices are the entire reason this conversation is going on. Giving Apple's proposal a little extra weight may not be unreasonable. 

<div class="code">&#60;img src="image.png"
    set="image.png 600w 200h 1x,
         image@2x.png 600w 200h 2x" /&#62;</div>

Hey, this looks pretty compact by comparison. It only requires a new attribute on the familiar &#60;img&#62; tag. Think about that: <em>it's just one tag.</em> (I count four in the alternative, excepting the closing tag.) Using "w" and "h" for width and height is unusual in web development but easy enough to remember. To me, this looks like a winner. 

One of the arguments in favor of the &#60;picture&#62; element is that its syntax more closely matches that of the HTML5 &#60;video&#62; and &#60;audio&#62; elements. But this is a bad comparison. It's fairly rare for video or audio to be embedded in a page more than once; while a single page, again, could contain dozens of images.]]></description>
										<content:encoded><![CDATA[<p>Oh the drama. </p>
<p>Web standards wonks are hashing out a new standard for serving the appropriate version of an image given the resolution of a user&#8217;s device. Unfortunately, that single standard has turned into <a href="http://www.alistapart.com/articles/responsive-images-and-web-standards-at-the-turning-point/">two competing proposals</a>, feelings are hurt, etc. </p>
<p>If we&#8217;re going to improve web images, these two assumptions seem sensible to me:</p>
<ol>
<li><strong>One should modify the &lt;img&gt; tag as little as possible.</strong> Web designers know how the &lt;img&gt; tag works. It&#8217;s not the most elegant thing imaginable, but it&#8217;s familiar. We should work with what we&#8217;ve got. </li>
<li><strong>The new syntax should be as compact as possible.</strong> &lt;img&gt; tags get used a lot. Anything that gets added to &lt;img&gt; could potentially need to be added to a page dozens of times. We should save ourselves some keystrokes.</li>
</ol>
<p>Let&#8217;s look at the contenders. First, the offering from the Responsive Images Community Group, the &lt;picture&gt; element:</p>
<div class="code">&lt;picture&gt;<br />
   &lt;source src=&#8221;image.png&#8221; /&gt;<br />
   &lt;source src=&#8221;image@2x.png&#8221; media=&#8221;min-width: 600px, min-device-pixel-ratio: 2&#8243; /&gt;<br />
   &lt;img src=&#8221;image.png&#8221; /&gt;<br />
&lt;/picture&gt;</div>
<p>To me, this looks like a pain. It requires the new tags be wrapped around every &lt;img&gt; element which needs to be made responsive (likely all of them). The &lt;source&gt; has to be spelled out for every alternate version. And while the &#8220;min-width&#8221; and &#8220;min-device-pixel-ratio&#8221; syntax matches that of a media query stylesheet, in a media query stylesheet these need only be typed once per media type. With the &lt;picture&gt; element proposal, those queries will need to be added to every image. </p>
<p>Below is the version Apple suggested, &#8220;img set.&#8221; And let&#8217;s just acknowledge the elephant in the room: iOS retina devices are the entire reason this conversation is going on. Giving Apple&#8217;s proposal a little extra weight may not be unreasonable. </p>
<div class="code">&lt;img src=&#8221;image.png&#8221;<br />
    set=&#8221;image.png 600w 200h 1x,<br />
         image@2x.png 600w 200h 2x&#8221; /&gt;</div>
<p>Hey, this looks pretty compact by comparison. It only requires a new attribute on the familiar &lt;img&gt; tag. Think about that: <em>it&#8217;s just one tag.</em> (I count four in the alternative, excepting the closing tag.) Using &#8220;w&#8221; and &#8220;h&#8221; for width and height is unusual in web development but easy enough to remember. To me, this looks like a winner. </p>
<p>(Update: it&#8217;s worth noting that both specifications are still in flux and at least in the case of &#8220;img set,&#8221; some of the components may be optional. Imagine the following: </p>
<div class="code">&lt;img src=&#8221;image.png&#8221;<br />
    set=&#8221;image.png 1x,<br />
         image@2x.png 2x&#8221; /&gt;</div>
<p>Now <em>that&#8217;s</em> nice.)</p>
<p>One of the arguments in favor of the &lt;picture&gt; element is that its syntax more closely matches that of the HTML5 &lt;video&gt; and &lt;audio&gt; elements. But this is a bad comparison. It&#8217;s fairly rare for video or audio to be embedded in a page more than once; while a single page, again, could contain dozens of images.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Nintendilemma</title>
		<link>https://theiconmaster.com/2012/04/the-nintendilemma/</link>
		
		<dc:creator><![CDATA[iconmaster]]></dc:creator>
		<pubDate>Fri, 27 Apr 2012 01:38:53 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[gaming]]></category>
		<guid isPermaLink="false">http://theiconmaster.com/?p=258</guid>

					<description><![CDATA[As you may have heard, Nintendo <a href="http://www.nytimes.com/2012/04/27/technology/nintendo-hurt-by-new-rivals.html?_r=1&#038;partner=yahoofinance">just announced</a> their first-ever annual loss. As the quote from analyst David Gibson reads, "They have been beaten by smartphones and tablets, in particular, for consumers’ spending and, more importantly, time." 

Whether or not Nintendo CEO Satoru Iwata ever referred to Apple as "<a href="http://www.huffingtonpost.com/2010/05/07/satoru-iwata-nintendo-ceo_n_568045.html">the enemy of the future</a>," the sentiment is sound -- casual gaming, so recently the key to Nintendo's "blue ocean" strategy, is increasingly an iOS affair. And having all but abandoned the "hardcore" gaming market this past generation, Nintendo is left with very little room to maneuver. 

As I see it, Nintendo has three options; and none of them easy. The first and, I believe, worst solution is to abandon hardware and transition to becoming a software-only company. It's true that gaming properties like Mario, Zelda, Donkey Kong, Metroid and Pokémon are probably Nintendo's best assets and could sustain a substantial game company. But without the hardware platforms along for the ride, I doubt software alone could fuel the Nintendo we know today. That way lies diminishment, and should be regarded as a last resort. Sega serves as a strong warning against this approach.[1. We need to forget about Nintendo games on iOS, and not just because Nintendo would regard it as a humiliating failure. Mario without buttons is just Canabalt in the Mushroom Kingdom. The franchises we love would be neutered in the conversion.]


The second, slightly better plan is to confront the Xbox head-on. In fact, Nintendo has hinted it may be looking to do so with the beefed-up graphics capabilities of the Wii U. But graphics are a technology problem which is relatively straightforward to solve. Nintendo's real handicaps against Microsoft are cultural: Nintendo does not value <em>developer relations</em> or <em>online connectivity</em> and Microsoft does. Core gamers want expansive third-party libraries and dead-simple online multiplayer; and Nintendo has a long track record of failing badly at providing either with its platforms.  

The third option open to Nintendo is the most interesting and the riskiest: go after Apple on its own turf. Create a true, standalone tablet device that takes advantage of Nintendo's strengths. Such a device -- call it the "Nintendo iDS" for fun -- would certainly require a world-class browser and support for the usual mobile standbys (like text messaging). But unlike the iPad, the iDS would feature integrated buttons and analog circle pads to make even the most "core" of gaming experiences possible. 

It may sound crazy, but it's not so far from what Amazon is attempting with the Kindle Fire. And Nintendo has a few tricks up its sleeve. As with the 3DS, it could design the iDS with a 3D screen and slider. (I'm not big on 3D in general, but if it makes sense anywhere it's on a gaming platform.) Games could be temporarily shared with non-owners for multiplayer matches, as Nintendo already allows on its handhelds. But more than anything else, the iDS' big feature would be one-tap access to both classic and brand-new titles in the Mario, Zelda and other franchises. 

Do I think Nintendo will actually try to produce such a device? No. Nor do I expect them to get over their cultural handicaps or transform into a software-only developer. Nintendo will stick to its console hardware guns as long as it can; and it has the cash to be stubborn for quite some time. But the gaming industry is changing dramatically. Sooner or later, Nintendo will have to change too.]]></description>
										<content:encoded><![CDATA[<p>As you may have heard, Nintendo <a href="http://www.nytimes.com/2012/04/27/technology/nintendo-hurt-by-new-rivals.html?_r=1&#038;partner=yahoofinance">just announced</a> their first-ever annual loss. As the quote from analyst David Gibson reads, &#8220;They have been beaten by smartphones and tablets, in particular, for consumers’ spending and, more importantly, time.&#8221; </p>
<p>Whether or not Nintendo CEO Satoru Iwata ever referred to Apple as &#8220;<a href="http://www.huffingtonpost.com/2010/05/07/satoru-iwata-nintendo-ceo_n_568045.html">the enemy of the future</a>,&#8221; the sentiment is sound &#8212; casual gaming, so recently the key to Nintendo&#8217;s &#8220;blue ocean&#8221; strategy, is increasingly an iOS affair. And having all but abandoned the &#8220;hardcore&#8221; gaming market this past generation, Nintendo is left with very little room to maneuver. </p>
<p>As I see it, Nintendo has three options; and none of them easy. The first and, I believe, worst solution is to abandon hardware and transition to becoming a software-only company. It&#8217;s true that gaming properties like Mario, Zelda, Donkey Kong, Metroid and Pokémon are probably Nintendo&#8217;s best assets and could sustain a substantial game company. But without the hardware platforms along for the ride, I doubt software alone could fuel the Nintendo we know today. That way lies diminishment, and should be regarded as a last resort. Sega serves as a strong warning against this approach.<sup class='footnote'><a href='#fn-258-1' id='fnref-258-1' onclick='return fdfootnote_show(258)'>1</a></sup></p>
<p>The second, slightly better plan is to confront the Xbox head-on. In fact, Nintendo has hinted it may be looking to do so with the beefed-up graphics capabilities of the Wii U. But graphics are a technology problem which is relatively straightforward to solve. Nintendo&#8217;s real handicaps against Microsoft are cultural: Nintendo does not value <em>developer relations</em> or <em>online connectivity</em> and Microsoft does. Core gamers want expansive third-party libraries and dead-simple online multiplayer; and Nintendo has a long track record of failing badly at providing either with its platforms.  </p>
<p>The third option open to Nintendo is the most interesting and the riskiest: go after Apple on its own turf. Create a true, standalone tablet device that takes advantage of Nintendo&#8217;s strengths. Such a device &#8212; call it the &#8220;Nintendo iDS&#8221; for fun &#8212; would certainly require a world-class browser and support for the usual mobile standbys (like text messaging). But unlike the iPad, the iDS would feature integrated buttons and analog circle pads to make even the most &#8220;core&#8221; of gaming experiences possible. </p>
<p>It may sound crazy, but it&#8217;s not so far from what Amazon is attempting with the Kindle Fire. And Nintendo has a few tricks up its sleeve. As with the 3DS, it could design the iDS with a 3D screen and slider. (I&#8217;m not big on 3D in general, but if it makes sense anywhere it&#8217;s on a gaming platform.) Games could be temporarily shared with non-owners for multiplayer matches, as Nintendo already allows on its handhelds. But more than anything else, the iDS&#8217; big feature would be one-tap access to both classic and brand-new titles in the Mario, Zelda and other franchises. </p>
<p>Do I think Nintendo will actually try to produce such a device? No. Nor do I expect them to get over their cultural handicaps or transform into a software-only developer. Nintendo will stick to its console hardware guns as long as it can; and it has the cash to be stubborn for quite some time. But the gaming industry is changing dramatically. Sooner or later, Nintendo will have to change too.</p>
<div class='footnotes' id='footnotes-258'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-258-1'> We need to forget about Nintendo games on iOS, and not just because Nintendo would regard it as a humiliating failure. Mario without buttons is just Canabalt in the Mushroom Kingdom. The franchises we love would be neutered in the conversion. <span class='footnotereverse'><a href='#fnref-258-1'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
