<?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>Hip me to the Haps</title>
	<atom:link href="http://blog.jeffverkoeyen.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.jeffverkoeyen.com</link>
	<description>Jeff Verkoeyen&#039;s Personal Blog</description>
	<lastBuildDate>Thu, 13 Oct 2011 07:45:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Nimbus Chameleon</title>
		<link>http://blog.jeffverkoeyen.com/nimbus-chameleon</link>
		<comments>http://blog.jeffverkoeyen.com/nimbus-chameleon#comments</comments>
		<pubDate>Thu, 13 Oct 2011 07:29:49 +0000</pubDate>
		<dc:creator>Jeff Verkoeyen</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Nimbus]]></category>

		<guid isPermaLink="false">http://blog.jeffverkoeyen.com/?p=178</guid>
		<description><![CDATA[Stop compiling. Start building. Chameleon for Nimbus Chameleon brings real-time CSS styling to your iOS applications. Good bye long compile times. Good bye re-installs and good bye re-navigating to the changed view controller. Say hello to seeing your changes reflected in real time. I&#8217;ll let the demo video do the talking. The Tech Chameleon was fun to build. In summary: it works by detecting changes to CSS files in your project, notifying the app of the changes, and then sending &#8230; <a href="http://blog.jeffverkoeyen.com/nimbus-chameleon">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1><strong>Stop compiling. Start building.</strong></h1>

<h1>Chameleon for Nimbus</h1>

<p>Chameleon brings real-time CSS styling to your iOS applications. Good bye long compile times. Good bye re-installs and good bye re-navigating to the changed view controller. Say hello to seeing your changes reflected in real time.</p>

<p>I&#8217;ll let the demo video do the talking.</p>

<iframe width="780" height="585" src="http://www.youtube.com/embed/i_5LbQ8e9BU" frameborder="0" allowfullscreen></iframe>

<h1>The Tech</h1>

<p>Chameleon was fun to build. In summary: it works by detecting changes to CSS files in your project, notifying the app of the changes, and then sending the changed CSS files for the app to then re-apply to any related user interface components.</p>

<p>Chameleon itself is a node.js server that runs on your machine. The node.js server watches changes on a folder that you specify when you start up the server. For example:</p>

<pre><code>&gt; node chameleon.js --watch ../../../examples/css/CSSDemo/resources/css/
</code></pre>

<p>Once Chameleon starts, you make a request to the server&#8217;s <code>/watch</code> endpoint. This request will only complete once Chameleon notices a change on the filesystem. An example result might be something like:</p>

<pre><code>root/root.css
</code></pre>

<p>It is then the request initiator&#8217;s responsibility to request the new files from the server via <code>/root/root.css</code>. This will immediately fetch the most recent CSS file from the <code>../../../examples/css/CSSDemo/resources/css/</code> directory. In this case it would download the contents of <code>../../../examples/css/CSSDemo/resources/css/root/root.css</code>.</p>

<h3>How Nimbus uses Chameleon</h3>

<p>In the demo app from the video, the watch request is initiated by a class called NIChameleonObserver, part of the new Nimbus CSS feature. In the demo we initialize an observer and then tell it to watch skin changes from the Chameleon server.</p>

<pre><code>_chameleonObserver = [[NIChameleonObserver alloc] initWithRootFolder:@"css"];
[_chameleonObserver watchSkinChanges];
</code></pre>

<p>The observer will then post global notifications for specific stylesheets when they change. In the case of the sample app discussed in the video we had a root view controller and a corresponding root stylesheet, so the listener looks like this:</p>

<pre><code>// Fetch the global chameleon observer.
NIChameleonObserver* chameleonObserver =
  [(AppDelegate *)[UIApplication sharedApplication].delegate chameleonObserver];

// Fetch the Nimbus stylesheet object for the given file.
NIStylesheet* stylesheet = [chameleonObserver stylesheetForFilename:@"root/root.css"];

// Start watching changes for the stylesheet.
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(chameleonSkinDidChange)
                                             name:NIChameleonSkinDidChangeNotification
                                           object:stylesheet];
</code></pre>

<p>We then simply implement the <code>chameleonSkinDidChange</code> method and respond accordingly.</p>

<pre><code>- (void)chameleonSkinDidChange {
  [_dom refresh];
}
</code></pre>

<p>_dom here is also part of the new Nimbus CSS feature. It is the beginning of what will soon be a fully-featured DOM object for applying styles to views and laying out views using the standard box model.</p>

<h1>Rationale behind building this feature</h1>

<p>I built this to scratch my own itch. From my work at Facebook and now at Google I&#8217;ve been finding that a large amount of my time has been wasted waiting for builds to compile, even when I just need to make a change as simple as &#8220;make that text blue rather than black&#8221;. This frustration is surely echoed by anyone who has had the unfortunate task of doing a clean build of Three20. Thanks to the way the Nimbus framework is set up, anyone can use Chameleon in their own project simply by adding the Nimbus Core and CSS components <em>and nothing else!</em> It really brings home the mantra of <em>&#8220;stop compiling, start building&#8221;</em>.</p>

<p>The idea was originally tossed out on the <a href="https://github.com/jverkoey/nimbus/issues/22#issuecomment-1953987">Nimbus CSS task thread</a>. I&#8217;ll have to message Rog about the fact that I&#8217;ve just gone ahead and built this! That&#8217;s what I get for waking up early on the weekend and working on this before Canadian turkey day when I should have been running errands.</p>

<h1>Supported CSS properties as of Oct 13, 2011</h1>

<p>The Nimbus CSS feature only supports a small number of properties so far but this number will only grow with time. For version 1 of the CSS feature (likely going out in Nimbus 0.9) the CSS feature will not support properties such as padding and margins.</p>

<pre><code>UIView {
  border: &lt;dimension&gt; &lt;ignored&gt; &lt;color&gt; {view.layer.borderWidth view.layer.borderColor}
  border-color: &lt;color&gt;       {view.layer.borderColor}
  border-width: &lt;dimension&gt;   {view.layer.borderWidth}
  background-color: &lt;color&gt;   {view.backgroundColor}
  border-radius: &lt;dimension&gt;  {view.layer.cornerRadius}
  opacity: &lt;number&gt;             {view.alpha}
}

UINavigationBar {
  -ios-tint-color: &lt;color&gt;     {navBar.tintColor}
}

UILabel {
  color: &lt;color&gt;                  {label.textColor}

  font: &lt;font-size&gt; &lt;font-name&gt;   {label.font}
  font-size: &lt;font-size&gt;          {label.font}
  font-name: &lt;font-name&gt;          {label.font}

  /**
   * Can't be used in conjunction with font/font-name properties. Use the italic/bold font name
   * instead.
   */
  font-style: [italic|normal]     {label.font}
  font-weight: [bold|normal]      {label.font}

  text-align: [left|right|center] {label.textAlignment}

  text-shadow: &lt;color&gt; &lt;x-offset&gt; &lt;y-offset&gt; {label.shadowColor label.shadowOffset}

  -ios-line-break-mode: [wrap|character-wrap|clip|head-truncate|tail-truncate|middle-truncate] [label.lineBreakMode]
  -ios-number-of-lines: xx             {label.numberOfLines}
  -ios-minimum-font-size: &lt;font-size&gt;  {label.minimumFontSize}
  -ios-adjusts-font-size: [true|false] {label.adjustsFontSizeToFitWidth}
  -ios-baseline-adjustment: [align-baselines|align-centers|none] {label.baselineAdjustment}
}
</code></pre>

<h1>FAQ</h1>

<h2>Why not use Interface Builder/why use CSS at all?</h2>

<p>First off, not everyone uses Interface Builder. For those who do, there are a lot of similarities between using Chameleon and Interface Builder. Where Chameleon comes out on top, though, is in making it dead easy for anyone with a background in web design to style an iOS application. All it takes is understanding how CSS works and you&#8217;re good to go. CSS also comes with the advantage of cascading styles. You can define styles for an entire class of views and therefor reuse the styles throughout your application. Make a single change to a shared css file and suddenly your entire app&#8217;s style is updated.</p>

<p>Imagine this. As you are working on the app at your desk, the designer has an iPad propped up next to their laptop on the other end of the office. As you&#8217;re making modifications based on the new mocks the designer just sent you, <em>the changes are being reflected in real time on the designer&#8217;s iPad</em>. Talk about cool.</p>

<h2>When are you releasing this?</h2>

<p>Hopefully by the end of this week. I haven&#8217;t moved up to the city yet so I&#8217;m still relatively devoid of anything to do at night down here in south bay (damn is it boring here) so I predict that I&#8217;ll have tomorrow night to focus on documenting and releasing Nimbus 0.9 complete with Chameleon and CSS.</p>

<p>If I don&#8217;t get it out tomorrow night though then it might have to wait until next week because I&#8217;m planning to go to the Treasure Island music festival this weekend. I haven&#8217;t been to live music in way too long.</p>

<p>Either way, look forward to getting your hands on this code shortly! As always it will be Apache 2.0 licensed. If you have any questions about Chameleon or Nimbus or why the hell I&#8217;d be in South Bay feel free to shoot me an email or @reply me on twitter: <a href="http://twitter.com/featherless">@featherless</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jeffverkoeyen.com/nimbus-chameleon/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Back to the Bay Area</title>
		<link>http://blog.jeffverkoeyen.com/back-to-the-bay-area</link>
		<comments>http://blog.jeffverkoeyen.com/back-to-the-bay-area#comments</comments>
		<pubDate>Mon, 26 Sep 2011 17:03:04 +0000</pubDate>
		<dc:creator>Jeff Verkoeyen</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Nimbus]]></category>

		<guid isPermaLink="false">http://blog.jeffverkoeyen.com/?p=148</guid>
		<description><![CDATA[The last few weeks have been a whirlwind. Between leaving Facebook and moving out to California I&#8217;ve barely had a chance to take a breath. Today is my second week of work though so I&#8217;m now taking some time to catch up. First order of business, I want to make it publicly known that I have taken a job working at Google on their mobile team. I will be doing backend work which will be a refreshing change from the &#8230; <a href="http://blog.jeffverkoeyen.com/back-to-the-bay-area">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The last few weeks have been a whirlwind. Between leaving Facebook and moving out to California I&#8217;ve barely had a chance to take a breath. Today is my second week of work though so I&#8217;m now taking some time to catch up.</p>

<p>First order of business, I want to make it publicly known that I have taken a job working at Google on their mobile team. I will be doing backend work which will be a refreshing change from the contract iOS development I&#8217;ve been doing for the past few years.</p>

<p>This does not mean that I have stopped all iOS development. If you haven&#8217;t already seen <a href="http://jverkoey.github.com/nimbus/">my Nimbus project</a> then I encourage you to take a glance at it when you have a moment. I am planning to continue work on Nimbus by dedicating a chunk of each morning to it and my various other iOS open source projects.</p>

<p>In other news, I&#8217;m excited to announce that Nimbus passed 500 followers over the weekend on Github! I&#8217;m really excited about this because this project is still in its infancy.</p>

<h3>On Leaving Facebook</h3>

<p>I learned a lot during my time at Facebook. Facebook is truly an exciting place to work at and I am sad to have left. I had the great privilege of working closely with some of the best designers in the industry and shadowing David Recordon as we looked into the possibility of me working on their open source team. I spent a significant amount of time thinking about what I wanted to do and decided in the end that I needed to switch things up and step away from Facebook.</p>

<p>I wish them the best of luck going forward. Timeline was an incredible launch and I look forward to following the company&#8217;s progress.</p>

<p>If you&#8217;re coming here from any of the press earlier today, I want to emphasize that my experience with Facebook over the past few years has been incredible and that I was simply recounting my experiences over the past few months related to my work at Facebook.</p>

<h2>Oct 10, 2011 Update</h2>

<p>And the iPad app is live! Congratulations to the talented team at Facebook that got this out the door. It&#8217;s great to see it in the wild!</p>

<p>Cheers,<br />
- Jeff</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jeffverkoeyen.com/back-to-the-bay-area/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Three20 is -insert expletive-</title>
		<link>http://blog.jeffverkoeyen.com/three20-is-insert-expletive</link>
		<comments>http://blog.jeffverkoeyen.com/three20-is-insert-expletive#comments</comments>
		<pubDate>Wed, 20 Oct 2010 18:26:35 +0000</pubDate>
		<dc:creator>Jeff Verkoeyen</dc:creator>
				<category><![CDATA[Three20]]></category>

		<guid isPermaLink="false">http://blog.jeffverkoeyen.com/?p=118</guid>
		<description><![CDATA[From my monitoring of Twitter so far today, it seems some people are angered by the fact that Three20 is composed of many libraries. Here are some of the arguments posited against Three20 lately and my corresponding rationales behind why the modular design will begin to solve them. Give me what I need, no more, no less. Three20 is a massive library. Due to the way it was originally created, many of the components of Three20 have interdependencies that, today, &#8230; <a href="http://blog.jeffverkoeyen.com/three20-is-insert-expletive">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>From my monitoring of Twitter so far today, it seems some people are angered by the fact that Three20 is composed of many libraries.</p>

<p>Here are some of the arguments posited against Three20 lately and my corresponding rationales behind why the modular design will begin to solve them.
<span id="more-118"></span></p>

<h1>Give me what I need, no more, no less.</h1>

<p>Three20 is a massive library. Due to the way it was originally created, many of the components of Three20 have interdependencies that, today, make it impossible to pull out single components and use them in your app. For example, if you want to use a TTPhotoViewController, you currently need to import every single line of Three20 code to do so.</p>

<p>There&#8217;s no reason that this should be the case. If I&#8217;ve already built an application and all I want to do is add a launcher, there is absolutely no reason why I should have to include the entire Three20 library to do so; I just want to add a Three20Launcher module, that&#8217;s it.</p>

<p>Even if I&#8217;m starting from scratch, it would be much easier to grasp Three20 if I could start from some basic components and add more modules as I need them, rather than having to wade through the entire library to begin with.</p>

<p>A modular design puts the choice into the developer&#8217;s hands about what they want to use in their project.</p>

<h1>Three20&#8242;s documentation sucks</h1>

<p>Pulling apart the library into separate modules is going to make it much easier to document the library. The primary obstacle to documenting Three20 right now is that it&#8217;s just so goddamn confusing. If the lines in the sand are drawn more clearly between components, it will be much easier first off to comprehend their usefulness, and second off to convey their usefulness.</p>

<h1>Three20&#8242;s xx feature is outdated by Apple&#8217;s yy library</h1>

<p>Another argument posited on Twitter today and in the past is that Three20 is outdated, that many of its components have been deprecated by technologies that Apple has included in newer APIs.</p>

<p>This is true. TTStyle, for example, provides functionality that overlaps with CoreText.</p>

<p>But this just furthers the argument for pulling Three20 apart into separate modules. Why should anyone be forced to use TTStyle if they want to use aspects of Three20 but use CoreText for their text rendering? With the new modular design, you&#8217;ll have that choice.</p>

<h1>An ecosystem of extensions</h1>

<p>My long-term vision of Three20 is to see it become a vibrant ecosystem of extensions provided by the community. The only way this could be possible is if we allow projects to be distinct from one another.</p>

<h1>tl;dr Summary</h1>

<p>Three20 has its share of issues. But I firmly believe that it&#8217;s only advantageous to discuss how broken something is with an equal or greater amount of discussion on how to fix it. Some developers are quick to point out the broken components of Three20, but these components are fixable.</p>

<p>And that&#8217;s what I plan to do.</p>

<p>Cheers,<br />
- Jeff</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jeffverkoeyen.com/three20-is-insert-expletive/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack Faster with Secret Features</title>
		<link>http://blog.jeffverkoeyen.com/hac-faster-with-secret-features</link>
		<comments>http://blog.jeffverkoeyen.com/hac-faster-with-secret-features#comments</comments>
		<pubDate>Tue, 16 Mar 2010 04:58:51 +0000</pubDate>
		<dc:creator>Jeff Verkoeyen</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[textmate gmail hotkeys]]></category>

		<guid isPermaLink="false">http://blog.jeffverkoeyen.com/?p=99</guid>
		<description><![CDATA[I love it when I stumble upon a new feature in a piece of software that makes my life easier. I hope you do too. That&#8217;s why I&#8217;m going to take a bit to go over some of the useful things I&#8217;ve been finding lately. Gmail hotkeys on crack If you use Gmail labels (and you really should), then you&#8217;re going to love Gmail hotkeys. I&#8217;m not talking the basic stuff, like &#8216;c&#8217; to compose a new message, or &#8216;r&#8217; &#8230; <a href="http://blog.jeffverkoeyen.com/hac-faster-with-secret-features">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I love it when I stumble upon a new feature in a piece of software that makes my life easier. I hope you do too.</p>

<p>That&#8217;s why I&#8217;m going to take a bit to go over some of the useful things I&#8217;ve been finding lately.</p>

<p><span id="more-99"></span></p>

<h1>Gmail hotkeys on crack</h1>

<p>If you use Gmail labels (and you really should), then you&#8217;re going to love Gmail hotkeys. I&#8217;m not talking the basic stuff, like &#8216;c&#8217; to compose a new message, or &#8216;r&#8217; to reply to one. I&#8217;m talking full-blown keyboard control of your inbox.</p>

<p><a href="http://blog.jeffverkoeyen.com/wp-content/uploads/2010/03/Screen-shot-2010-03-16-at-12.38.10-AM.png"><img src="http://blog.jeffverkoeyen.com/wp-content/uploads/2010/03/Screen-shot-2010-03-16-at-12.38.10-AM-300x175.png" alt="" title="Gmail hotkeys" width="300" height="175" class="aligncenter size-medium wp-image-101" /></a></p>

<p>You can use the &#8216;J&#8217; and &#8216;K&#8217; keys to move down and up in the inbox, respectively. This will move that little arrow guy on the left edge of your inbox list. I&#8217;m going to call him the &#8216;caret&#8217;.</p>

<p>You can press &#8216;X&#8217; to select or deselect the caret&#8217;s current conversation. Once you&#8217;ve selected some conversations, you can press &#8216;L&#8217; to add a label. Simply type the name of the label you want to add and hit enter, and your selected emails will be updated. Now that you&#8217;ve labeled your emails, you can hit the &#8216;E&#8217; key to archive them.</p>

<h1>DTerm &#8211; Terminals everywhere</h1>

<p>The terminal is one of a hacker&#8217;s most important tools. Now you can access it everywhere with DTerm, a nifty little utility that allows you to open a terminal at the current program&#8217;s working directory. Don&#8217;t miss out on that crucially cool little feature of it; it runs from the <em>working directory</em>.</p>

<p>If you use TextMate, for example, and you have a file open, compressing that file&#8217;s directory is as trivial as pressing Command+Shift+Enter and typing your favorite compression incantation. Or maybe you quickly want to check out a man page, hit the global hotkey again and man up.</p>

<p>Highly recommended: <a href="http://www.decimus.net/dterm.php">Download DTerm for free</a></p>

<h1>Block Selection in TextMate</h1>

<p>You might have already known that you can block select text in TextMate by holding the Option key and selecting with your mouse. But this short little video could save you a lot of time in the future.</p>

<p><a href="http://www.youtube.com/watch?v=gI2hzXLbLs4">The YouTubez</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jeffverkoeyen.com/hac-faster-with-secret-features/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Strips Postmortem</title>
		<link>http://blog.jeffverkoeyen.com/strips-postmortem</link>
		<comments>http://blog.jeffverkoeyen.com/strips-postmortem#comments</comments>
		<pubDate>Sun, 10 Jan 2010 05:10:36 +0000</pubDate>
		<dc:creator>Jeff Verkoeyen</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://blog.jeffverkoeyen.com/?p=18</guid>
		<description><![CDATA[During the summer of 2009 I made a big decision. It was early in the academic term and I had just received my first midterm mark. It was 30%. Never in the history of my academic career had I received a midterm mark below 50%, but this 30% wasn&#8217;t a shock to me. I had been spending nearly all of my time outside of the classroom working on what would soon be one of my largest projects to date, the &#8230; <a href="http://blog.jeffverkoeyen.com/strips-postmortem">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>During the summer of 2009 I made a big decision. It was early in the academic term and I had just received my first midterm mark.</p>

<p>It was 30%.</p>

<p>Never in the history of my academic career had I received a midterm mark below 50%, but this 30% wasn&#8217;t a shock to me. I had been spending nearly all of my time outside of the classroom working on what would soon be one of my largest projects to date, the Strips platform.</p>

<p>When I saw the failed mark on my midterm I took some time to think, as anyone should do when this sort of thing happens. I came to the conclusion that I had reached a point in my academic career where I strongly believed that I had the chops to build something, and that I needed to do it <em>right then.</em></p>

<p><em></em>So I took the plunge. I dropped three of my four courses and spent the next three months working full time on the Strips platform.</p>

<p>This is its post-mortem, and I hope to leave this as a note to myself and anyone else who has the desire to build something.</p>

<p><span id="more-18"></span></p>

<h2>The Strips Platform</h2>

<p>The basic one-liner for Strips is this: a mobile application that puts syndicated web comic content into the palm of your hand. In more detail, it&#8217;s an iPhone app with all the flair of a native Apple app, and all the content of your favorite web comics. It had pinch-to-zoom, double-tap-to-zoom, offline reading, push notifications (for when new strips were available), archive viewing and searching, social network sharing, the ability to email strips to friends, alt-text viewing, and landscape reading modes. You name the feature, Strips probably had it. It even let you shake the phone to pick a random strip.</p>

<p>But that&#8217;s just the part the customer saw. In the backend I had built an entire architecture for aggregating content from RSS feeds, pushing the data to an Amazon S3 tier, and even used Google&#8217;s App Engine for housing all of the push notification information. This meant that the entire web comic&#8217;s content was mirrored on a scalable storage solution (S3), inflicting zero cost to the publisher except the initial cost of archiving (which is equivalent to the cost Google&#8217;s spiders incurs). So as far as the web comic artists were concerned, Strips caused zero-impact to their existing infrastructure.</p>

<p>The biggest question about Strips was mostly about how the artists were compensated. Obviously it would be stupid of me to rip these artists&#8217; content out of their ad-driven websites and display it on the mobile device ad-free. For many web comics, the ad revenue is their butter. Merch sales are often the bread, and their readers love buttered toast (who doesn&#8217;t?). And for many web comics the analogy is reversed. Regardless of where they make most of their revenue, it was crucial to recognize the fact that ads were part of this ecosystem.</p>

<p>To address this problem, I built ads into Strips that were served on a per-publisher basis. This meant that whenever you were reading strips from Penny Arcade, the revenue from the ads that were displayed would be given on an 80/20 split to Penny Arcade. The 20% cut was calculated to cover my personal costs of bandwidth and servers (and is a damn good deal by most publishing house standards). I also built in detailed analytics so that web comic artists would be completely aware of how many users were viewing their content on Strips, for how long, and even how often their content was shared. This data was all anonymized, of course.</p>

<p>Here&#8217;s the basic Strips platform so far.</p>

<ul> <li>An iPhone application, Strips</li> <li>Automated S3 data duplication for all of the publisher&#8217;s content</li> <li>Ad-revenue model for artists</li> <li>Analytics for artists</li> <li>A push notification service (within minutes of new content being posted, your phone would buzz)</li> </ul>

<p>From the beginning of Strips&#8217; development, I knew that this product would only reach its maximum potential with support from the artists themselves. I began a campaign of sending emails to artists that started with a number of the bigger players. I sent a general email with a customized &#8220;pitch page&#8221; showing their content in the iPhone interface.</p>

<p>Feedback was abysmal. Of the 15 or so comics that I initially emailed, only three responded, two saying they didn&#8217;t want to be a part of it. The other was incredibly interested. And so even with the abysmal number of responses, I had my first client.</p>

<p>My excitement started to brew.</p>

<p>By mid-July, I had my first working version of the application ready for beta testing. The initial reviews from users were quite positive. People loved the intuitive interface and the ability to read their comics in a consistent, convenient format. They didn&#8217;t have to trough through multiple websites with varying navigation methods just to read their favorite comics anymore.</p>

<p>By this time I had sent out emails to a dozen more web comic artists and still, no word. So I continued to work on the project, hoping that I would soon receive word one way or the other from anyone.</p>

<p>August came and went, and I was on my way to my last co-op term for school. Strips was a completed product and submitted to the App Store for review. The first submission came back rejected, as I expected, and I fixed the minor issues and resubmitted. This process eventually involved four submissions and three rejections, with the final acceptance of my app into the App Store nearly a month and a half later.</p>

<p>All throughout this time I was actively emailing the artists. I sent a second round of emails to the artists who still hadn&#8217;t responded to my first round, letting them know about the new analytics system and the ad model. Still no answer.</p>

<p>At this stage I had a fully working platform ready to be launched on the App Store. The entire platform was built and designed to be as low-impact to artists as possible, costing them near-zero in bandwidth, while bringing a whole new set of readers to their content. So I decided that since the entire platform was a win for the artists in every possible way, I launched it. What could possibly upset them, right?</p>

<p>So Strips launched as a paid app at $1.99. It launched as a paid application because my rationale was that it was a reader, just like the Kindle or the Nook is, or any RSS reader for that matter. You pay for the device to read the syndicated content and then you can pay to read specific items available on the device. This seemed sensible to me as I&#8217;d put a large amount of effort into the application.</p>

<p>The app was live for a little over a month and a half, and sales were trickling in. By October I had sold about 200 copies of the app at $0.99 and 50 copies at $1.99. The user metrics were what really impressed me, though. From the aggregated analytics, I found that most users were spending <em>on average</em> about 45 minutes to an hour <em>every day</em> using Strips. I was excited to let the web comic artists know about this amazing statistic.</p>

<p>In late October, on the 26th to be precise, Scott Kurtz of PvP finally noticed Strips. Sadly he noticed it in the one light I never imagined it would be seen in: as theft.</p>

<p>That Monday I began the day like I began most days at the time, on my way to work I opened Tweetdeck and checked out all of my twitter filters for any talk about Strips or any related subjects (web comics, webcomics, iphone web comics, etc&#8230;). I was receiving dozens of tweets per minute to my @stripsapp account, declaring that I was a thief and should be tossed in jail. Around that same time I received an email from Scott Kurtz himself, demanding that I remove his content from the app immediately, which I did. I then engaged in a draining campaign to contain the fires that were popping up all over twitter and the blogosphere.</p>

<p>I realized quite quickly that the public opinion of my app was lowering, and <em>fast</em>. With the heat of a number of popular web comic artists on my neck, I quickly began pulling the plug on the live apps. I had thankfully designed functionality into the platform from the get-go that let me add and remove comics on the fly, even for existing installations. Once the content from all of the artists had been removed, I removed the Strips app from the App Store and posted an apology to the Strips website. Over the next 24 hours I received countless emails and tweets from prominent web comic artists calling me a thief and a criminal, and some threatening legal action against my part.</p>

<p>I was scared shitless.</p>

<p>To have the entire community that I had spent the five previous months working to help turn on me hit me pretty hard. After the fires had calmed down and I&#8217;d stopped receiving hate letters I came to the conclusion of one thing. If you&#8217;ve been reading up this point, then you&#8217;ll be happy to know that this is the biggest, most important thing that I learned from this, and will never forget.</p>

<p><em>It&#8217;s really fucking hard to run a company as just one person</em>. Don&#8217;t let the obviousness of that statement make it seem trivial. Never, <em>ever</em>, underestimate the value of having someone else to double-check your decisions and to challenge your thoughts on a day-to-day basis.</p>

<p>So let&#8217;s get into the more structured part of the postmortem, shall we?</p>

<h2>What went right</h2>

<p>Though Strips ended in a fiery crash-and-burn, the personal experience I gained from this project was unmeasurable. If there is ever a point in my life where I think I will someday look back and say &#8220;that, that right there; that&#8217;s when I got my shit together&#8221;, October 26th 2009 was that day. I needed a solid kick to the head to make me stop thinking that I could one-man-show every project I worked on. I&#8217;d become complacent in my passion, and I needed to snap back to attention.</p>

<p>Strips was also a great technical landmark in my personal experience. I proved to myself that I could build a fully-functional platform from the ground up, that I could do it in record time, and that I had somewhat of an idea how to scale it.</p>

<p>The development track of Strips followed the track of most of my software projects: rapid iteration and fast prototyping. I was able to build the first working prototype within the first week of development and by the end of the first month had three web comics supported on the platform. Over the next month I increased that number to 20 and built a full push notification service that operated in near real time (a sneaky way of saying that I just polled the RSS feeds on a regular basis).</p>

<p>I also had a great pool of testers throughout the development of Strips. I set up a Google group and had an active mailing list with which I got a solid amount of feedback.</p>

<h2>What went wrong</h2>

<p>The single largest mistake I made was to launch too early, before I had received complete consent from all of the artists whose content I supported. The irony here is that as of January 9, 2010, Comic Envi is still available in the App Store as a paid app, and they blatantly pull the web comic&#8217;s content into their app with no ads or any mention of support from the original artists.</p>

<p>I also made the mistake of assuming that artists would see the value of Strips the same way I did. I worked hard to convey to the artists every way in which they&#8217;d receive revenue and analytics, but at the end of the day their first impression turned out to be far from what I&#8217;d imagined. This was largely my fault, and some part sensationalization on twitter. I shouldn&#8217;t have used the artists&#8217; logos on the web site as a way to say &#8220;hey look, these artists are supported by Strips&#8221;. A gradual roll out of Strips with only the supported artists along the way would have kept the project alive and hopefully generated enough momentum over time to convince the larger players that it was a viable platform.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jeffverkoeyen.com/strips-postmortem/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hip me to the Haps</title>
		<link>http://blog.jeffverkoeyen.com/hip-me-to-the-haps</link>
		<comments>http://blog.jeffverkoeyen.com/hip-me-to-the-haps#comments</comments>
		<pubDate>Thu, 10 Dec 2009 06:48:33 +0000</pubDate>
		<dc:creator>Jeff Verkoeyen</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://thejefffiles.com/blog.jeffverkoeyen.com/?p=3</guid>
		<description><![CDATA[I&#8217;m a victim of trends and it seems that some of my friends have been keeping rather good logs of their day-to-day activities. It&#8217;s about time I start contributing to this &#8220;internet&#8221; contraption all proper-like. I&#8217;ll quickly explain where the hell the name of this blog came from. I took part in a musical titled Leader of the Pack during my 12th year of education. Thanks to Google&#8217;s book scraping, I can actually point you to the exact line I &#8230; <a href="http://blog.jeffverkoeyen.com/hip-me-to-the-haps">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a victim of trends and it seems that <a title="Evan Stratford's Blog" href="http://blog.evanstratford.com" target="_blank">some</a> of my <a title="Anton Lopyrev's Blog" href="http://tokudu.com" target="_blank">friends</a> have been keeping rather good logs of their day-to-day activities. It&#8217;s about time I start contributing to this &#8220;internet&#8221; contraption all proper-like.</p>

<p>I&#8217;ll quickly explain where the hell the name of this blog came from. I took part in a musical titled Leader of the Pack during my 12th year of education. Thanks to Google&#8217;s book scraping, I can actually point you to <a href="http://books.google.com/books?id=FdFCodi_a4IC&amp;pg=PA20&amp;lpg=PA20&amp;dq=%22hip+me+to+the+haps%22&amp;source=bl&amp;ots=Z74ymJgFPY&amp;sig=M2GCZED5ExT6HaTJXrNxJDaepwY&amp;hl=en&amp;ei=iJUgS5nADYTkswPviuWfBQ&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=2&amp;ved=0CAsQ6AEwAQ#v=onepage&amp;q=%22hip%20me%20to%20the%20haps%22&amp;f=false">the exact line I elocuted</a> while crossing right, downstage of Jeff. I had one line and I got to wear cool shades. It was good times.</p>

<p>I think I may write my blog posts like my git commits. Mostly atomic, but oftentimes a ménage à trois of sorts. Sometimes I might cherry-pick posts from other blogs of mine, and sometimes I might, gods forbid, rewrite history. I&#8217;ll try to keep that last one down to a minimum.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jeffverkoeyen.com/hip-me-to-the-haps/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

