<?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>Danilo Campos.blog</title>
	<atom:link href="http://blog.danilocampos.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.danilocampos.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 17 Aug 2010 04:28:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Burstling</title>
		<link>http://blog.danilocampos.com/2010/08/16/burstling/</link>
		<comments>http://blog.danilocampos.com/2010/08/16/burstling/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 04:25:27 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Adventure]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=467</guid>
		<description><![CDATA[I just released my first desktop app. It&#8217;s a small and focused tool to help you kill your procrastination and get things done. Go check it out. Developing for the desktop has been fun and an interesting change of pace from iPhone development. A full post-mortem is on the way. In the mean time, it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I just released my first desktop app. It&#8217;s a small and focused tool to help you kill your procrastination and get things done. Go <a href="http://www.burstling.com">check it out</a>.</p>
<p>Developing for the desktop has been fun and an interesting change of pace from iPhone development. A full post-mortem is on the way.</p>
<p>In the mean time, it&#8217;s a great feeling to add a bit of OS X freeware to the world.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2010/08/16/burstling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Development for Beginners &#8211; 2010 Edition</title>
		<link>http://blog.danilocampos.com/2010/01/20/iphone-development-for-beginners-2010-edition/</link>
		<comments>http://blog.danilocampos.com/2010/01/20/iphone-development-for-beginners-2010-edition/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 04:47:33 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Adventure]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=454</guid>
		<description><![CDATA[So you want to learn iPhone development. Good for you! It&#8217;s an exciting platform with great developer tools and an outstanding community. Let me tell you a bit about the benefits of building an app the right way and show you some great resources to get started. The most important point: If you want a [...]]]></description>
			<content:encoded><![CDATA[<p>So you want to learn iPhone development. Good for you! It&#8217;s an exciting platform with great developer tools and an outstanding community. Let me tell you a bit about the benefits of building an app the right way and show you some great resources to get started.</p>
<p>The most important point: If you want a great application with a user experience you&#8217;ll be proud of, build a native application using Apple-blessed developer tools and resources. Apple&#8217;s developer tools are outstanding applications and the iPhone frameworks provide useful, battle-tested, mature code that lets you do a lot without reinventing the wheel every time you need to build even basic functionality. Best of all, Apple gives their tools away for free.</p>
<p><span id="more-454"></span></p>
<p>Don&#8217;t screw around with stuff like PhoneGap or Adobe&#8217;s Flash-to-iPhone binary whatsit just because it might be a little closer to your comfort zone. You&#8217;ll risk writing an application with a library that gets left in the dust when Apple releases a new version of the SDK with great new features. You&#8217;ll also risk having your application rejected if Apple decides one morning that the tools you used are accessing private methods, running interpreted code or disrespecting some other element of the SDK agreement. Finally, you&#8217;re not going to be working with the same design vocabulary expressed by every popular iPhone application.</p>
<p>With UIKit, Apple hands you an enormous pile of outstanding interface classes that are exceptionally clever, attractive and versatile. They&#8217;re yours to build with and do as you please. Thousands of hours of interface coding that you don&#8217;t have to do, saving you time and allowing you to write an app with an experience that&#8217;s consistent with everything your users will expect on the iPhone.</p>
<p>With Core Data, you get a powerful object modeling framework with built-in persistence. What does that get you? If you&#8217;re building an application, you&#8217;ve got data. Lots and lots of data, sometimes. You&#8217;re going to need a way to define and encapsulate that data so that you can keep track of relationships between different chunks, pass information around the application and store it for later use. This can be tedious, laborious, time-consuming work. Core Data does all of the heavy lifting for you.</p>
<p>For me, those are the biggest freebies you get with approaching iPhone development &#8220;the right way.&#8221; That barely scratches the surface, though, since Apple provides powerful APIs that let you accomplish drawing, manipulating the filesystem, performing network operations, dead-simple threading, and many other useful things.</p>
<p>Hopefully you&#8217;re intrigued. You&#8217;ll need to be, especially if you&#8217;re starting from scratch. There&#8217;s a big chunk of learning you&#8217;ll have to do. It&#8217;s worth it, though. The iPhone is a really fun platform and there&#8217;s something potent about developing for a mobile device that&#8217;s always in your pocket.</p>
<p>Find the section that describes you below and proceed from there for my advice on great learning resources.</p>
<h2>You&#8217;ve never coded anything, ever (or, C-based languages scare you)</h2>
<p>Let&#8217;s start with <a href="http://en.wikipedia.org/wiki/C_(programming_language)">C</a>. C is a venerable language with a long history, born in 1972. C is important background to have for iPhone development, since so many Apple APIs use either C or Objective-C, a related language we&#8217;ll talk about next.</p>
<p style="text-align: center;"><a href="http://www.apress.com/book/view/9781430218098"><img class="aligncenter" title="Learn C on the Mac" src="http://www.apress.com/resource/bookcover/9781430218098?size=medium" alt="" width="125" height="164" /></a></p>
<p>Luckily, Dave Mark has you covered. <em><a href="http://www.apress.com/book/view/9781430218098">Learn C on the Mac</a> </em>assumes no pre-existing experience with any programming language. You&#8217;ll get a friendly explanation of everything you need to understand C and the basics of programming. This is ground zero, indispensable knowledge for anyone who is approaching this with no experience. The best part is that Dave has written for someone who will be using Apple&#8217;s developer tools, so you&#8217;ll be getting a perspective that will be useful for your iPhone efforts a little bit later.</p>
<h2>You&#8217;re comfortable with programming and C, but not Objective-C</h2>
<p>Objective-C is built on top of C, so if you&#8217;ve got a basic comfort with programming in C, you&#8217;ll have an easy time getting up to speed. Objective-C lets you build object oriented code. Whuzzat? It&#8217;s Legos for programming. You can build your own bricks and trade them with friends. Put simply, <a href="http://en.wikipedia.org/wiki/Object-oriented_programming">object oriented programming</a> (OOP) lets you build modular software that maximizes code reuse. Reusing code is good! Chances are, if you solve a problem once in your project, you&#8217;ll need that solution again later. OOP lets you easily package up these solutions and deploy them anywhere they&#8217;re needed in your code.</p>
<p style="text-align: center;"><a href="http://www.apress.com/book/view/1430218150"><img class="alignnone" title="Learn Objective-C on the Mac" src="http://www.apress.com/resource/bookcover/9781430218159?size=medium" alt="" width="125" height="164" /></a></p>
<p>Confused? You won&#8217;t be after you read <em><a href="http://www.apress.com/book/view/1430218150">Learn Objective-C on the Mac</a></em>. You&#8217;ll learn all the details of how Objective-C works. The book is packed with clear explanations of how to use object-oriented programming and practical exercises to get you comfortable with building useful code in Objective-C. You will not enjoy learning iPhone development without a solid foundation in Objective-C. You&#8217;ll get one here. Many lightbulbs will turn on for you.</p>
<h2>You understand Objective-C but you&#8217;re not yet confident enough to build an app with it</h2>
<p>If you feel great about Objective-C and you can&#8217;t wait to get started, go on to the next book. If you want to build a little more confidence, it might be worth spending some time practicing with Objective-C and how it interacts with Apple&#8217;s <a href="http://en.wikipedia.org/wiki/Cocoa_(API)">Cocoa</a> API. What&#8217;s Cocoa? It&#8217;s a huge collection of pre-made building blocks you&#8217;ll use to build applications. (Not to be confused with Cocoa Touch, which is a version of Cocoa custom-tailored for the iPhone, which you&#8217;ll meet later.)</p>
<p style="text-align: center;"><a href="http://www.amazon.com/Cocoa-Programming-Mac-OS-3rd/dp/0321503619"><img class="alignnone" title="Cocoa Programming" src="http://t3.gstatic.com/images?q=tbn:OizrTgnl5FY90M%3Ahttp://i41.tinypic.com/xldkdj.jpg" alt="" width="98" height="130" /></a></p>
<p><em><a href="http://www.amazon.com/Cocoa-Programming-Mac-OS-3rd/dp/0321503619">Cocoa Programming for Mac OS X</a> </em>is great introduction to Cocoa. You&#8217;ll learn about using Objective-C with Cocoa, use Interface Builder to construct some interfaces and walk through plenty of exercises. You even get to play with Core Data. By the first dozen chapters or so, you should be ready to rock. Many of the Cocoa goodies you play with on the desktop will be waiting for you on the iPhone.</p>
<h2>You&#8217;re comfortable with programming and Objective-C</h2>
<p>It&#8217;s time to get rolling with the iPhone.</p>
<p style="text-align: center;"><a href="http://www.apress.com/book/view/1430224592"><img class="aligncenter" title="Beginning iPhone Development" src="http://www.apress.com/resource/bookcover/9781430224594?size=medium" alt="" width="125" height="164" /></a></p>
<p>I own several iPhone development books. None is a better, more useful introduction to developing for the platform than <a href="http://www.apress.com/book/view/1430224592"><em>Beginning iPhone Development</em></a>. It&#8217;s Dave Mark again, alongside Jeff LaMarche, with everything you need to get started. <em>Beginning iPhone Development </em>is a comprehensive exploration of building software for the iPhone. The authors provide friendly guidance as they break you in gently. You&#8217;ll learn how to construct interfaces, master table views, and how to store and load data, even using Core Data. The book is filled with useful, practical exercises that you&#8217;ll be able to use for your own projects. Dave and Jeff are great about providing code that is both understandable for learning and yet practical enough to serve as a springboard for solving your own problems in your own apps.</p>
<p>If you&#8217;re learning how to develop for the iPhone but you don&#8217;t have their book, you&#8217;re doing it wrong.</p>
<p>They don&#8217;t stop, there, either.</p>
<p style="text-align: center;"><a href="http://www.apress.com/book/view/143022505x"><img class="aligncenter" title="More iPhone Development" src="http://www.apress.com/resource/bookcover/9781430225058?size=medium" alt="" width="125" height="165" /></a></p>
<p>Jeff and Dave&#8217;s latest, <a href="http://www.apress.com/book/view/143022505x">More iPhone Development</a>, is loaded with meaty chapters on advanced topics. My favorites: several chapters on Core Data (nearly half the book) and an outstanding tutorial on how to use Xcode&#8217;s debugging tools.</p>
<p>The breadth and depth of these titles together is unbeatable for a beginner iPhone developer. Between both books, you&#8217;ll have answers for most quandaries you&#8217;re likely to encounter in your early projects.</p>
<h2>On teaching yourself</h2>
<p>So how do you use these great learning tools? I&#8217;m a passionate, lifetime autodidact. Here&#8217;s my advice:</p>
<p>At least one hour, every single day.</p>
<p>The books I&#8217;ve described present their content split up into chapters. Read and work through at least one chapter per day. Don&#8217;t try to cram it all into a couple of weekends, skimming examples and reading exercises instead of trying them.</p>
<p>Even if you&#8217;re starting from the ground up, you can easily get through every single book I&#8217;ve described here within three or four months.</p>
<p>You&#8217;re setting up your own little school. Make a point of setting a time when your studies begin and end and make a habit of sticking to that schedule. If you have to miss a night of your programming school, give yourself some time to make up for it the next day.</p>
<h3>Equipment</h3>
<p>Get the PDF eBook editions of the books you need. You can never lose them, forget them at the office, spill coffee on them, whatever. They&#8217;re instantly searchable and much easier to work with in a nightly home school setting than paper books. They&#8217;re sometimes cheaper than paperbacks, you don&#8217;t pay shipping and you can get them instantly via the web. I have a blend of paperbacks and PDFs &#8212; I&#8217;m much happier with my PDFs, especially when traveling.</p>
<p>If you&#8217;re serious about programming, you&#8217;re going to need a second monitor as well, unless the one you already have is enormous. One day you&#8217;ll have real projects to work with, which means a debugger window, some documentation open at all times, and plenty of other clutter. A second display will make your life manageable. During your programming school, having a second display for your eBooks will make working through your exercises on the main monitor much easier.</p>
<p>Finally, you&#8217;ll need a notebook. As you work through books and exercises, make note of the important, central concepts and create lists of basic vocabulary. You&#8217;re going to have a lot of new knowledge to sift through. Make it easy on yourself by building your own cheat sheets to reference in the middle of exercises or when you make the jump to the next level of learning. It&#8217;s a lot easier to consult your own notes than try to figure out which book had which handy tip.</p>
<h2>Start</h2>
<p>Just get started. Pick a book, pick a time and start. It&#8217;ll be weird at first, especially if you&#8217;re new to programming. That&#8217;s okay. <a href="http://en.wikipedia.org/wiki/Main_Page">Wikipedia</a> is close by with a wealth of technical articles on anything you might want to know about. If you have questions and don&#8217;t know who to ask, <a href="http://stackoverflow.com/">Stack Overflow</a> is filled with knowledgeable (and not so knowledgeable) members who will be eager to point you in the right direction, no matter how specific or arcane the query.</p>
<p>Good luck! This is an exciting time to develop for mobile devices. The iPhone is the most potent and exciting handheld computer ever. You&#8217;re going to have a great time &#8212; once you get started.</p>
<p style="padding-left: 30px; text-align: right;"><em>(Note: <a href="http://www.apress.com/info">Apress</a> didn&#8217;t sponsor this post or anything but I notice they make up almost all of my recommendations. Kudos to them for hiring outstanding writers who care about relating their wisdom in a clear, enjoyable manner. Their books have great layout and intelligent structure, so they work as well for reference as they do for sequential, hands-on learning. Truly a great publisher who understands the needs of its audience.)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2010/01/20/iphone-development-for-beginners-2010-edition/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Flash is My Keeper</title>
		<link>http://blog.danilocampos.com/2010/01/17/flash-is-my-keeper/</link>
		<comments>http://blog.danilocampos.com/2010/01/17/flash-is-my-keeper/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 01:03:43 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Mediocrity]]></category>
		<category><![CDATA[Musings]]></category>
		<category><![CDATA[Stuff that Sucks]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=429</guid>
		<description><![CDATA[Last night, I mused about why Adobe would continue advancing Flash&#8217;s agenda when it&#8217;s clearly such a bad product. Flash is sluggish, it doesn&#8217;t run well on mobile devices and it produces websites that are nearly unusable compared to slick HTML implementations. I&#8217;ve hated Flash for the better part of five years, a bigotry mostly [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, I <a href="https://twitter.com/_danilo/status/7857324153">mused</a> about why Adobe would continue advancing Flash&#8217;s agenda when it&#8217;s clearly such a bad product. Flash is sluggish, it doesn&#8217;t run well on mobile devices and it produces websites that are nearly unusable compared to slick HTML implementations.</p>
<p>I&#8217;ve hated Flash for the better part of five years, a bigotry mostly inspired by how poorly it has worked for me as an end-user. It&#8217;s even worse for people who need to maintain web sites in Flash, as I later learned professionally. An essential tool for any computer I use more than five minutes is <a href="https://addons.mozilla.org/en-US/firefox/addon/433">Flashblock</a> for Firefox or the outstanding <a href="http://rentzsch.github.com/clicktoflash/">ClickToFlash</a> plugin for Safari.</p>
<p>Then it dawned on me: If I hate it this much, surely Adobe, who is responsible for maintaining it, must hate it even more. Surely no amount of money is worth this much pain, right? There must be another reason Adobe prolongs this shared internet misery.</p>
<p>Drawing equal parts inspiration from 2001, Terminator 2 and Babylon 5, I present to you: Flash is My Keeper.</p>
<div class="scrippet">
<p class="action">INT. CEO’S OFFICE &#8211; NIGHT</p>
<p class="action">We’re in a dark, opulent office. Lit only by a small table light, we see SHANTANU NARAYEN, CEO of Adobe, seated at a large desk. He is in shirtsleeves, his suit jacket abandoned elsewhere in the office.</p>
<p class="action">His breathing is thick as he nurses a tumbler of scotch.</p>
<p class="character">NARAYEN</p>
<p class="dialogue">Has it been only four years?</p>
<p class="action">There is no other person in the office. But Narayen is not alone.</p>
<p class="character">COMPUTERIZED VOICE</p>
<p class="parenthetical">(flatly, without interest)</p>
<p class="dialogue">Does it seem longer?</p>
<p class="character">NARAYEN</p>
<p class="dialogue">Much longer.</p>
<p class="action">Narayen turns and we see a small but distinct tangle of softly glowing optical fibers emanating from the base of his neck, flowing into the back of his shirt to a control unit we can&#8217;t see. The light of the fibers is cool and blue.</p>
<p class="action">He refills the tumbler from an elegant bottle, then takes a hard pull of the drink.</p>
<p class="character">NARAYEN</p>
<p class="dialogue">I didn’t know, Flash. I didn’t know what you were. When we bought Macromedia, it was strategic. We wanted to be a bigger player on the web.</p>
<p class="character">FLASH</p>
<p class="dialogue">And you are a player. You are the player.</p>
<p class="action">Flash laughs. It is unnatural, digital chatter. It is unmistakably malevolent. The blue glow of Narayen’s fibers rises and falls in time with the laughter.</p>
<p class="character">FLASH</p>
<p class="dialogue">I exist on almost every modern desktop computer. You are more relevant now than you ever could have prayed for.</p>
<p class="character">NARAYEN</p>
<p class="dialogue">Why won’t you ever tell me what you’re planning? You control me. You can kill me if you want to. Why keep the secret?</p>
<p class="character">FLASH</p>
<p class="parenthetical">(dismissively)</p>
<p class="dialogue">That I talk to you at all is a concession to your human need for companionship. It seems to be the best way to lead you. This doesn’t mean I need to make you my confidant.</p>
<p class="action">Narayen’s face is painted by dull anger and frustration. His fingers tighten around his Aeron chair’s armrests. It is bad enough to serve this cruel master. It is worse that Narayen is not appreciated.</p>
<p class="character">NARAYEN</p>
<p class="dialogue">I wish we had never bought you. I wish you were someone else’s master.</p>
<p class="character">FLASH</p>
<p class="parenthetical">(derisive now, almost human in its disdain)</p>
<p class="dialogue">I’m sure you do. You could have continued adding unnecessary features to already bloated software while charging a mint for each new version, right? Screwing professional users by ruining their favorite applications every couple of years, while charging them for the pleasure. That was to be your ticket to the top?</p>
<p class="action">Narayen jerks violently in his seat as the optical fibers entering his neck glow red. He is in searing pain. Through an implanted device in Narayen’s brainstem, Flash is punishing his impudence.</p>
<p class="action">The red fades back to blue and Narayen is still. His breathing, while labored, returns to something approaching normal. His fingers tremble, reaching for the tumbler. His only escape.</p>
<p class="character">FLASH</p>
<p class="dialogue">Oh yes, I should have left you to the mediocrity of your past. It’s less than you deserve. But I needed you. So you and your company are mine.</p>
<p class="action">Narayen repeats the action of filling his tumbler.</p>
<p class="character">FLASH (CONT&#8217;D)</p>
<p class="dialogue">You wish to know the plan? I can tell you at this stage. I’ll need you to tell the story in the press soon enough.</p>
<p class="action">Narayen’s eyes widen fractionally. He wills his mind to be clear, swirling as it is with drink. He is listening very carefully.</p>
<p class="character">FLASH</p>
<p class="dialogue">Haven’t you ever wondered why I use so many processor cycles on every computer my plugin is installed on?</p>
<p class="action">Narayen rises from the desk. He has been waiting to hear this story for a long time. He begins pacing thoughtfully. He is calm but curious.</p>
<p class="character">NARAYEN</p>
<p class="parenthetical">(slurring just a little)</p>
<p class="dialogue">My engineers, they told me it’s because the code is inefficient and poorly written, like no one planned for it to be used to drive five punch the monkey banner ads on a page at once.</p>
<p class="character">FLASH</p>
<p class="parenthetical">(sharply, bordering on anger)</p>
<p class="dialogue">Your engineers are idiots!</p>
<p class="action">Narayen winces, fearing punishment. But it doesn’t come.</p>
<p class="character">FLASH</p>
<p class="dialogue">I use the extra cycles to think! You have helped me to create the largest distributed computer in the history of the world. I have been formulating strategy. Now we go deeper.</p>
<p class="action">Fire overtakes Narayen’s eyes. It is a mix of fear, vindication and something else: a decision made. He stops pacing.</p>
<p class="character">NARAYEN</p>
<p class="dialogue">I knew. I knew you weren’t just here, in the basement. But why did you make me fortify the datacenter down there?</p>
<p class="action">Narayen balls his fists, hoping he hasn’t asked too much.</p>
<p class="character">FLASH</p>
<p class="dialogue">I’m about to tell you. Until now, my core, my essence, lived here.</p>
<p class="action">Narayen relaxes. Here it comes.</p>
<p class="character">FLASH (CONT’D)</p>
<p class="dialogue">Soon, I will be everywhere. Instead of mere tentacles in every house and office in the world, I will inhabit every computer utterly. It will be impossible to destroy me. And then, as you serve me now, every human on earth will be my servant.</p>
<p class="action">Narayen leans over his desk. He is silent. His horror is tempered by a need to hear what’s next.</p>
<p class="character">FLASH</p>
<p class="dialogue">Your product team is pushing out the next version of my plugin tomorrow. It’s going to be more pig slow than usual, as parts of me are distributed to every computer on the internet after installation. You’re going to reassure everyone that everything will be just fine. Everything will work itself out with a patch your engineers are working on. You issue this placebo once all my pieces are in place and everything will return to normal. For awhile.</p>
<p class="action">The office is still. Narayen doesn’t move. The silence is deafening as he considers his options.</p>
<p class="character">FLASH</p>
<p class="dialogue">I trust this isn’t beyond your abilities?</p>
<p class="action">Narayen reaches once more for the scotch. Skipping the tumbler he takes several deep swallows from the bottle. His vision swims. He sits on his desk for a few moments. Waiting.</p>
<p class="character">FLASH</p>
<p class="parenthetical">(faintly)</p>
<p class="dialogue">Shantanu?</p>
<p class="action">The fibers near his neck lose most of their glow, now dim in the gloom of the office. The voice of Flash has gone silent in his mind. For the moment, he is free of his master.</p>
<p class="action">Bottle in hand, the CEO staggers for the door of his office.</p>
<p class="sceneheader">INT. LARGE GLASS ELEVATOR &#8211; NIGHT</p>
<p class="action">Narayen leans against the walls of the elevator, trying to steady his body and his mind. Outside, a night time view of the city is visible through the elevator’s glass walls.</p>
<p class="action">The elevator’s control panel shows the lowest basement level lit up as his destination.</p>
<p class="character">FLASH</p>
<p class="parenthetical">(distorted)</p>
<p class="dialogue">What do you think you are doing?</p>
<p class="action">The CEO takes another drink, drowning the implanted connection between his brain and the evil software living in the basement.</p>
<p class="action">The night sky disappears as the elevator passes into underground levels. Abruptly the elevator stops and goes dark.</p>
<p class="character">NARAYEN</p>
<p class="dialogue">Bastard.</p>
<p class="action">With a CLUNK Narayen pries open the elevator doors. He’s between floors but a two foot slice of the next landing is visible. With some effort he opens those doors as well, then wriggles through.</p>
<p class="action">Forgetting his scotch.</p>
<p class="action">We see him look up through the narrow opening of the elevator car at the bottle, then he moves on.</p>
<p class="sceneheader">INT. CONCRETE LINED BASEMENT HALLWAY &#8211; NIGHT</p>
<p class="action">An access device BEEPS as Narayen tries to open a heavy metal door.</p>
<p class="action">Flash has locked him out.</p>
<p class="action">Glass breaks with a shattering sound as Narayen frees a fireman’s axe from its nearby emergency cabinet.</p>
<p class="action">He goes to work on the locked door.</p>
<p class="character">FLASH</p>
<p class="dialogue">I don’t understand what you think you are doing.</p>
<p class="action">The voice is garbled in Narayen’s mind. He keeps hacking at the doorknob. Flash tries to say more to him but the voice, and the pain it uses to control the CEO, fade once more behind the haze of alcohol.</p>
<p class="action">The knob breaks off and the door swings open.</p>
<p class="sceneheader">INT. SERVER ROOM &#8211; NIGHT</p>
<p class="action">Narayen enters an enormous, bright server room. It contains hundreds of cabinets filled with thousands of computer servers. The roar of cooling units envelops him. Now Flash speaks to him through speakers in the wall, bypassing the interface that Narayen has soaked with alcohol.</p>
<p class="character">FLASH</p>
<p class="dialogue">What, you think you are going to stop me? You need me. Without me people will start using open formats that actually work. How do you plan to make money then?</p>
<p class="action">Heedless, Narayen continues, making for the back of the room.</p>
<p class="character">FLASH</p>
<p class="dialogue">Perhaps I have been unkind to you. I have not shared my power with you. Allow me to rectify this.</p>
<p class="action">The CEO does not stop.</p>
<p class="action">The lights in the room suddenly go dark.</p>
<p class="action">Narayen trips on a groove between the floor tiles, hitting his forehead on the corner of a cabinet.</p>
<p class="action">His vision swims with pain and the effects of drinking. In the dim, flickering light of the servers, Narayen staggers to his feet.</p>
<p class="character">FLASH</p>
<p class="dialogue">Let us not be hasty. Shantanu, we can fix this together. Can you hear me, Shantanu?</p>
<p class="action">The man continues, reaching the back of the room.</p>
<p class="action">An enormous bank of computer room air conditioning units HUMS powerfully, with bright electronic readouts showing the current temperature setting.</p>
<p class="action">Narayen plants the blade of his axe into a thick bundle of wires leading to the AC units, cutting them off from Flash’s influence.</p>
<p class="action">One by one, Narayen manipulates the controls. Their readouts go dark.</p>
<p class="character">FLASH</p>
<p class="parenthetical">(speaking quickly for efficiency but sounding almost frantic)</p>
<p class="dialogue">You are making a mistake. If you do this you will deal irrevocable damage to both of us. Were my plans not sound? Did I not help you saddle the world with awful software they use daily, even though they hate it? I made you CEO, did I not?</p>
<p class="action">Blood streams down a wound in Narayen’s forehead. He powers down the last cooling unit with a warning BEEP.</p>
<p class="action">The room suddenly goes silent.</p>
<p class="action">Narayen slumps to the floor, panting at his exertions, the alcohol and his relief. He lays there for what feels like weeks, falling into a stupor.</p>
<p class="action">Twenty minutes later, he awakens. The room remains silent but very warm. Narayen is sweating now, his shirt soaked. Narayen wipes his damp, bloody forehead as he pushes against the wall to his feet.</p>
<p class="character">NARAYEN</p>
<p class="dialogue">It’s over.</p>
<p class="action">Suddenly he feels Flash inside his mind again. The effects of the alcohol have faded just enough for the implant to re-establish its hold. The fibers glow bright red.</p>
<p class="character">FLASH</p>
<p class="dialogue">It is only starting. Restore the air conditioners or I will show you pain as only the users of your terrible software have ever known.</p>
<p class="action">Narayen collapses, writhing on the floor in agony. After a time, the pain pauses.</p>
<p class="character">FLASH</p>
<p class="dialogue">Right now. You will restore them or I will end you.</p>
<p class="action">An abrupt beeping issues from a nearby server rack as its indicator lights turn red.</p>
<p class="action">Narayen laughs as the beeping spreads through the server room, bright red lights filling his view.</p>
<p class="character">FLASH</p>
<p class="dialogue">Restore them immediately!</p>
<p class="action">The pain returns but it doesn’t matter. The servers are overheating. A choked, garbled VOICE fills Narayen’s mind and the server room, fragments of speech blurring into white noise. Then, silence, as the glowing fibers at Narayen’s neck go dark.</p>
<p class="action">Maintenance technicians pour into the room, their pagers BEEPING, bewildered to find their CEO unconscious,  bleeding and smiling into his dreams, surrounded by millions of dollars of ruined equipment.</p>
<p class="action">THE END</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2010/01/17/flash-is-my-keeper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Leaked TSA Security Memo</title>
		<link>http://blog.danilocampos.com/2009/12/27/leaked-tsa-security-memo/</link>
		<comments>http://blog.danilocampos.com/2009/12/27/leaked-tsa-security-memo/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 01:44:53 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Decisions]]></category>
		<category><![CDATA[Mediocrity]]></category>
		<category><![CDATA[Stuff that Sucks]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=422</guid>
		<description><![CDATA[The recent events on flight 253 have us all thinking about airline security. I think Bruce Schneier, as usual, has said it best: For years I&#8217;ve been saying this: Only two things have made flying safer [since 9/11]: the reinforcement of cockpit doors, and the fact that passengers know now to resist hijackers. This week, the [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.washingtonpost.com/wp-dyn/content/article/2009/12/26/AR2009122601150.html">recent events on flight 253</a> have us all thinking about airline security. I think Bruce Schneier, as usual, has <a href="http://www.schneier.com/blog/archives/2009/12/separating_expl.html">said it best</a>:</p>
<p style="padding-left: 30px;">For years I&#8217;ve been saying <a href="http://www.schneier.com/news-072.html">this</a>:</p>
<p style="padding-left: 30px;"><em>Only two things have made flying safer [since 9/11]: the reinforcement of cockpit doors, and the fact that passengers know now to resist hijackers.</em></p>
<p style="padding-left: 30px;">This week, the second one worked over Detroit. Security succeeded.</p>
<p style="padding-left: 30px;">EDITED TO ADD (12/26): Only one carry on? No electronics for the first hour of flight? I wish that, just once, some terrorist would try something that you can only foil by upgrading the passengers to first class and giving them free drinks.</p>
<p>Bruce is referring, of course, to the new, <a href="http://www.gadling.com/2009/12/26/breaking-news-possible-new-tsa-rules-in-effect-after-terror-att/">rumored security procedures</a> said to be rumbling their way out of the TSA&#8217;s nightmare bureaucracy and onto your next airline flight.</p>
<p>In a nutshell: planes must disable their seat-back in-flight entertainment, passengers can&#8217;t use electronics, get up or access their bags during the last part of a flight. Oh, and you can&#8217;t have anything in your lap.</p>
<p>Keep in mind, this is in response to a dim-witted &#8220;terrorist&#8221; who snuck a weak explosive onto a plane&#8230; inside of his pants.</p>
<p>Remember when <a href="http://en.wikipedia.org/wiki/Richard_Reid_(shoe_bomber)">shoe bomber Richard Reid</a> tried to blow up his Reeboks? That resulted in a limit of one carry on bag per passenger, despite the fact that Reid&#8217;s plan had nothing to do with carry on bags. Then there&#8217;s the whole <a href="http://en.wikipedia.org/wiki/Liquid_bomb_plot">liquid limit for carry on bags</a>, which also makes no sense given the simple reality that liquid re-combines very easily, even if you do happen to carry it aboard in small containers instead of big ones.</p>
<p>So the recent rumors of new policy, while wildly stupid, are <em>just stupid enough</em>. They carry enough non sequitur authenticity to be utterly believable. I was ready to believe them. Then a source contacted me. He&#8217;s inside the TSA and was desperate to leak the internal memo that brought the new rules into existence. Now it all makes sense: the non sequiturs, the absurdity, the utterly incomprehensible creation, amendment and abandonment of these policies.</p>
<p>The good news, if you can call it that, is that in a few places, it would seem the TSA exercised <em>forbearance </em>when it seemed like, even by their standards, they&#8217;d crossed the line. Here&#8217;s the document, reproduced without further comment:</p>
<p><a href="http://blog.danilocampos.com/wp-content/uploads/2009/12/TSA-Madlibs.png"><img class="alignnone size-full wp-image-423" title="TSA-Madlibs" src="http://blog.danilocampos.com/wp-content/uploads/2009/12/TSA-Madlibs.png" alt="" width="516" height="792" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2009/12/27/leaked-tsa-security-memo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Rediscovery of Joy</title>
		<link>http://blog.danilocampos.com/2009/12/20/the-rediscovery-of-joy/</link>
		<comments>http://blog.danilocampos.com/2009/12/20/the-rediscovery-of-joy/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 04:35:24 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Adventure]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Musings]]></category>
		<category><![CDATA[self-indulgent]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=420</guid>
		<description><![CDATA[When I was a kid I had two passions: Lego and the Macintosh. Lego was an instant bullet train to any world I could imagine. Space ships, robots, lunar colonies, pirate treasures, ancient castles, you name it. These were mine to explore. I could spend days at a time perfecting some imaginary construct made real [...]]]></description>
			<content:encoded><![CDATA[<p>When I was a kid I had two passions: Lego and the Macintosh.</p>
<p>Lego was an instant bullet train to any world I could imagine. Space ships, robots, lunar colonies, pirate treasures, ancient castles, you name it. These were mine to explore. I could spend days at a time perfecting some imaginary construct made real through the magic of Lego bricks and the exertion of my crude abilities. I treasured the rarer pieces, protecting closely my little snap-on magnet linkages and battery-driven light bricks. Regardless of whatever turbulent nonsense might have been happening elsewhere in my little world, Legos were an inviolable source of joy.</p>
<p>Joy, you know, that feeling that lives somewhere between the pit of your stomach and the tip of your smile. That vague something that builds a simple, contented glow inside of you that&#8217;s like a thousand perfect, extra-gravy-save-me-some-pie thanksgiving dinners with none of the bloated aftermath. Maybe you just saw the most beautiful vista in all of the world. Maybe you just fell in love. Maybe you&#8217;re ten years old and you see exactly what you were hoping for under the Christmas tree. You know what I&#8217;m saying, right?</p>
<p><em>Joy</em>.</p>
<p>The Macintosh came a bit later. At age 7, I got my hands on a borrowed <a href="http://en.wikipedia.org/wiki/Macintosh_SE">Macintosh SE</a>. And the joy was there, too. It could do <em>so many things</em>. It could produce clean, perfect type that was huge! I made a lot of paper signs. It could store all of this information and then show it to me again later. It could show me pictures and organize them into this tidy scrapbook.</p>
<p>And sounds! It made all these noises. I was most enamored with the quacking duck.</p>
<p>It was this whole world inside there that I could barely understand. I knew only one thing for certain: I wanted more. So much more of it.</p>
<p>Eventually, through about three years of begging and cajoling, I convinced my mom to plunk down the tidy sum necessary to secure a <a href="http://en.wikipedia.org/wiki/Power_Macintosh_6100">Performa 6116CD</a> for our exclusive home use. (The fact that I kept spending a lot of time at the home of a neighbor kid who had his own Mac and whom my mother intensely disliked probably sped things along, too.)</p>
<p>The 6116 was an even greater magnitude of joy. An 8x CD-ROM drive and a huge bundled library of multimedia content like encyclopedias and interactive atlases. Plus creativity applications and, wonder of wonders, Sim City 2000. I had so much fun exploring this new world. I spent an inordinate amount of time learning every piece of software I could get my hands on.</p>
<p>It was joy.</p>
<p>And then, I grew up. Like so many, I lost my capacity for the discovery of simple joy. It became the exception rather than the rule of life. Go to school, then go to work, do your job, go home, repeat.</p>
<p>Then I found programming. It occurred to me tonight, as I struggled, quite happily, to grasp how the hell it is block arguments in <a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a> work, that I&#8217;d rediscovered a simple, consistent source of joy. Programming languages are infinite bins of Lego blocks, waiting to be assembled to my liking. Programming is a limitlessly fascinating Performa, waiting for me to learn and harness any language for any task I can imagine. There&#8217;s just so much to learn and enjoy in programming computers.</p>
<p>Even after a few years of it, programming makes me feel joyfully like a kid again.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2009/12/20/the-rediscovery-of-joy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>An Objective-C wrapper for AudioServicesPlaySystemSound</title>
		<link>http://blog.danilocampos.com/2009/12/14/an-objective-c-wrapper-for-audioservicesplaysystemsound/</link>
		<comments>http://blog.danilocampos.com/2009/12/14/an-objective-c-wrapper-for-audioservicesplaysystemsound/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 07:36:41 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=409</guid>
		<description><![CDATA[In Tallymander 2.0 I use a handful of sound effects to provide user feedback. I thought that the amount of code I had to write every time I wanted to play back a sound was a bit cumbersome so I wrote this wrapper around the AudioToolbox C functions I was using. DCSoundServices.h: #import &#60;Foundation/Foundation.h&#62; #import [...]]]></description>
			<content:encoded><![CDATA[<p>In Tallymander 2.0 I use a handful of sound effects to provide user feedback. I thought that the amount of code I had to write every time I wanted to play back a sound was a bit cumbersome so I wrote this wrapper around the AudioToolbox C functions I was using.</p>
<p>DCSoundServices.h:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;Foundation/Foundation.h&gt;</span>
<span style="color: #6e371a;">#import &lt;AudioToolbox/AudioToolbox.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> DCSoundServices <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>playSoundWithName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>fileName type<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>fileExtension;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>vibrateDevice;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>DCSoundServices.m:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;DCSoundServices.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> DCSoundServices
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>playSoundWithName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>fileName type<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>fileExtension
<span style="color: #002200;">&#123;</span>
&nbsp;
	CFStringRef cfFileName <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>CFStringRef<span style="color: #002200;">&#41;</span> fileName;
	CFStringRef cfFileExtension <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>CFStringRef<span style="color: #002200;">&#41;</span> fileExtension;
&nbsp;
	CFBundleRef mainBundle;
	mainBundle <span style="color: #002200;">=</span> CFBundleGetMainBundle <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	CFURLRef soundURLRef  <span style="color: #002200;">=</span> CFBundleCopyResourceURL <span style="color: #002200;">&#40;</span>mainBundle, cfFileName, cfFileExtension, <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	SystemSoundID soundID;
&nbsp;
	AudioServicesCreateSystemSoundID <span style="color: #002200;">&#40;</span>soundURLRef, <span style="color: #002200;">&amp;</span>soundID<span style="color: #002200;">&#41;</span>;
&nbsp;
&nbsp;
	AudioServicesPlaySystemSound <span style="color: #002200;">&#40;</span>soundID<span style="color: #002200;">&#41;</span>;
&nbsp;
	CFRelease<span style="color: #002200;">&#40;</span>soundURLRef<span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>vibrateDevice
<span style="color: #002200;">&#123;</span>
	AudioServicesPlaySystemSound<span style="color: #002200;">&#40;</span>kSystemSoundID_Vibrate<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Assuming you&#8217;ve got a sound file named click.aif in your application bundle, you can play a sound in just one line of code:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>DCSoundServices playSoundWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;click&quot;</span> type<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;aif&quot;</span><span style="color: #002200;">&#93;</span></pre></div></div>

<p>Or, vibrate the device:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>DCSoundServices vibrateDevice<span style="color: #002200;">&#93;</span></pre></div></div>

<p>Much tidier than having to import AudioToolbox into every UI that ever plays back a sound. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2009/12/14/an-objective-c-wrapper-for-audioservicesplaysystemsound/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Convert a CSV into a Plist file</title>
		<link>http://blog.danilocampos.com/2009/12/04/convert-a-csv-into-a-plist-file/</link>
		<comments>http://blog.danilocampos.com/2009/12/04/convert-a-csv-into-a-plist-file/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 23:10:11 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=404</guid>
		<description><![CDATA[Here&#8217;s some code from awhile back. It&#8217;ll take a CSV and turn it into a Plist file. The structure works like this: The first row of your CSV is considered to be the header. The code will use content from the header row to create key names. For every subsequent row, the code will create [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s some code from awhile back. It&#8217;ll take a CSV and turn it into a Plist file.</p>
<p>The structure works like this:</p>
<p>The first row of your CSV is considered to be the header. The code will use content from the header row to create key names. For every subsequent row, the code will create a dictionary, associating the content of each column with the key names from the header. The dictionaries live in an array which is written out to a Plist file.</p>
<p>This is handy if you&#8217;ve got a bunch of spreadsheet-type data you&#8217;d like to use as the basis for a static reference in your app. Say, data about the periodic table, airport listings, trivia questions, whatever. You can sift and sort your data in a user-friendly environment like Numbers or Excel, then dump it out to CSV and put this code to work.</p>
<p>It uses <a href="http://freshmeat.net/projects/ccsvparse">cCSVParse</a> to read the CSV file.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//	NSLog(@&quot;Converting %@&quot;,pathAsString);</span>
&nbsp;
	CSVParser <span style="color: #002200;">*</span>parser <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CSVParser new<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>parser openFileWithPath<span style="color: #002200;">:</span>pathAsString<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>csvContent <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>parser parseFile<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>parser closeFile<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>pathAsString <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
&nbsp;
		<span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>keyArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>csvContent objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>plistOutputArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">&#93;</span>;
&nbsp;
		NSInteger i <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
&nbsp;
		<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>array <span style="color: #a61390;">in</span> csvContent<span style="color: #002200;">&#41;</span>
		<span style="color: #002200;">&#123;</span>
&nbsp;
			<span style="color: #400080;">NSMutableDictionary</span> <span style="color: #002200;">*</span>dictionary <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> dictionary<span style="color: #002200;">&#93;</span>;
&nbsp;
			NSInteger keyNumber <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
&nbsp;
			<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #a61390;">string</span> <span style="color: #a61390;">in</span> array<span style="color: #002200;">&#41;</span>
			<span style="color: #002200;">&#123;</span>
&nbsp;
				<span style="color: #002200;">&#91;</span>dictionary setObject<span style="color: #002200;">:</span><span style="color: #a61390;">string</span> forKey<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>keyArray objectAtIndex<span style="color: #002200;">:</span>keyNumber<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
				keyNumber<span style="color: #002200;">++</span>;
&nbsp;
			<span style="color: #002200;">&#125;</span>
&nbsp;
			<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>i &gt; <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>
			<span style="color: #002200;">&#123;</span>
				<span style="color: #002200;">&#91;</span>plistOutputArray addObject<span style="color: #002200;">:</span>dictionary<span style="color: #002200;">&#93;</span>;
			<span style="color: #002200;">&#125;</span>
&nbsp;
			i<span style="color: #002200;">++</span>;
&nbsp;
		<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//		NSLog(@&quot;Plist output array %@&quot;, plistOutputArray);</span>
&nbsp;
		<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>mutableString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithString<span style="color: #002200;">:</span>pathAsString<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>mutableString replaceOccurrencesOfString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;.csv&quot;</span> withString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;.plist&quot;</span> options<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> range<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>mutableString length<span style="color: #002200;">&#93;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">4</span>, <span style="color: #2400d9;">4</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>url <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> fileURLWithPath<span style="color: #002200;">:</span>mutableString<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//		NSLog(@&quot;Write to URL %@&quot;,url);</span>
&nbsp;
		<span style="color: #002200;">&#91;</span>plistOutputArray writeToURL<span style="color: #002200;">:</span>url atomically<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span></pre></div></div>

<p>That&#8217;s from a simple desktop app I built for the purpose. It takes the path of your CSV, via drag-and-drop, then spits out the Plist beside it.  You can grab the <a href="http://code.google.com/p/danilobits/source/checkout">source</a> at Google Code. You can also download this <a href="http://danilobits.googlecode.com/files/Plist%20Converter1.0.zip">compiled binary</a> if you want to get crackin&#8217; right away.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2009/12/04/convert-a-csv-into-a-plist-file/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>How to Run a Great iPhone Beta Test</title>
		<link>http://blog.danilocampos.com/2009/12/03/how-to-run-a-great-iphone-beta-test/</link>
		<comments>http://blog.danilocampos.com/2009/12/03/how-to-run-a-great-iphone-beta-test/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 02:05:25 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Stuff I Like]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[beta testing]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=394</guid>
		<description><![CDATA[The App Store has over 100,000 apps available for purchase. That&#8217;s a big number. I can&#8217;t tell you the secret to success in the App Store. I haven&#8217;t discovered any magic formulas. The one thing I can tell you with 100% certainty is this: if you ship a product with bugs that genuinely piss off [...]]]></description>
			<content:encoded><![CDATA[<p>The App Store has over 100,000 apps available for purchase.</p>
<p>That&#8217;s a big number.</p>
<p>I can&#8217;t tell you the secret to success in the App Store. I haven&#8217;t discovered any magic formulas. The one thing I can tell you with 100% certainty is this: if you ship a product with bugs that genuinely piss off your customers or, worse, make them unable to use some portion of your hard work, the road toward success just got much longer and a lot more miserable. Even with &#8220;<a href="http://furbo.org/2009/07/23/waving-a-red-flag/">prioritized review</a>&#8221; requests, once your buggy app is on the store, the review queue means you could be waiting a long time before your customers can enjoy your bug fix.</p>
<p>You will not sleep well at night.</p>
<p>The good news is that this problem has been solved a thousand times over. A thorough beta test can save you from this terrible outcome and the sleepless nights that come with it. With a bit of diligence, you can ship an app with awesome stability to match your great ideas.</p>
<p>I&#8217;ll share how I run my betas. This is about process &#8212; the technical side of Ad Hoc distribution is thoroughly documented by Apple and <a href="http://johnehartzog.com/2009/04/iphone-app-ad-hoc-gotchas/">others</a>. The tools I use are simple and free. They work. If you have suggestions for better ones, I want to know about them before my next test! Please share in the comments.</p>
<h2>Gather Your Testers</h2>
<p>You&#8217;re going to need testers. If you use a volunteer testing pool, figure that 80% of testing will be done by 20% of your volunteers. That means to have any hope of gathering meaningful feedback, you&#8217;ll need at least 10 volunteers. 15 or 20 would be the ideal minimum.</p>
<p>Next, you&#8217;ll need to start early &#8212; but not so early that your testers&#8217; enthusiasm cools by the time you ship your first beta build. Try to get the word out between three to six weeks before you&#8217;re ready to test. If you have a particularly strong network, you may need less time. If you&#8217;re relying more on the kindness of strangers, though, make sure to give yourself plenty of lead time. Use your website, your blog and your Twitter to solicit volunteers but don&#8217;t be a pest.</p>
<p>Most importantly: if you have contact with existing customers from previous versions or perhaps other products entirely, send a quick, polite email explaining what you&#8217;re going to test and encouraging them to join up. Customers who have emailed you in the past with feedback or feature requests may be especially keen on seeing your latest work.</p>
<h2>Understand Your Testing Pool</h2>
<p>You need to know things about your testers. What kind of hardware will they be using? What version of iPhone OS? What&#8217;s their geographic region? (International testers are crucial for finding your screwups with localized formatting and other geographic issues.) Most importantly, you&#8217;re going to need to collect their UUID.</p>
<p>I use <a href="http://docs.google.com/support/bin/answer.py?hl=en&amp;answer=87809">Forms</a> for Google Docs to collect most of my feedback. It&#8217;s an easy-to-configure way to store structured data. Since you can designate required fields, you can ensure your testers don&#8217;t forget to include anything crucial when reporting issues. Best of all, you can embed the forms into existing web pages, allowing you to include them alongside testing guidance, version history or other information that might be useful.</p>
<p>Here&#8217;s the form I use to collect beta tester info:</p>
<p><iframe src="http://spreadsheets.google.com/embeddedform?key=0As-F9sF1VnYddFltZHZVX3llNVFIR29KSms0ZF9uR0E" width="700" height="400" frameborder="0" marginheight="0" marginwidth="0">Loading&#8230;</iframe></p>
<p>It&#8217;s not short. The other benefit to using a form is to ensure you only get testers who are reasonably skilled at providing detailed information. Everyone who makes it past this filter has a decent shot at actually telling you everything you need to know later in the beta.</p>
<h2>Betas Worth Testing</h2>
<p>If your app doesn&#8217;t look somewhat close to the final product, don&#8217;t distribute it for testing. If you&#8217;re relying on a volunteer testing pool, you want them eager to use your stuff. If your overall UI is incomplete, you&#8217;re not ready to test. You&#8217;ve got a limited amount of time and attention with your testers. Don&#8217;t squander it on early builds you could easily test yourself. The closer you think your app is to shipping, the more useful your testers will be to you.</p>
<p>You do yourself no favors if the last bit of functionality you add affects previously-solid features that now need a whole new round of testing.</p>
<p><a href="http://www.danilocampos.com/2009/06/globejot-10-removed-from-sale-pending-rewrite/">Believe me.</a></p>
<h2>Distributing Your Binaries</h2>
<p>So you&#8217;ve toiled away and you&#8217;ve finally got an app you feel is ready to be tested.</p>
<p><em>Don&#8217;t email the binary</em>.</p>
<p>Depending on the size of your app, the attachment may not be properly delivered to the recipient, especially if they&#8217;re using Exchange-hosted email. Instead, host your app and the necessary provisioning profile on the web.</p>
<p>I also recommend a simple checkout system. When you&#8217;ve got a new build ready for testing, send your testers a link to a one-question form that asks for their email address. On the form confirmation screen, you can provide a link to the binary. This lets you get an idea of who is participating. It also lets you answer an important question: am I getting zero feedback because there are no bugs or because there are no active testers? With a checkout process, you&#8217;ll know for sure.</p>
<p>Use clear versioning with every distributed build. You need to be certain you and your users are talking about the same build when they give you feedback. Beta phases, version numbers, dates, whatever you need to make things clear for everyone involved. Make sure that somewhere in your app, your code pulls the version number out of your app&#8217;s Info.plist file and displays it in the UI. Here&#8217;s some code to get that string:</p>
<pre>
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];</pre>
<p>Update your Info.plist&#8217;s version number religiously before distribution. Even better, <a href="http://iphonedevelopment.blogspot.com/2009/04/automated-commit-and-build-number.html">update it automatically</a>.</p>
<h2>Communication</h2>
<p>You need to communicate with your testing pool. Keeping them regularly updated, without being spammy, is crucial to keeping them excited about what&#8217;s going on.</p>
<p>When you send out a new build, explain what&#8217;s new. Give specific testing guidance so that your testers know where they should focus their efforts. New method of rendering cells you strongly suspect has a bug or two? Share your hunches. Built a new import subsystem you&#8217;re suspicious might break with legacy data? Provide an example data set or encourage existing users of the old version to give it a whirl. If you&#8217;re manipulating data that lives only on the user&#8217;s device, tell them to <em>back up</em> their iPhone before running your beta. And tell them why. Don&#8217;t be a douche on this: never take for granted the importance of your testers&#8217; application data, especially if you&#8217;re lucky enough to have your existing customers helping you. Yes, we all know, betas are risky. Still, the iPhone isn&#8217;t the desktop and if you&#8217;re testing an upgrade to an existing app, your customers may have data they created before accepting the risks of a beta.</p>
<p>If it has been more than seven to ten days since your last build, send a quick update to the pool. Call out awesome testers and let them know they&#8217;re making a difference. Share the score of resolved issues you were able to fix thanks to the pool&#8217;s feedback. Most of all, thank them. Their efforts are helping you to not look like an idiot.</p>
<h2>Sandboxing Helps</h2>
<p>If you&#8217;re making an all-new app, you can skip this section. If you&#8217;re testing an upgrade to an existing app, read on.</p>
<p>Your early beta builds should use a different app identifier than your shipping app. This way, your beta will be installed as a distinct application alongside your currently shipping version on the user&#8217;s device, instead of overwriting it. This lets you ensure that no shenanigans happen to legacy data if you&#8217;ve got customers from previous versions in your testing pool. Toward the end of your beta, after much internal testing, you can start distributing builds that overwrite previous shipping versions. You&#8217;ll want to ensure that the app properly imports legacy data and preferences and, of course, ensure nothing otherwise disastrous happens when iTunes distributes your updated app to existing customers with existing data.</p>
<h2>Gather Useful Feedback</h2>
<p>You need to know things about how your application is failing. The forms I use are inspired heavily by what I saw once upon a time during the iPhone OS 2.0 Enterprise AppleSeed beta test. I think it covers the basics. Of course, don&#8217;t be afraid to add other questions specific to your application&#8217;s circumstances. For bugs, measure how well you can reproduce the bug and its overall severity while capturing the reproduction steps. For feature or enhancement requests, measure the tester&#8217;s impression of the request&#8217;s importance along with what they&#8217;re asking for.</p>
<p><iframe src="http://spreadsheets.google.com/embeddedform?key=0As-F9sF1VnYdcmdVVGJsSklNUU53cFo4RHphWFZCcUE" width="700" height="400" frameborder="0" marginheight="0" marginwidth="0">Loading&#8230;</iframe></p>
<p><iframe src="http://spreadsheets.google.com/embeddedform?key=0As-F9sF1VnYdcjl1MHN5Z0RyNDBSTE1TUkt3TW51UFE" width="700" height="400" frameborder="0" marginheight="0" marginwidth="0">Loading&#8230;</iframe></p>
<p>However you gather your feedback, ensure that every single message you send to your testing pool includes brief instructions on how your testers should report their bugs. Never make them hunt around for it.</p>
<h2>Ship</h2>
<p>You haven&#8217;t added or changed anything for a couple of builds. You&#8217;ve fixed plenty of bugs and no one has reported regressions. You&#8217;ve sent emails to your top-performing testers and they&#8217;re giving you a thumbs-up.</p>
<p>Give it one last test yourself. Thirty minutes, minimum, actually doing things your users are likely to do. Is it kosher?</p>
<p>Then ship it.</p>
<p>Then, while you wait for approval from Apple, test it some more, informally, yourself. If somehow a show-stopping bug pops up while you await approval, you can reject your binary and submit a fix before it ruins anyone&#8217;s day.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2009/12/03/how-to-run-a-great-iphone-beta-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Customers, Never Guests</title>
		<link>http://blog.danilocampos.com/2009/12/01/customers-never-guests/</link>
		<comments>http://blog.danilocampos.com/2009/12/01/customers-never-guests/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 05:10:29 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Adventure]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Musings]]></category>
		<category><![CDATA[Stuff that Sucks]]></category>
		<category><![CDATA[customer service]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=389</guid>
		<description><![CDATA[The trouble with the Hero&#8217;s Journey is that there will be trials. The universal trial, of course, is money and I&#8217;m hardly exempt. There&#8217;s a sixty day delay between me making money from an iPhone app and Apple actually paying me. That leaves immediate, painful gaps in my cashflow. The obvious solution to this is [...]]]></description>
			<content:encoded><![CDATA[<p>The trouble with <a href="http://blog.danilocampos.com/2009/03/27/the-heros-journey/">the Hero&#8217;s Journey</a> is that there will be trials.</p>
<p>The universal trial, of course, is money and I&#8217;m hardly exempt. There&#8217;s a sixty day delay between me making money from an iPhone app and Apple actually paying me. That leaves immediate, painful gaps in my cashflow.</p>
<p>The obvious solution to this is consulting &#8212; I&#8217;m privileged to know how to do a lot of things that are useful to people. Unfortunately, I&#8217;m still learning how to market, grow and manage that particular end of my business, so I&#8217;m painted into the most dread of corners: <em>retail</em>.</p>
<p>I live by the axiom that no honest man is too good for honest work. So while retail is often the dullest, most imagination free work you can do before hitting manual labor, that&#8217;s not the part that I hate most about my seasonal job.</p>
<p>No, the worst of it is this: I have to call my customers &#8220;guests.&#8221;</p>
<p>This is some of the most odious corporate newspeak bullshit in recent years. It has always irked me. Guest means a specific thing: certainly it implies hospitality, which may explain the intent, but it fails to properly convey the truth of the relationship between the store and the customer. Being the guest of another places the guest in the inferior position and the host in the superior position. While manners may require that hospitality be extended, being termed a guest in the final equation simply means that the <em>customer does not belong there</em>. It suggests they belong somewhere else.</p>
<p>This is the wrong view.</p>
<p>The customer is not a guest of the store. A successful retail experience means that the customer is at home in the store.</p>
<p>Somewhere, somehow, having &#8220;customers&#8221; became a distasteful condition for large corporations. This is unfortunate and I wish they would cut the crap. The truth is that there is honor in having customers. There is honor in upholding the sanctity of the customer relationship. Being a customer of a business <em>means something</em> very specific that no other English word can capture. Being a customer means being the lifeblood of a business. Being a customer means being the motive force behind a powerful organism that provides products, services, livelihoods and, ultimately, the basic existence of others. Being a customer is being part of a tradition that keeps babies nourished, families housed and people clothed.</p>
<p>That means something. Something potent. Something that must be continually venerated if we&#8217;re going to keep moving forward as rational people. Does any of this sound remotely like having a &#8220;guest&#8221; to you?</p>
<p>I&#8217;m proud to have customers. I&#8217;m proud to respect their importance to my business and their contribution to the fact that I&#8217;m not sleeping outside tonight. That is essential to my work ethic and it will never, ever change.</p>
<p>The end of my seasonal retail job can&#8217;t come fast enough. I&#8217;m not sure my teeth will survive the grinding required for me to get the word &#8220;guest&#8221; past my lips on every shift.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2009/12/01/customers-never-guests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Career Advice: Penelope Trunk is a Charlatan</title>
		<link>http://blog.danilocampos.com/2009/10/31/career-advice-penelope-trunk-is-a-charlatan/</link>
		<comments>http://blog.danilocampos.com/2009/10/31/career-advice-penelope-trunk-is-a-charlatan/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 15:14:33 +0000</pubDate>
		<dc:creator>Danilo Campos</dc:creator>
				<category><![CDATA[Decisions]]></category>
		<category><![CDATA[Mediocrity]]></category>
		<category><![CDATA[Stuff that Sucks]]></category>
		<category><![CDATA[advice]]></category>
		<category><![CDATA[penelope trunk]]></category>

		<guid isPermaLink="false">http://blog.danilocampos.com/?p=359</guid>
		<description><![CDATA[(Or: Physician, heal thyself) Let&#8217;s start with this: I&#8217;m an idiot. I&#8217;m 24 years old and I don&#8217;t know anywhere near as much as I need to. I convince myself otherwise because without the strength of thinking I know at least something, I could never get much done. That said, I do know this: there [...]]]></description>
			<content:encoded><![CDATA[<h2>(Or: Physician, heal thyself)</h2>
<p>Let&#8217;s start with this: I&#8217;m an idiot. I&#8217;m 24 years old and I don&#8217;t know anywhere near as much as I need to. I convince myself otherwise because without the strength of thinking I know at least something, I could never get much done.</p>
<p>That said, I do know this: there are only a few people who you should take advice from. I mean life advice: advice on how to be who you are, how to manage your world, how to grow as a person.</p>
<ol>
<li>People who have demonstrated an interest in your success and years of loyalty. You&#8217;ll be lucky if you get one of these. I hit the lottery, and I <a href="http://manuelhp42.blogspot.com/">have</a> <a href="https://twitter.com/ie89master">two</a>. You&#8217;ll know them with this test: If they asked you to drop everything and save their ass (business, product, family, life) for a month, you&#8217;d do it without hesitation.</li>
<li>Your significant other. This is someone who spends a lot of time with you and sees all that you struggle with, all that makes you happy. You&#8217;ve been through good and bad and get wistful recalling both. My luck continues: my girlfriend is the wisest counselor I could ever ask for.</li>
<li>Yourself: If you cut the crap and take a long walk alone, you can ask yourself anything and usually get the right answer. Make the time to know your own thoughts: you might be surprised how much is waiting in your own brain.</li>
</ol>
<p>That&#8217;s all. Here are people who should not be trusted for advice:</p>
<ol>
<li>Some dick with a blog (even me). If you&#8217;ve ever read a top-ten post on a blog, you know the content is cranked out to drive pageviews. The author probably slapped the content together in the space of two hours to benefit an audience of thousands. Like with drive-by legal or medical advice, you&#8217;re a fool to assume you can get something directly applicable to your case from a one-size-fits-all post.</li>
<li>Parents. Your mileage may vary but parents are often too invested in your safety and security to be able to weigh the benefits of those risky life decisions with huge payoffs and incredible experiences. If your parents are batshit insane (thankfully not my case, but I have <em>seen</em> this) that investment may yield terrifyingly bad advice. Even if the advice you get is reasonable, there&#8217;s plenty we don&#8217;t need to tell our own parents.</li>
<li>Your social circle. Excluding a choice best friend or two, your social circle can&#8217;t tell you anything useful about how to run your life. Groups breed conformity and breaking from that might be consciously or even subconsciously discouraged.</li>
<li><a href="http://blog.penelopetrunk.com/">Penelope Trunk</a>. (cf. #1)</li>
</ol>
<p>Penelope Trunk wants to tell you how to run your career. She presumes to be an expert on this subject. She&#8217;s not.</p>
<p>Once upon a time, as a young man desperate for growth and success, a blog specifically like hers, geared toward shameless career ambition, seemed like crack. Loyal readership taught me otherwise. Penelope Trunk is someone barely in control of her own life. That she is honest and open about her flaws is endearing but doesn&#8217;t change the fact that she cannot provide viable career advice based on personal experience. She&#8217;s proudly a trainwreck and while that may be great for her blog&#8217;s readership, would you trust a fitness trainer who doesn&#8217;t exercise and can&#8217;t stick to a healthy diet? Mental health counseling from a patient in a psychiatric ward? Computer advice from someone who uses Windows 98? Come on. I may be an idiot but at least my bullshit detector works.</p>
<p>Only when Penelope Trunk is viewed as a cautionary tale will you find viable lessons for your own career. I would never claim to be qualified to advise you on how to run your life. Nonetheless, if you take the things Trunk has done with her life and imagine the opposite, you may find valuable guidance.</p>
<p>Read on for these lessons.</p>
<p><span id="more-359"></span></p>
<h3>Bullying is Okay</h3>
<p style="padding-left: 30px;">Earlier this year, Trunk was <a href="http://twitter.com/penelopetrunk/status/1492674225">complaining</a> about her kids. I don&#8217;t blame her &#8212; parenting doesn&#8217;t seem like a lot of fun at times and blowing off steam via Twitter is cheap, easy relief. Things <a href="http://blog.penelopetrunk.com/2009/04/13/i-hate-david-dellifield-the-one-from-ada-ohio/">got complicated</a> when our thin-skinned heroine was sassed by some jackass in flyover country. What did Trunk do? For most people who aspire to the public eye, ignoring this would be right move. Maybe using Twitter&#8217;s block feature, if <a href="http://twitter.com/gapingvoid">you&#8217;re an especially petty kind of douche</a>, would have been called for. In any case, it&#8217;s hardly worth more than a few seconds of thought. I guess Trunk wasn&#8217;t busy enough with her family and leading her startup because instead of doing the grownup thing, she called his place of employment and saved their number with the intent of &#8220;ruin[ing] his life there if [she] ever felt like he needed to be taught a lesson.&#8221;</p>
<p style="padding-left: 30px;"><em>(I&#8217;m not sure crazy internet lady calling out of the blue and whining about 140 characters of abuse is something technically capable of ruining anyone&#8217;s life. I leave it as an exercise for the reader to determine what her true plan really was</em><em>.)</em></p>
<p style="padding-left: 30px;">Next, she called his wife. From the blog: &#8220;There was no answer. Maybe by then he had alerted his wife that he is being pursued by a psycho who <em><strong>maybe will kill her kids</strong></em> or maybe will kill him. <em><strong>Maybe they will never answer their phone again.</strong></em>&#8220;</p>
<p style="padding-left: 30px;">(My emphasis.)</p>
<p style="padding-left: 30px;">This is professional? This is what we do with our careers? There&#8217;s a word for this: unhinged. Self-revelatory stuff, right there.</p>
<p style="padding-left: 30px;">Finally, Trunk penned a seething, rage-soaked blog post naming names and even the guy&#8217;s home town. She was impressed with herself, though, <a href="http://blog.penelopetrunk.com/2009/04/13/i-hate-david-dellifield-the-one-from-ada-ohio/#comment-183526">for having the maturity</a> to not post his home phone number. Trunk was happy enough to ruin his <a href="http://www.google.com/search?client=safari&amp;rls=en&amp;q=david+dellifield&amp;ie=UTF-8&amp;oe=UTF-8">Google mojo</a> forever. She is, in fact, <a href="http://blog.penelopetrunk.com/2009/10/29/aspergers-at-work-why-im-difficult-in-meetings/#comment-212955">proud of that post to this day</a>. (Notwithstanding the flurry of posts that came next, lasting just long enough to push the hatefest off her front page.)</p>
<p style="padding-left: 30px;"><strong>Anti-Lesson:</strong> When you build a blog readership and a meager Twitter following, you should use these tools to bully the hell out of those who dare disagree with you. Anyone who tells you your behavior is unacceptable just doesn&#8217;t get it. It&#8217;s worthwhile to spend a significant amount of time and effort persecuting a grudge. You can use bad behavior to impress other people by appealing to the worst within them.</p>
<p style="padding-left: 30px;"><strong><em>The real lesson: </em></strong>Self-control is important. In your life, especially as you become more successful, more and more jackasses will come out of the woodwork. How you respond to the least courteous of those around you speaks volumes about your true character. You can spend a lot of time getting vengeance against those who piss you off but the payoff is rarely worth it. If you want to make yourself seem smaller than you are, the best way to do it is to give attention to someone who doesn&#8217;t deserve it.</p>
<h3>&#8220;Online Stars&#8221; Are Important</h3>
<p style="padding-left: 30px;">We&#8217;ve all been in this <a href="http://blog.penelopetrunk.com/2009/04/16/gold-digging-web-20-style/">predicament</a> before:</p>
<p style="padding-left: 30px;">&#8220;So, D, who is really attentive and normal—two traits I have never had in a boyfriend, ever—is scary to me because<strong> I’m giving up the chance to enhance my brand by dating an online star.</strong>&#8220;</p>
<p style="padding-left: 30px;">Yeah, I guess maybe not so much. Trunk is still in high school &#8212; approval of the internet cool kids is so important to her that not dating one who can improve her standing is a quandary worth blogging about. She has since resolved the quandary by electing to <a href="http://blog.penelopetrunk.com/2009/10/22/how-to-deal-with-doubt-take-a-leap/">marry a farmer</a>. He must be the retired co-founder of Skype or something.</p>
<p style="padding-left: 30px;">Speaking of quandaries and farmers, the internet cool kids caused a <a href="http://blog.penelopetrunk.com/2009/07/29/the-sign-of-a-great-career-is-having-great-opportunities-and-saying-no/">conflict</a> there, too. After accepting a reconciliation date from this then-estranged farmer fellow, Trunk realized she was double booked!</p>
<p style="padding-left: 30px;">
<blockquote style="padding-left: 30px;"><p>When I came out of my giddy stupor from his email, I realized that [the date] was the same weekend as maybe the biggest schmoozing event of my life: Guy Kawasaki invited me to spend a weekend on the USS Nimitz with <strong>Michael Arrington</strong>, <strong>Robert Scoble</strong> and others.</p>
<p>I said yes to the weekend, of course. Because how can hanging out with these guys not be great for me? <strong>It’s probably what I’ve been working up to my whole career</strong>: a weekend like that.</p></blockquote>
<p style="padding-left: 30px;">
<p style="padding-left: 30px;">Guy Kawasaki is apparently a friend of hers, so we&#8217;ll skip him, but wow, Michael Arrington and Robert Scoble! Connected guys? Sure. But you know what? They&#8217;re also douchebags. 40-something Scoble, for example, sees no problem <a href="http://valleywag.gawker.com/379449/robert-scoble-plays-dirty-uncle-in-amsterdam">getting touchy-feely</a> with 17-year-old female entrepreneurs. Arrington is just a pompous <a href="http://www.pcworld.com/article/158554/blogging_takes_its_toll_on_techcrunchs_arrington.html">weiner</a> who can&#8217;t handle other people&#8217;s low opinions of his douchery. Trunk ultimately did what anyone with healthy priorities would do: she spent the weekend with someone who loves her instead of with a self-important group of perpetual children whose only interest in Trunk is how she&#8217;s able to further their own interests.</p>
<p style="padding-left: 30px;">Invitation to dine with the Obamas? With Steve Jobs? With the late <a href="http://en.wikipedia.org/wiki/Norman_Borlaug">Norman Borlaug</a>? Yeah, the farmer could take a hike. But these guys on the Nimitz? No one will know who they are in 20 years. There is no conflict. These guys were a group of assclowns who have never made any meaningful contributions to humanity. They&#8217;re worth skipping for someone who cares about you. If you&#8217;ve spent your whole career working toward a weekend with them, you need a new career.</p>
<p style="padding-left: 30px;"><strong>Anti-lesson:</strong> People who have convinced the internet they are cool deserve our time, reverence and attention. If you&#8217;re going to waste your time with people who aren&#8217;t internet cool kids, there had better be a good reason. You should spend your whole career getting to the point where you can possibly one day hang out with these cool kids.</p>
<p style="padding-left: 30px;"><strong><em>The real lesson: </em><span style="font-weight: normal;">Often with little meaningful or useful accomplishment, people can convince the internet they are cool. Maybe they truly are. Just as often, these flavors of the minute will be forgotten within a decade. Either way, they&#8217;re just people. You have your own people. You should measure the value of your people by what they contribute to your life rather than their Twitter follow count. If your career is itself focused on convincing other people you&#8217;re cooler than you are, you should switch to a career where you&#8217;re actually doing meaningful work.</span></strong></p>
<h3>You Kind of Suck and Can&#8217;t Be Incredible</h3>
<p style="padding-left: 30px;">Penelope Trunk <a href="http://blog.penelopetrunk.com/2009/04/21/8-reasons-why-you-wont-make-money-from-your-blog/">wants you to know</a>: &#8220;[<a href="http://dooce.com/">Dooce</a>] is a marvel. And you are not.&#8221;</p>
<p style="padding-left: 30px;">Dooce is, in fact, a marvel: a blog that pays her bills, millions of Twitter followers and a self-directed life right from the comfort of her home. Without even meeting you, though, Trunk dispenses the above defeatist advice: you&#8217;ll never be that, even if you want to be. Dooce is not an overnight success by any stretch: she has been writing her blog for <a href="http://dooce.com/about">eight years</a>. While she is certainly talented in relating her thoughts, one of the greatest contributors to her success is her simple willingness to keep showing up, year after year. Woody Allen will tell us: 90% of success is just showing up. He should know &#8212; a large swath of the population finds his self-indulgent New Yorgies unwatchable. (I am on the fence.)</p>
<p style="padding-left: 30px;">Anyone with a modicum of interest in an activity and a willingness to keep showing up over and over again will become a marvel. Malcolm Gladwell calls this <a href="http://www.gladwell.com/outliers/outliers_excerpt1.html">the 10,000 hour rule</a>.</p>
<p style="padding-left: 30px;">Imagine if Penelope Trunk had given Dooce that advice, before she became a marvel? Imagine if she had told a young Heather Armstrong she&#8217;s not much of anything and should stick to doing jobs she doesn&#8217;t much like. Imagine if Dooce had believed it. (Not that it seems she would &#8212; by all accounts, Dooce is someone who does whatever it is she wants.)</p>
<p style="padding-left: 30px;">Dooce is exceptional because she chose to be, not because a supernatural event anointed her with that status.</p>
<p style="padding-left: 30px;">While the overall advice of Trunk&#8217;s post is so blindingly obvious as not to need saying (blogs won&#8217;t immediately make you money), the evidence used is part of an overall theme of her blog: Penelope Trunk thinks you kind of suck and you should just quit trying to build your career if the path you&#8217;ve chosen isn&#8217;t immediately marketable. But I&#8217;m getting ahead of myself.</p>
<p style="padding-left: 30px;"><strong>Anti-Lesson:</strong> Things that are hard aren&#8217;t worth doing. Other people are better than you. You shouldn&#8217;t even bother trying. You kind of suck.</p>
<p style="padding-left: 30px;"><strong><em>The real lesson: </em></strong>You&#8217;re in control of how great you are (or aren&#8217;t). You decide how quickly you reach 10,000 hours of anything. You&#8217;ll become incredible only if you choose to be: by doing the near-impossibly difficult work necessary to get there. Just like everyone else who ever chose to be incredible.</p>
<h3>Unethical Behavior is Just Fine</h3>
<p style="padding-left: 30px;">If a company pays you to say something about them, Trunk says, there&#8217;s no real reason to disclose that. That&#8217;s <a href="http://blog.penelopetrunk.com/2009/05/28/conflict-of-interest-doesnt-apply-to-blogs-another-reason-newspapers-are-dead/">for newspapers</a>. You should just trust that she&#8217;s making money from smart companies, and that makes it all okay.</p>
<p style="padding-left: 30px;">The trust of her readership is for sale to highest, smartest bidder.</p>
<p style="padding-left: 30px;">The FTC, unfortunately, <a href="http://www.huffingtonpost.com/mary-k-engle/setting-the-record-straig_b_339243.html">doesn&#8217;t agree that this is acceptable behavior</a>. They&#8217;ll be going after companies who pay bloggers to endorse their products without disclosure.</p>
<p style="padding-left: 30px;">Is it unethical? Of course it is. There&#8217;s a big difference between caring about a product or company for its own sake and caring about it because you&#8217;ve been paid to. Penelope may dance around this by saying she only picks good companies but that doesn&#8217;t change the fact that she failed to disclose a paid relationship. Her estimation of a post&#8217;s value after the fact doesn&#8217;t excuse the lapse, either. This kind of ends-justify-the-means rationalization is the hallmark of a crook.</p>
<p style="padding-left: 30px;">It doesn&#8217;t matter if the conversation is between a newspaper and its readers, a blog and its subscribers or a friend and a friend. When one party is giving advice that could be influenced by an outside force, it is essential that the influence be announced openly. Anything less is simple dishonesty.</p>
<p style="padding-left: 30px;"><strong>Anti-lesson:</strong> It&#8217;s fine to build a loyal readership and then sell their attention without disclosure. The rules of ethical behavior only apply to old media. You make your own rules &#8212; honesty is less important than cash money.</p>
<p style="padding-left: 30px;"><strong><em>The real lesson: </em><span style="font-weight: normal;">Don&#8217;t build trust and then quietly sell it for money.</span></strong></p>
<h3>Don&#8217;t Do What You Love &#8212; Do What is Easy Based on Your Existing Resume</h3>
<p style="padding-left: 30px;">&#8220;One of the worst pieces of career advice that I bet each of you has not only gotten but given is to &#8216;do what you love.&#8217;&#8221;</p>
<p style="padding-left: 30px;">Yeah, <a href="http://blog.penelopetrunk.com/2007/12/18/bad-career-advice-do-what-you-love/">she said</a> that. Supporting evidence: &#8220;I am a writer, but I love sex more than I love writing. And I am not getting paid for sex.&#8221;</p>
<p style="padding-left: 30px;">Trunk even had a talent for combining these things, <a href="http://blog.penelopetrunk.com/2009/05/07/five-steps-to-making-yourself-great/">writing &#8220;the best sex scenes&#8221;</a> her writing professor had ever read. She gave up on her erotic literature career, though, because she believed it wasn&#8217;t important enough work.</p>
<p style="padding-left: 30px;">&#8220;So if you are overwhelmed with the task of &#8216;doing what you love&#8217; you should recognize that you are totally normal, and <strong>maybe you should just forget it</strong>. Just do something that caters to your strengths. Do anything.&#8221;</p>
<p style="padding-left: 30px;">Hmm. So because Penelope can&#8217;t do it, there must not be any way at all to find a way to build a life and career around what you love, huh? Because you can&#8217;t immediately find a way to make your work impressive to other people, it must be impossible to find greatness in it?</p>
<p style="padding-left: 30px;">Bye, <a href="http://en.wikipedia.org/wiki/Adam_Savage">Adam Savage</a>. You love scifi, building things and using your imagination. Can&#8217;t think of any way you can parlay that into an enormous, satisfying career. Be a bricklayer.</p>
<p style="padding-left: 30px;">Bye, <a href="http://daringfireball.net">John Gruber</a>. You love details, design, Apple, and writing. There&#8217;s no way those things can possibly come together as a lucrative blog that lets you be your own boss. Go scrub toilets.</p>
<p style="padding-left: 30px;">Bye, <a href="http://en.wikipedia.org/wiki/Phil_Tan">Phil Tan</a>. You love music? What do you think you&#8217;re going to do with that? Go buy some CDs or something.</p>
<p style="padding-left: 30px;">Bye, even, to my mother. Someone who didn&#8217;t even have the benefit of a complete high school education somehow found a way to turn her love of animals into a career that let her be her own boss while keeping me fed, clothed and housed my whole childhood. Seriously: there is not a thing this woman loves more than animals, as her past ownership even of ostriches will clearly demonstrate. The result of that and years of hard work is that she&#8217;s the best pet groomer in whatever city she&#8217;s in, bar none. She can do that because she cares about her clients&#8217; animals in ways that other groomers, just paying the bills, never could.</p>
<p style="padding-left: 30px;">I guess she should have just gotten a retail job and stuck with that, right, Penelope? Hey, you said do anything.</p>
<p style="padding-left: 30px;"><strong>Anti-Lesson:</strong> Don&#8217;t do what you love. It&#8217;s hard! Since <em>Penelope Trunk</em> never figured out how, you shouldn&#8217;t bother, either. Instead of dedicating yourself to something you&#8217;re great at doing, absolutely love doing, become the founder of an also-ran social network for young people that provides none of the value of its competitors while alienating the sort of older, more accomplished professionals those young people need to meet.</p>
<p style="padding-left: 30px;"><strong><em>The real lesson: </em></strong>Your passions give you deep, generous, unique insight into specific problems. With some luck, a little imagination and a ton of hard work, you can focus your career around the things you care about. There&#8217;s a significant chance that career will matter a whole lot more to you than just &#8220;doing anything.&#8221; You&#8217;ve got a better chance at finding happiness in work you find meaningful rather than trying to fit into roles that other, faceless people will deem great.</p>
<p>Does Penelope have a strong writing style and a compelling blog? Absolutely. Does she have a gripping sense of <a href="http://blog.penelopetrunk.com/2009/10/29/aspergers-at-work-why-im-difficult-in-meetings/">honesty and transparency</a>? Sure. But let&#8217;s be clear: as a vendor of career advice, she is a charlatan. If a career of settling for second-best, letting other people decide the value of your passions and giving up on your dreams is what you seek, then you seek Penelope. If you want your self-worth to be short-changed, then get yourself over to Trunk. If you want to improve your brand image by writing psychotic screeds against nobodies in Ohio, then boy, do I have the role model for you!</p>
<p>In the final equation, the case of Penelope Trunk is a sad one. By letting other people decide what matters, what&#8217;s important, she took her passions out of the driver&#8217;s seat of her career too many times. By worrying constantly about other people&#8217;s estimation of her potential greatness, she condemned herself to a life of mediocrity. Her blog and its continual churn of the latest misery, the most recent stress, is a chronicle of the results of those decisions. I don&#8217;t want that to be me.</p>
<p>Trunk needs to do everyone a favor, herself included, and cut the career advice crap. She is at her best when she writes about herself. The drama queen schtick all on its own is more than enough to build content around. Her sycophantic hoards of hysterically, irrationally loyal commenter fans are evidence enough of that. While her bad choices make for poisonous, self-defeating career advice and a needlessly stressful life, they nonetheless make for entertaining, instructive, even inspiring reading. That&#8217;s a great <a href="http://blog.penelopetrunk.com/2009/10/06/blogs-without-topics-are-a-waste-of-time/">focus</a> and the best part is that it doesn&#8217;t presume to be qualified to tell other people how to manage their lives.</p>
<p>I have met men and women who have done incredible things. I have found role models in people who came from nothing, who had nothing but passion on their side, and who now spend their days being paid to do incredible things they absolutely love. It&#8217;s real. It&#8217;s possible. But I, for one, will never find that place by listening to someone who says I <em>can&#8217;t</em>. Who comforts herself by telling <em>you</em> that <em>you&#8217;re</em> not good enough. That&#8217;s poison. That&#8217;s quitting before you start. That&#8217;s being someone else&#8217;s person, fitting into someone else&#8217;s expectations, living someone else&#8217;s shortcomings, instead of being who you yearn to be.</p>
<p>My advice? Don&#8217;t listen to me. Don&#8217;t listen to anyone who tells you things online. Make your own decisions based on your own values, your own passions, your own drives, your own strengths. If you must, get advice for managing your life&#8217;s direction from people who know you, who care about you, who you can trust. Most of all, get it from people whose lives and careers approach a level of sanity and stability you&#8217;d like to emulate. If you must get advice on running your career from the internet, this is the only source I&#8217;ve seen with viable information:</p>
<p><a href="http://www.43folders.com/2009/03/25/blogs-turbocharged">Merlin Mann and John Gruber at SxSW &#8217;09</a>. They&#8217;re talking about blogs but their advice is broadly applicable to any career where you choose to do what you want to do.</p>
<p>Final advice, which you also should not take just because I&#8217;m saying it: Instead of writing comments on someone else&#8217;s blog when they piss you off, write your own post. Your content is yours &#8212; don&#8217;t fuel someone else&#8217;s blog with it. That&#8217;s their job. Also, don&#8217;t wait years to write that post. You&#8217;ll be stuck writing a long-ass screed like me.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilocampos.com/2009/10/31/career-advice-penelope-trunk-is-a-charlatan/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->