<?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/"
	>

<channel>
	<title>Peter Armstrong</title>
	<atom:link href="http://www.peterarmstrong.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.peterarmstrong.com</link>
	<description>Thoughts on Lean Publishing, Startups, Flex, Rails and more</description>
	<pubDate>Wed, 25 Aug 2010 04:52:55 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Planned Weekday Schedule to Reduce Information Consumption Overload and Improve Productivity</title>
		<link>http://www.peterarmstrong.com/?p=336</link>
		<comments>http://www.peterarmstrong.com/?p=336#comments</comments>
		<pubDate>Wed, 25 Aug 2010 04:52:55 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=336</guid>
		<description><![CDATA[Let&#8217;s see how this goes&#8230;
Planned Weekday Schedule
700 - 715 : wake up, shower, dress
715 - 740 : breakfast &#038; commute to train
740 - 840 : commute &#038; write or work on train
840 - 900 : commute to office
900 - 1130 : work alone
1130 - 1200 : email
1200 - 1300 : lunch
1300 - 1630 : work [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s see how this goes&#8230;</p>
<p><strong>Planned Weekday Schedule</strong></p>
<p>700 - 715 : wake up, shower, dress<br />
715 - 740 : breakfast &#038; commute to train<br />
740 - 840 : commute &#038; write or work on train<br />
840 - 900 : commute to office<br />
900 - 1130 : work alone<br />
1130 - 1200 : email<br />
1200 - 1300 : lunch<br />
1300 - 1630 : work alone or with others<br />
1630 - 1650 : commute to train<br />
1650 - 1740 : commute &#038; work on train, pick 3 things to accomplish tomorrow<br />
1740 - 2000 : dinner &#038; family time<br />
2000 - 2100 : exercise (weights, elliptical training while reading RSS, Hacker News, TechCrunch, Twitter &#038; Reddit on iPad)<br />
2100 - 2300 : relax, write or work</p>
<p>The ideas here are to:<br />
1. Batch email to be done once a day.<br />
2. Do my individual effort work in the morning, and if necessary, in the evening.  The afternoon can be a &#8220;work with others&#8221; time when beneficial.<br />
3. Exercise every day.  The iPad is good for is surfing the web while elliptical training, so if I limit my information consumption habit to that time and device, then I will not only exercise daily but I&#8217;ll break the habit of consuming information on my laptop.  (I&#8217;ve also just unsubscribed from about 75% of my RSS feeds.)<br />
4. Actually write and launch <em>Lean Publishing</em>.  I actually have something to say now, so no more procrastinating!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=336</wfw:commentRss>
		</item>
		<item>
		<title>A Huge Thanks To Giles Bowkett for Helping Leanpub!</title>
		<link>http://www.peterarmstrong.com/?p=313</link>
		<comments>http://www.peterarmstrong.com/?p=313#comments</comments>
		<pubDate>Wed, 05 May 2010 04:11:53 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=313</guid>
		<description><![CDATA[So, back in December of last year, Giles Bowkett announced that he was starting doing consulting.  At that time, Leanpub was going through a direction crisis, since I was realizing that we were in fact building a full-fledged publishing platform, based on our blog-to-book workflow that we had evolved in order to publish Eric [...]]]></description>
			<content:encoded><![CDATA[<p>So, back in December of last year, <a href="http://gilesbowkett.blogspot.com/">Giles Bowkett</a> <a href="http://gilesbowkett.blogspot.com/2009/12/blogs-are-godless-communist-bullshit.html">announced</a> that he was starting doing consulting.  At that time, <a href="http://leanpub.com">Leanpub</a> was going through a direction crisis, since I was realizing that we were in fact building a full-fledged publishing platform, based on our blog-to-book workflow that we had evolved in order to <a href="http://leanpub.com/startuplessonslearned/">publish Eric Ries&#8217; Startup Lessons Learned blog as a book</a>.</p>
<p>I was starting to realize that the direction we had chosen (a custom Flex + Rails app) was possibly not the right way to go, since while it made sense for the PDF-generation workflow, it made less sense for the publishing platform.  My fear was that if the blog-to-book approach that we were using for Eric Ries&#8217; book was indeed the future of Leanpub, we would end up needing to create a full-featured blogging platform or else get really good at totally seamless RSS feed importing.</p>
<p>This was the setup and my frame of mind when I saw Giles&#8217; post about his starting consulting.  Since I&#8217;ve been part of the Ruby community for a while (writing a somewhat popular <a href="http://manning.com/armstrong">book</a> and organizing the Vancouver Ruby/Rails <a href="http://ruby.meetup.com/112/">meetup</a>), I was already familiar with Giles.</p>
<p>I knew two things:<br />
1. He would be extremely blunt.<br />
2. He would be completely honest.</p>
<p>So, who better to pay as a consultant?</p>
<p>The last thing I wanted was someone to say nice things to me in order to get or keep my business!  So, I signed up for Giles&#8217; consulting program, explained the Leanpub idea to Giles and gave him a demo of the current app.</p>
<p>I had already known that the app was at a very early stage and had a long way to go.  However, after spending an hour with Giles, going over the goals of the app, its current state, and the direction we intended to go, I realized a couple things:</p>
<p>1. The app was <strong>much worse</strong> than I had thought.<br />
2. Essentially all the useful code was in the book generation, and not much would be lost by throwing away the UI and starting over.</p>
<p>This was simultaneously depressing and liberating.</p>
<p>I went to Whistler and thought through the Leanpub problem some more.  I realized that not only should we throw away the Flex UI (which was my code, and which totally sucked) but we should also throw away the Rails app as well!</p>
<p>I realized that instead we should base Leanpub on WordPress MU.  After all, we were fundamentally building a new publishing platform, and this publishing platform was putting blogging at its core.   (We had our work with Eric Ries to thank for this realization: hooray for Steve Blank&#8217;s Customer Development and Eric Ries&#8217; Lean Startup approaches!)</p>
<p>So, since we were building a book publishing platform based on blogging, why reinvent the wheel when WordPress was already an extremely powerful and popular blogging platform, and when WordPress MU could handle multiple users and blogs on the same system?</p>
<p>WordPress MU it was.</p>
<p>It&#8217;s hard to throw away your own code, but the lightness I felt after typing <code>rm -rf app/flex</code> was invigorating.</p>
<p>Since this realization, we started building the new Leanpub in January in our spare time.  (Ruboss is itself a consulting company, after all: we&#8217;re bootstrapping Leanpub, and we have families to feed and mortgages to pay!)  Over the past few months we have made significant progress with Leanpub, and we&#8217;re already farther ahead than we would have been if we had kept going down the path that we had chosen.  (We even built a new Flex app&#8211;but just to organize the structure of a book, since using the WordPress Pages editor to do this is extremely cumbersome and unintuitive.)</p>
<p>We have Eric Ries to thank for the blog-to-book workflow, but personally I have Giles to thank for essentially making me see my app with fresh and much more critical eyes.</p>
<p>So&#8230;</p>
<p><strong>Thanks Giles!</strong></p>
<p>If you are building an app and are looking for honest advice, I highly recommend contacting Giles.  This is not a replacement for the Customer Development process, it&#8217;s a useful addition to it&#8230;  My recommendation if you work with Giles is to essentially do the Customer Development process with him: talk to him as though you&#8217;re trying to make him a customer.  That&#8217;s what I did, and it was well worth it&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=313</wfw:commentRss>
		</item>
		<item>
		<title>Photos from San Francisco Trip</title>
		<link>http://www.peterarmstrong.com/?p=299</link>
		<comments>http://www.peterarmstrong.com/?p=299#comments</comments>
		<pubDate>Tue, 27 Apr 2010 07:00:08 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=299</guid>
		<description><![CDATA[After a fantastic conference on Friday, it was nice to relax a bit on the weekend&#8230;
First, I can&#8217;t resist the juxtaposition&#8230;

Also, the wine and scenery was great&#8230;


]]></description>
			<content:encoded><![CDATA[<p>After a fantastic conference on Friday, it was nice to relax a bit on the weekend&#8230;</p>
<p>First, I can&#8217;t resist the juxtaposition&#8230;<br />
<img class="alignnone size-medium wp-image-302" title="img_0554" src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/img_0554-225x300.jpg" alt="img_0554" width="225" height="300" /><img class="alignnone size-medium wp-image-301" title="img_0553" src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/img_0553-225x300.jpg" alt="img_0553" width="225" height="300" /></p>
<p>Also, the wine and scenery was great&#8230;<br />
<img class="alignnone size-medium wp-image-304" title="img_0586" src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/img_0586-225x300.jpg" alt="img_0586" width="225" height="300" /><br />
<img class="alignnone size-medium wp-image-303" title="img_0583" src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/img_0583-225x300.jpg" alt="img_0583" width="225" height="300" /><img class="alignnone size-medium wp-image-305" title="img_0599" src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/img_0599-225x300.jpg" alt="img_0599" width="225" height="300" /><img class="alignnone size-medium wp-image-307" title="img_0589" src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/img_0589-300x225.jpg" alt="img_0589" width="300" height="225" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=299</wfw:commentRss>
		</item>
		<item>
		<title>My Humble Contribution to Steve Blank&#8217;s Talk</title>
		<link>http://www.peterarmstrong.com/?p=293</link>
		<comments>http://www.peterarmstrong.com/?p=293#comments</comments>
		<pubDate>Sat, 24 Apr 2010 07:22:35 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=293</guid>
		<description><![CDATA[As you probably know from Twitter, Steve Blank gave an absolutely fantastic talk at the Startup Lessons Learned conference today.
I&#8217;m proud (and more amused than I probably should be) to say that I made a small photo contribution to it!

I suppose I should read the book on the chairlift instead&#8230;

&#8230;or just leave the book in [...]]]></description>
			<content:encoded><![CDATA[<p>As you probably know from Twitter, Steve Blank gave an absolutely fantastic talk at the Startup Lessons Learned conference today.</p>
<p>I&#8217;m proud (and more amused than I probably should be) to say that I made a small photo contribution to it!</p>
<p><img src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/armstrong_ow26_apr20.jpg" alt="Peter Armstrong reading The Four Steps to the Epiphany at Whistler" title="Peter Armstrong reading The Four Steps to the Epiphany at Whistler" width="800" height="534" class="alignnone size-full wp-image-294" /></p>
<p>I suppose I should read the book on the chairlift instead&#8230;</p>
<p><img src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/armstrong_ow61_apr20.jpg" alt="The Four Steps to the Epiphany in Snow" title="The Four Steps to the Epiphany in Snow" width="800" height="534" class="alignnone size-full wp-image-295" /></p>
<p>&#8230;or just leave the book in the snow while I snowboard!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=293</wfw:commentRss>
		</item>
		<item>
		<title>My (Attempted) Reality Distortion Field</title>
		<link>http://www.peterarmstrong.com/?p=289</link>
		<comments>http://www.peterarmstrong.com/?p=289#comments</comments>
		<pubDate>Fri, 23 Apr 2010 06:25:55 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Lean Publishing]]></category>

		<category><![CDATA[Leanpub]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=289</guid>
		<description><![CDATA[Steve Blank made a great post today called Turning on your Reality Distortion Field, explaining how he recommends doing a 30 second, < 100 word elevator pitch.
I've so far been pretty terrible at improvising these, so I decided to actually write one down this time.  Here it is, all 99 words of it&#8230;
Imagine a [...]]]></description>
			<content:encoded><![CDATA[<p>Steve Blank made a great post today called <a href="http://steveblank.com/2010/04/22/turning-on-your-reality-distortion-field/">Turning on your Reality Distortion Field</a>, explaining how he recommends doing a 30 second, < 100 word elevator pitch.</p>
<p>I've so far been pretty terrible at improvising these, so I decided to actually <em>write one down</em> this time.  Here it is, all 99 words of it&#8230;</p>
<blockquote><p>Imagine a world in which authors can actually make money writing books…</p>
<p>Imagine a world in which authors know who their readers are, and can have a meaningful conversation with them about their books—before they’re even “published”…</p>
<p>Imagine a world in which authors could apply Customer Development and Lean Startup principles to the process of writing and publishing a book…</p>
<p>If you imagine that world long enough, you realize that the authors who know their readers the best are bloggers, and that the future of publishing is turning blogs into books.  Automatically.</p>
<p>That future is called &#8230; Leanpub.</p></blockquote>
<p>Cheesy?  Good?  Comments please&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=289</wfw:commentRss>
		</item>
		<item>
		<title>Why Lean Publishing Makes Financial Sense for Authors, based on my Flexible Rails Royalties</title>
		<link>http://www.peterarmstrong.com/?p=266</link>
		<comments>http://www.peterarmstrong.com/?p=266#comments</comments>
		<pubDate>Fri, 16 Apr 2010 06:08:50 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Lean Publishing]]></category>

		<category><![CDATA[Leanpub]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=266</guid>
		<description><![CDATA[Since I&#8217;m Canadian, I have a genetic predisposition to not talking about success &#8212; even very modest success.  So, I haven&#8217;t really gone into details about the financial success of Flexible Rails, since that would be unseemly.
Now, however, it&#8217;s in the best interest of my company (Ruboss) to do so, since it makes my [...]]]></description>
			<content:encoded><![CDATA[<p>Since I&#8217;m Canadian, I have a genetic predisposition to not talking about success &#8212; even very modest success.  So, I haven&#8217;t really gone into details about the financial success of <em>Flexible Rails</em>, since that would be unseemly.</p>
<p>Now, however, it&#8217;s in the best interest of my company (<a href="http://ruboss.com">Ruboss</a>) to do so, since it makes my point about what we&#8217;re trying to do with <a href="http://leanpub.com">Leanpub</a> a lot more obvious.  If I&#8217;m going to try to convince you that Lean Publishing is the future of publishing, I need better data than <a href="http://www.peterarmstrong.com/?p=134">stupid pictures drawn with a sharpie</a>.</p>
<p>So, I&#8217;m using my experience with <em>Flexible Rails</em> as a case study for why <strong>Lean Publishing makes financial sense for authors</strong>.  I&#8217;m going to spend this post going into details of how I managed to make decent money from Flexible Rails, which was a modest success for a niche book.  I made about <strong>$34,000</strong> from the PDF alone, and about <strong>$48,000</strong> total from it.  Even better, it launched my company!</p>
<p>You can do much better than $34,000 from a PDF!  For example, this is only about 3-5% of what 37signals made from <em>Getting Real</em>, which (as far as I know) is the gold standard for success of a PDF book.  (Yes, they made about a million dollars from a PDF!)  Their story is well-known, so I don&#8217;t need to tell it here&#8230;</p>
<p>In fact, I&#8217;d say that my modest success story is more relevant to you, since chances are you resemble me more than DHH or Jason Fried.  Unlike them, I was not famous when I self-published <em>Flexible Rails</em>; I was a nobody, living in Parksville, BC, working remotely for a Silicon Valley company in the mortgage industry.  I didn&#8217;t have a famous blog. I hadn&#8217;t created a famous product or web app framework.  (These statements are still true today!  Well, mostly true: I live in Maple Ridge now and I have my own company, but I&#8217;m still not famous, nor have I created a famous product or web app framework!)</p>
<p>Yet I managed to make a lot more than what authors typically make from books (which is typically under $10,000, from what I hear).  This wasn&#8217;t because my book was a better book.  It was because the way that I published it was better.  I published it early, and I published it often.  (Sound familiar?)</p>
<p><em>Flexible Rails</em> went through 23 unfinished revisions on Lulu before becoming a Manning book.  During that time, I built a community of readers around the raw manuscript, so that when I switched to Manning to produce a finished product (and get the channel revenue that I had no access to) I had grassroots buzz around the book.</p>
<p>Anyway, stop tal-tal-talkin &#8217;bout blah, blah, blah, chances are what you want to see is numbers.  So, here you go (these look images look better when viewed full size in their own tab):</p>
<h2>The Self-Published Numbers (While Flexible Rails Was In-Progress)</h2>
<p><img src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/flexible-rails-lulu-royalties.png" alt="flexible-rails-lulu-royalties" title="flexible-rails-lulu-royalties" width="912" height="240" class="alignnone size-full wp-image-267" /></p>
<h2>The Self-Published + Manning Numbers (Flexible Rails Was Published in Q1 2008)</h2>
<p><img src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/flexiblerailsmanningandluluroyalties.png" alt="flexiblerailsmanningandluluroyalties" title="flexiblerailsmanningandluluroyalties" width="1048" height="729" class="alignnone size-full wp-image-271" /></p>
<p>As you can see, the revenue from non-ebook sales and from non-direct sales was negligible.  So, it really is all about the ebooks.  Screw the iPad, <strong>PDF FTW!</strong></p>
<p>I&#8217;ll go over what this all means in a lot more detail in a future post&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=266</wfw:commentRss>
		</item>
		<item>
		<title>Why Leanpub Has No DRM or &#8220;PDF Document Security&#8221; and Never Will</title>
		<link>http://www.peterarmstrong.com/?p=257</link>
		<comments>http://www.peterarmstrong.com/?p=257#comments</comments>
		<pubDate>Fri, 16 Apr 2010 04:02:40 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Lean Publishing]]></category>

		<category><![CDATA[Leanpub]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=257</guid>
		<description><![CDATA[Note: This is based on my emailed reply to a prospective Leanpub author.  I shouldn&#8217;t write emails on the train, since they tend to expand to fill the remainder of my train commute home &#8212; and I probably make the prospective customer fall asleep after the second paragraph!
I was asked today whether we had [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: This is based on my emailed reply to a prospective Leanpub author.  I shouldn&#8217;t write emails on the train, since they tend to expand to fill the remainder of my train commute home &#8212; and I probably make the prospective customer fall asleep after the second paragraph!</em></p>
<p>I was asked today whether we had plans to offer PDF document security on Leanpub.  This was my reply&#8230;</p>
<p>Speaking as someone who has spent over 1000 hours writing 2 technical books, both of which are constantly pirated on the internet:</p>
<p>We offer absolutely no PDF document security at all.</p>
<p>I doubt we ever will.</p>
<p>We may offer a footer (e.g. &#8220;This book was sold to peterarmstrong@gmail.com&#8221;) in the future, if customers ask for it. This may reduce the type of &#8220;innocent&#8221; sharing with friends that currently happens with books, but it won&#8217;t be any real security against piracy: these types of footers are easily removed.</p>
<p>I know that both my books are pirated: I see them show up an automated search I have set up in Google Reader.  While I wish every one of those copies was a sale for me, I realize that hardly any would have been sales.  In fact, I&#8217;d rather that someone pirates one of my books than buys a competing book: in the future, these people may buy something else I produce.  (This is Microsoft&#8217;s approach with Windows in developing markets, and it&#8217;s served them well.)</p>
<p>Our position is that anything digital can be copied, and the way you succeed as an author is by making your content easy to buy and good enough to grow a community around.</p>
<p>Right now the best selling book on Leanpub is <em>The Venture Hacks Bible</em>, which is about 1000 pages of content that can currently be read for free on the internet.  (The book is just their blog, after all.  We shout that fact from the rooftops, and on the cover of the book!)</p>
<p>However, people have still bought the PDF (we have a great conversion % of unique visitors).  Why?  Well, primarily since it&#8217;s more convenient for them to buy the PDF to read it offline than it is to read years of the blog archive or to try to find a copy to pirate.</p>
<p>This approach has worked well for other people: 37signals made about a million dollars on sales of <em>Getting Real</em>, even though it was a DRM-free PDF.</p>
<p>Now, I wasn&#8217;t nearly as successful with my books as they were, but I still made over $25,000 in royalties on DRM-free PDFs of my <em>Flexible Rails</em> book (over $13,000 of which while I was self-publishing it). And <em>Flexible Rails</em> was only a modestly successful book about a very niche topic: how to use Adobe Flex with Ruby on Rails.</p>
<p>My point is that if you start famous (like 37signals) or as a complete nobody (me), you can make good money selling DRM-free PDFs.  You just need to write good content and build a community around it&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=257</wfw:commentRss>
		</item>
		<item>
		<title>The Venture Hacks Bible is now on Leanpub!</title>
		<link>http://www.peterarmstrong.com/?p=249</link>
		<comments>http://www.peterarmstrong.com/?p=249#comments</comments>
		<pubDate>Mon, 12 Apr 2010 05:29:44 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Leanpub]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=249</guid>
		<description><![CDATA[We&#8217;re done our pricing experiments, and we&#8217;ve settled on a price of $19 for now.  (It won&#8217;t get any cheaper, but we&#8217;re not ruling out making it more expensive as it grows&#8230;)
So, it&#8217;s the official launch of The Venture Hacks Bible, which is now linked from the Venture Hacks homepage!
The Venture Hacks Bible is [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re done our pricing experiments, and we&#8217;ve settled on a price of $19 for now.  (It won&#8217;t get any cheaper, but we&#8217;re not ruling out making it more expensive as it grows&#8230;)</p>
<p>So, it&#8217;s the official launch of <a href="http://leanpub.com/venturehacks">The Venture Hacks Bible</a>, which is now linked from the Venture Hacks homepage!</p>
<p><a href="http://leanpub.com/venturehacks">The Venture Hacks Bible</a> is a constantly-updated version of the <strong>entire</strong> Venture Hacks blog.  (We regenerate it once a month.)  It&#8217;s currently about 1000 pages.</p>
<p>For posterity, since I think we&#8217;ll look back at this as a major moment in Leanpub history, here&#8217;s a screenshot of the link on the Venture Hacks sidebar:</p>
<p><a href="http://leanpub.com/venturehacks"><img src="http://www.peterarmstrong.com/wp-content/uploads/2010/04/venturehacksbiblelink.png" alt="venturehacksbiblelink" title="venturehacksbiblelink" width="283" height="386" class="alignnone size-full wp-image-250" /></a></p>
<p>Woo hoo!</p>
<p>This is a triumph for the Lean Startup / Customer Development approach, btw.  The entire blog-to-book workflow which is the foundation of Leanpub was created out of interaction with a customer, and iterated on until we got to this point.  I&#8217;ll blog more about that later&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=249</wfw:commentRss>
		</item>
		<item>
		<title>Hello! Flex 4 - Diffs Between Flex 4 Beta 2 and Flex 4 Final</title>
		<link>http://www.peterarmstrong.com/?p=214</link>
		<comments>http://www.peterarmstrong.com/?p=214#comments</comments>
		<pubDate>Sat, 10 Apr 2010 21:22:47 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=214</guid>
		<description><![CDATA[I am currently revising the ebook of Hello! Flex 4 to use Flex 4 Final instead of Flex 4 Beta 2, which is what the first printing of the book uses.
However, in order to be totally transparent, here is every diff in the Hello! Flex 4 source code from Flex 4 Beta 2 and Flex [...]]]></description>
			<content:encoded><![CDATA[<p>I am currently revising the ebook of Hello! Flex 4 to use Flex 4 Final instead of Flex 4 Beta 2, which is what the first printing of the book uses.</p>
<p>However, in order to be totally transparent, here is every diff in the Hello! Flex 4 source code from Flex 4 Beta 2 and Flex 4 Final.</p>
<p>As you can see, almost all the changes are just the halo to mx namespace change I mentioned earlier.  (If this change hadn&#8217;t been made, the book would have been almost completely unchanged.)</p>
<p>(This will hopefully be the most boring blog post I&#8217;ll ever write!)</p>
<h2>Chapter 1</h2>
<h3>Session 01</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session01/src code_Flex4Final/session01/src<br />
diff -r code_Flex4Beta2/session01/src/Hello.mxml code_Flex4Final/session01/src/Hello.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
</code></p>
<h3>Session 02</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session02/src code_Flex4Final/session02/src<br />
diff -r code_Flex4Beta2/session02/src/Tester.mxml code_Flex4Final/session02/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 03</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session03/src code_Flex4Final/session03/src<br />
diff -r code_Flex4Beta2/session03/src/BindingToModel.mxml code_Flex4Final/session03/src/BindingToModel.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
diff -r code_Flex4Beta2/session03/src/OneWay.mxml code_Flex4Final/session03/src/OneWay.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
diff -r code_Flex4Beta2/session03/src/TwoWay.mxml code_Flex4Final/session03/src/TwoWay.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
diff -r code_Flex4Beta2/session03/src/TwoWayBindingClobbersModel.mxml code_Flex4Final/session03/src/TwoWayBindingClobbersModel.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
</code></p>
<h3>Session 04</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session04/src code_Flex4Final/session04/src<br />
diff -r code_Flex4Beta2/session04/src/TodoList.mxml code_Flex4Final/session04/src/TodoList.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
</code></p>
<h3>Session 05</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session05/src code_Flex4Final/session05/src<br />
diff -r code_Flex4Beta2/session05/src/TodoList.mxml code_Flex4Final/session05/src/TodoList.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
</code></p>
<h2>Chapter 2</h2>
<h3>Session 06</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session06/src code_Flex4Final/session06/src<br />
diff -r code_Flex4Beta2/session06/src/Tester.mxml code_Flex4Final/session06/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 07</h3>
<p><code><br />
diff -r code_Flex4Beta2/session07/src/Tester.mxml code_Flex4Final/session07/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 08</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session08/src code_Flex4Final/session08/src<br />
diff -r code_Flex4Beta2/session08/src/Tester.mxml code_Flex4Final/session08/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 09</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session09/src code_Flex4Final/session09/src<br />
diff -r code_Flex4Beta2/session09/src/Tester.mxml code_Flex4Final/session09/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 10</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session10/src code_Flex4Final/session10/src<br />
diff -r code_Flex4Beta2/session10/src/Tester.mxml code_Flex4Final/session10/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h2>Chapter 3</h2>
<h3>Session 11</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session11/src code_Flex4Final/session11/src<br />
diff -r code_Flex4Beta2/session11/src/Tester.mxml code_Flex4Final/session11/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 12</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session12/src code_Flex4Final/session12/src<br />
diff -r code_Flex4Beta2/session12/src/Tester.mxml code_Flex4Final/session12/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
30c30<br />
<         liveDragging="true" height="50" value="@{_bread}"/><br />
&#8212;<br />
>         liveDragging=&#8221;true&#8221; height=&#8221;50&#8243; value=&#8221;{_bread}&#8221;/><br />
49c49<br />
<       <s:NumericStepper id="numericStepper" value="@{_bread}"<br />
---<br />
>       <s:NumericStepper id="numericStepper" value="{_bread}"<br />
51c51<br />
<       <s:Spinner id="spinner" value="@{_bread}"<br />
---<br />
>       <s:Spinner id="spinner" value="{_bread}"<br />
</code></p>
<h3>Session 13</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session13/src code_Flex4Final/session13/src<br />
diff -r code_Flex4Beta2/session13/src/Tester.mxml code_Flex4Final/session13/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 14</h3>
<h4>Session 14a:</h4>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session14/session14a/src/ code_Flex4Final/session14/session14a/src/<br />
diff -r code_Flex4Beta2/session14/session14a/src/OnlyConnect.mxml code_Flex4Final/session14/session14a/src/OnlyConnect.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/session14/session14a/src/components/BoardDisplay.mxml code_Flex4Final/session14/session14a/src/components/BoardDisplay.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h4>Session 14b:</h4>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session14/session14b/src/ code_Flex4Final/session14/session14b/src/<br />
diff -r code_Flex4Beta2/session14/session14b/src/OnlyConnect.mxml code_Flex4Final/session14/session14b/src/OnlyConnect.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/session14/session14b/src/components/BoardDisplay.mxml code_Flex4Final/session14/session14b/src/components/BoardDisplay.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h4>Session 14c:</h4>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session14/session14c/src/ code_Flex4Final/session14/session14c/src/<br />
diff -r code_Flex4Beta2/session14/session14c/src/OnlyConnect.mxml code_Flex4Final/session14/session14c/src/OnlyConnect.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
8c8<br />
<   initialize="board.newGame()"><br />
&#8212;<br />
>   initialize=&#8221;boardDisplay.newGame()&#8221;><br />
15c15<br />
<           board.playerOneFill : board.playerTwoFill;<br />
---<br />
> 			boardDisplay.playerOneFill : boardDisplay.playerTwoFill;<br />
28c28<br />
<       <s:Button label="New Game" click="board.newGame()"/><br />
&#8212;<br />
>       <s:Button label="New Game" click="boardDisplay.newGame()"/><br />
30c30<br />
<         fill="{getColor(board.playerOneTurn)}"/><br />
&#8212;<br />
>         fill=&#8221;{getColor(boardDisplay.board.playerOneTurn)}&#8221;/><br />
32c32<br />
<         text="Player {board.playerOneTurn ? '1' : '2'} Turn"/><br />
&#8212;<br />
>         text=&#8221;Player {boardDisplay.board.playerOneTurn ? &#8216;1&#8242; : &#8216;2&#8242;} Turn&#8221;/><br />
34c34<br />
<     <comp:BoardDisplay id="board"/><br />
&#8212;<br />
>     <comp:BoardDisplay id="boardDisplay"/><br />
diff -r code_Flex4Beta2/session14/session14c/src/components/BoardDisplay.mxml code_Flex4Final/session14/session14c/src/components/BoardDisplay.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
26c26<br />
<   private var _board:Board;<br />
---<br />
>   public var board:Board;<br />
32c32<br />
<     _board.newGame();<br />
---<br />
>     board.newGame();<br />
36,39d35<br />
<   public function get playerOneTurn():Boolean {<br />
<     return _board.playerOneTurn;<br />
<   }<br />
<<br />
41,42c37,38<br />
<     _board = new Board();<br />
<     _board.newGame();<br />
---<br />
>     board = new Board();<br />
>     board.newGame();<br />
62c58<br />
<     switch (_board.getData(row, col)) {<br />
---<br />
>     switch (board.getData(row, col)) {<br />
74c70<br />
<     var row:int = _board.playerMove(column);<br />
---<br />
>     var row:int = board.playerMove(column);<br />
77c73<br />
<       var winner:int = _board.checkWinner();<br />
---<br />
>       var winner:int = board.checkWinner();<br />
~/hf4[master]$<br />
</code></p>
<h3>Session 15</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session15/src code_Flex4Final/session15/src<br />
diff -r code_Flex4Beta2/session15/src/Tester.mxml code_Flex4Final/session15/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h2>Chapter 4</h2>
<h3>Session 16</h3>
<h4>Session 16a:</h4>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session16/session16a/src/ code_Flex4Final/session16/session16a/src/<br />
diff -r code_Flex4Beta2/session16/session16a/src/Tester.mxml code_Flex4Final/session16/session16a/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h4>Session 16b:</h4>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session16/session16b/src/ code_Flex4Final/session16/session16b/src/<br />
diff -r code_Flex4Beta2/session16/session16b/src/Tester.mxml code_Flex4Final/session16/session16b/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h4>Session 16c:</h4>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session16/session16c/src/ code_Flex4Final/session16/session16c/src/<br />
diff -r code_Flex4Beta2/session16/session16c/src/Tester.mxml code_Flex4Final/session16/session16c/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 17</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session17/src code_Flex4Final/session17/src<br />
diff -r code_Flex4Beta2/session17/src/Tester.mxml code_Flex4Final/session17/src/Tester.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/session17/src/components/HPanel.mxml code_Flex4Final/session17/src/components/HPanel.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 18</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session18/src code_Flex4Final/session18/src<br />
diff -r code_Flex4Beta2/session18/src/Tester.mxml code_Flex4Final/session18/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 19</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session19/src code_Flex4Final/session19/src<br />
diff -r code_Flex4Beta2/session19/src/Tester.mxml code_Flex4Final/session19/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
10c10<br />
<   @namespace mx "library://ns.adobe.com/flex/halo";<br />
---<br />
>   @namespace mx &#8220;library://ns.adobe.com/flex/mx&#8221;;<br />
diff -r code_Flex4Beta2/session19/src/styles.css code_Flex4Final/session19/src/styles.css<br />
2c2<br />
< @namespace mx "library://ns.adobe.com/flex/halo";<br />
---<br />
> @namespace mx &#8220;library://ns.adobe.com/flex/mx&#8221;;<br />
</code></p>
<h3>Session 20</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session20/src code_Flex4Final/session20/src<br />
diff -r code_Flex4Beta2/session20/src/Tester.mxml code_Flex4Final/session20/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 21</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session21/src code_Flex4Final/session21/src<br />
diff -r code_Flex4Beta2/session21/src/Tester.mxml code_Flex4Final/session21/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h2>Chapter 5</h2>
<h3>Session 22</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session22/src code_Flex4Final/session22/src<br />
diff -r code_Flex4Beta2/session22/src/Tester.mxml code_Flex4Final/session22/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 23</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session23/src code_Flex4Final/session23/src<br />
diff -r code_Flex4Beta2/session23/src/Tester.mxml code_Flex4Final/session23/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 24</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session24/src code_Flex4Final/session24/src<br />
diff -r code_Flex4Beta2/session24/src/TestTitleWindow.mxml code_Flex4Final/session24/src/TestTitleWindow.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/session24/src/Tester.mxml code_Flex4Final/session24/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h2>Chapter 6</h2>
<h3>Session 25</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session25/src code_Flex4Final/session25/src<br />
diff -r code_Flex4Beta2/session25/src/Tester.mxml code_Flex4Final/session25/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Session 26</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/session26/src code_Flex4Final/session26/src<br />
diff -r code_Flex4Beta2/session26/src/Tester.mxml code_Flex4Final/session26/src/Tester.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/session26/src/components/AddressForm.mxml code_Flex4Final/session26/src/components/AddressForm.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
</code></p>
<h3>Chapter 7</h3>
<p><code><br />
~/hf4[master]$ diff -r code_Flex4Beta2/ch07/src code_Flex4Final/ch07/src/<br />
diff -r code_Flex4Beta2/ch07/src/SocialStalkr.mxml code_Flex4Final/ch07/src/SocialStalkr.mxml<br />
5c5<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/ch07/src/com/socialstalkr/components/FollowingGroup.mxml code_Flex4Final/ch07/src/com/socialstalkr/components/FollowingGroup.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/ch07/src/com/socialstalkr/components/LoginPanel.mxml code_Flex4Final/ch07/src/com/socialstalkr/components/LoginPanel.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/ch07/src/com/socialstalkr/components/MainApp.mxml code_Flex4Final/ch07/src/com/socialstalkr/components/MainApp.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/ch07/src/com/socialstalkr/components/MapPanel.mxml code_Flex4Final/ch07/src/com/socialstalkr/components/MapPanel.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/ch07/src/com/socialstalkr/components/TwitterGroup.mxml code_Flex4Final/ch07/src/com/socialstalkr/components/TwitterGroup.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
diff -r code_Flex4Beta2/ch07/src/com/socialstalkr/components/UserListItemRenderer.mxml code_Flex4Final/ch07/src/com/socialstalkr/components/UserListItemRenderer.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"><br />
&#8212;<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;><br />
diff -r code_Flex4Beta2/ch07/src/com/socialstalkr/components/YouGroup.mxml code_Flex4Final/ch07/src/com/socialstalkr/components/YouGroup.mxml<br />
4c4<br />
<   xmlns:mx="library://ns.adobe.com/flex/halo"<br />
---<br />
>   xmlns:mx=&#8221;library://ns.adobe.com/flex/mx&#8221;<br />
~/hf4[master]$<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=214</wfw:commentRss>
		</item>
		<item>
		<title>Typesetting Error in Session 1 in Hello! Flex 4</title>
		<link>http://www.peterarmstrong.com/?p=197</link>
		<comments>http://www.peterarmstrong.com/?p=197#comments</comments>
		<pubDate>Mon, 05 Apr 2010 19:27:29 +0000</pubDate>
		<dc:creator>Peter Armstrong</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.peterarmstrong.com/?p=197</guid>
		<description><![CDATA[There is an error in Session 1 of Hello! Flex 4.  This error got introduced during typesetting.  I have been raked over the coals for this in a one-star review of the book here.
The short version is you need to change the code in Session 1 to this:

&#60;?xml version="1.0" encoding="utf-8"?>
&#60;s:Application
  xmlns:fx="http://ns.adobe.com/mxml/2009"
  [...]]]></description>
			<content:encoded><![CDATA[<p>There is an error in Session 1 of Hello! Flex 4.  This error got introduced during typesetting.  I have been raked over the coals for this in a one-star <a href="http://www.amazon.com/review/R39BM9YVC02EM7/ref=cm_cr_pr_cmt?ie=UTF8&#038;ASIN=1933988762">review of the book here</a>.</p>
<p>The short version is you need to change the code in Session 1 to this:</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;s:Application
  xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/<strong>mx</strong>">
  &lt;s:Label<strong> text</strong>="Hello! Flex 4"
    fontSize="128"/>
&lt;/s:Application>
</pre>
<p>For the long version, this is the reply that I posted to that review&#8230;</p>
<hr/>
<p>Hi Steven,</p>
<p>I&#8217;m Peter Armstrong, the author of <em>Hello! Flex 4</em>.</p>
<p>You are correct that on page 6 of the book, the text is:</p>
<pre>&lt;s:Label="Hello! Flex 4"
  fontSize="128"/></pre>
<p>This is obviously a bug. The corrected text should be:</p>
<pre>&lt;s:Label text="Hello! Flex 4"
  fontSize="128"/></pre>
<p>I am very sorry that I missed this error.</p>
<p>Now, there&#8217;s actually an interesting reason why this happened&#8230;</p>
<p>The initial completed manuscript of <em>Hello! Flex 4</em> was written against Flex 4 Beta 1. In Beta 1 of Flex 4, you did not write <code>s:Label</code>, you wrote <code>s:SimpleText</code>.</p>
<p>I just dug up my completed manuscript, and here&#8217;s what the code sample was:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?>
&lt;s:Application
  xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/halo">
  &lt;s:SimpleText text="Hello! Flex 4"
    fontSize="128"/>
&lt;/s:Application></pre>
<p>Note that it is correct. Besides pasting all the code in from the IDE into the manuscript, I also went the other way during the development editing process, pasting code from the manuscript back into Flash Builder. Everything worked.</p>
<p>Now, a few days before Hello! Flex 4 was going to press, Adobe delayed the ship date of Flex 4 from Q4 2009 to Q1 2010. They also released Beta 2 of Flex 4.</p>
<p>In Beta 2, Adobe changed s:SimpleText to s:Label, thus breaking the entire book!</p>
<p>Now, the book had already gone through all the editing and had been typeset. But, we obviously couldn&#8217;t ship the book like that. So, my instructions were to go through it and change all s:SimpleText to s:Label. This was done correctly everywhere in the book, except for in this one example in which case the text attribute got deleted.</p>
<p>Unfortunately, this happened to be the first example in the book!</p>
<p>I can assure you that I have compiled and run the code many times, during Flex 4 Beta 1, Beta 2 and (after the book was released) with Flex 4 Final.</p>
<p>So, to be clear, the full source code of this example (with Flex 4 Beta 2) should have been:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?>
&lt;s:Application
  xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/halo">
  &lt;s:Label text="Hello! Flex 4"
    fontSize="128"/>
&lt;/s:Application></pre>
<p>This is exactly what you say you needed to change the text to be. So, you&#8217;re completely correct.</p>
<p>However, if you had published that in a Flex 4 book you wrote, you would also be wrong!</p>
<p>See, there&#8217;s one more wrinkle&#8230; With Flex 4 Final, the full source code of this example should have been:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?>
&lt;s:Application
  xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/mx">
  &lt;s:Label text="Hello! Flex 4"
    fontSize="128"/>
&lt;/s:Application></pre>
<p>Spot the difference? The <code>library://ns.adobe.com/flex/halo</code> namespace got renamed to <code>library://ns.adobe.com/flex/mx</code>. This namespace change was made after Hello! Flex 4 went to press.</p>
<p>(This is my second book about Flex, and the joys of writing a technical book never get old!)</p>
<p>So, if you are using the final version of Flex 4 with the book examples, remember, always replace:</p>
<p><code>xmlns:mx="library://ns.adobe.com/flex/halo"</code></p>
<p>with </p>
<p><code>xmlns:mx="library://ns.adobe.com/flex/mx"</code></p>
<p>There are a couple of other minor changes, which are fully explained at the following blog post I made yesterday:<br />
http://www.peterarmstrong.com/?p=169</p>
<p>This post has a link to the updated source code which works with Flex 4 Final.</p>
<p>If you do give the book another chance, what I highly recommend doing is downloading the updated code and using that, instead of typing in the code from the book.</p>
<p>Thanks,<br />
Peter Armstrong</p>
]]></content:encoded>
			<wfw:commentRss>http://www.peterarmstrong.com/?feed=rss2&amp;p=197</wfw:commentRss>
		</item>
	</channel>
</rss>
