<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9077350032409035843</id><updated>2011-04-21T12:53:59.432-05:00</updated><category term='ruby'/><category term='education'/><category term='GWT'/><category term='tools'/><category term='java'/><category term='refactoring'/><category term='books'/><category term='indulgent'/><category term='apple'/><category term='programming'/><category term='perl'/><category term='wxpython'/><category term='editors'/><category term='links'/><category term='publishing'/><category term='sf'/><category term='meta'/><category term='iphone'/><category term='JRuby'/><category term='agile'/><category term='python'/><category term='rails'/><category term='tv'/><category term='pathfinder'/><category term='testing'/><category term='webapp'/><category term='IronPython'/><category term='jython'/><category term='fiction'/><category term='examples'/><title type='text'>10 Print "Hello"</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://10printhello.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>94</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7281827932579104984</id><published>2008-09-01T10:58:00.001-05:00</published><updated>2008-09-01T10:58:47.470-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Read these books</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;I'm granting myself amnesty for about six months of unreviewed books to mention a couple of recently read books.&lt;/p&gt;&lt;h3&gt;&lt;em&gt;Pirate Sun&lt;/em&gt;, Karl Schroeder&lt;/h3&gt;&lt;p&gt;I think that of all the authors I enjoy, Schroeder is the most criminally under-read. If you like SF, I tell you that Virga -- the background of &lt;em&gt;Pirate Sun&lt;/em&gt; and its two predecessors -- is the coolest SF construct since Ringworld. Schroeder could write novels in it for the next forty years and only scratch the surface of what's possible. And at that, I'm not sure that the three Virga books -- great as they are -- are his best. &lt;em&gt;Permanence&lt;/em&gt; is an exceptional space-opera type book, and &lt;em&gt;Lady of Mazes&lt;/em&gt; takes a background that by all rights should be nigh-incomprehensible and makes it clear, compelling, and fascinating.&lt;/p&gt;&lt;p&gt;Anyway, Virga is a 5000 mile sphere filled with air and intermittently lit by dozens of small artificial suns. There's not much metal, and electricity is somehow dampened. Most people live in towns that are basically the interior of cylinders that rotate to generate gravity.  Because it's not a vacuum, you can travel between towns by almost anything: winged bikes, jet cycles, wooden rocket ships. &lt;/p&gt;&lt;p&gt;&lt;em&gt;Pirate Sun&lt;/em&gt; is the third book in the series, and without getting into a jillion paragraphs of backstory, the main character is Chaison Fanning, a disgraced admiral hoping to get back to his tiny country to clear his name (I oversimplify, you understand). Along the way, he deals with war, a threat to the basic nature of Virga, not to mention the most amazing thunderstorm SF has ever produced (Hint: Zero-G = Large Raindrops).  &lt;/p&gt;&lt;p&gt;You know how sometimes a book will have two viewpoint characters who are trying to find each other but keep missing and that's really irritating? Schroeder does something interesting with that here -- he never shows the second viewpoint character. We know she's there from the previous books, plus a brief showing at the beginning. The bulk of the book, though, is all Chaison -- we can infer what other characters are up too somewhat. It's very effective, and not at all irritating.&lt;/p&gt;&lt;p&gt;On top of all that, there's a city on city battle seen that is jaw-dropping, and Schroeder casually drops a really neat idea in the background that we're clearly going to hear more of later in the series (please tell me there's a later in the series...). &lt;/p&gt;&lt;h3&gt;&lt;em&gt;Zoe's Tale&lt;/em&gt;, John Scalzi&lt;/h3&gt;&lt;p&gt;Scalzi, you're more likely to have heard of, since he's become a very popular writer, especially on the Internet.  &lt;em&gt;Zoe's Tale&lt;/em&gt; is the fourth book in the &lt;em&gt;Old Man's War&lt;/em&gt; trilogy. And I mean that more literally then you might think, since it covers nearly the same ground as &lt;em&gt;The Last Colony&lt;/em&gt;, only instead of being from John Perry's viewpoint, it's from his adopted daughter Zoe's (hence, you see, the name).&lt;/p&gt;&lt;p&gt;This works a lot better than you might expect, for a couple of reasons. First off, Zoe has a unique place in the &lt;em&gt;OMW&lt;/em&gt; universe, what with being a near godling to an alien race, and her perspective is interesting. Second, &lt;em&gt;Last Colony&lt;/em&gt; had a couple of obvious Zoe-sized gaps in the story that were worth exploring. Third, Scalzi is smart enough to tell a completely different story against the same plot background -- in this case how Zoe reconciles who she is with what she is.&lt;/p&gt;&lt;p&gt;Scalzi has said in a few places that he struggled a bit to find a plausible sixteen year old female voice. I'm not completely qualified to say whether he succeeded (it's enough for me to say the voice works perfectly well as the narrator of the story). But I will say there are spots in the story where Zoe's narration sounds much more like Scalzi-the-blogger than anything else he's written.&lt;/p&gt;&lt;p&gt;So, another great book from John Scalzi, and I hope he comes back to this universe a few years on to show the result of the actions of &lt;em&gt;Last Colony&lt;/em&gt; and &lt;em&gt;Zoe's Tale&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7281827932579104984?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7281827932579104984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7281827932579104984'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/09/read-these-books.html' title='Read these books'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6687538905383767646</id><published>2008-08-26T23:39:00.001-05:00</published><updated>2008-08-26T23:39:15.158-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><title type='text'>Middleman!</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;It's been a while since I lost my geek heart to a TV show that was so obviously doomed. Which brings us to &lt;em&gt;The Middleman&lt;/em&gt;, on ABC Family of all places.&lt;/p&gt;&lt;p&gt;I had been avoiding this on the grounds that it was just a silly-looking summer series and also the whole obviously doomed thing but a series of positive mentions on &lt;a href="http://www.io9.com"&gt;io9&lt;/a&gt; and other Web sites (including a plug by Justine Larbalestier) led me to try the thing once. &lt;/p&gt;&lt;p&gt;I was hooked within the first five minutes, by about three very clever bits. That kept me going, but I was very surprised after a few episodes by how much I came to like the characters.&lt;/p&gt;&lt;p&gt;Five things:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;It's unabashedly geeky. I initially described the show as "Men In Black, if the characters had all seen Men In Black." It's awash in SF/Comic references, many of which are placed in the background to reward those who are paying attention.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It's unabashedly heroic. The Middleman is the kind of square-jawed throwback that snarky shows usually make fun of. Not here. Somehow the show manages to make the hero retro and cool, without really making him just retro-cool. If that makes sense, which it probably doesn't.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It's unabashedly silly. Plots to date have included fish loving zombies that shout "TROUUUUT", vampire puppets, and a grunge match between kung-fu masters and masked Mexican wrestlers. It's the goofiest show this side of &lt;em&gt;Pushing Daisies&lt;/em&gt;. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The heroes have fun. The series creator said he wanted to get past the current idea that comic-book-esque heroes need to be dour and wear their responsibilities like a 2000 pound weight. In this show, the Middleman pulls a rare reverse Peter Parker, telling his sidekick Wendy that if she falls in love and doesn't follow it, that's on her, she can't blame it on the job.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I also really like that, in a show that features a character who uses a "NDBS Detector" (Not Detectable By Science), they've also made Wendy's best friend a Carl Sagan reading skeptic (among other things).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So, go watch the one remaining episode next week. And then say good bye. Let's just say the ratings were so low that ABC Family won't even release what the ratings were. Plus they cut the series order to 12 episodes from 13. The outlook isn't good. But the whole season is on iTunes...&lt;/p&gt;&lt;p&gt;Parenthetically, if you can believe the numbers that the series creator threw out in an interview, the show, which is ridiculously low-budget, still costs roughly 1.5 million dollars an episode. (He said ABC Family spent 17 million on the series as a whole.) That's staggering.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6687538905383767646?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6687538905383767646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6687538905383767646'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/08/middleman.html' title='Middleman!'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4727132032076284344</id><published>2008-08-02T23:05:00.001-05:00</published><updated>2008-08-02T23:05:40.705-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><title type='text'>Things I Need To Write About, Part Two: The Dark Knight</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;I have about seventy-million little things to say about this movie. I will try, and probably fail, to keep this brief.&lt;/p&gt;&lt;p&gt;Spoilers definitely ahead:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The movie is really, really good. It's not flawless, but it covers it's flaws through a very strong sense of what Batman means and doesn't mean as a character, and also because it's very intense. The movie spends most of the time feeling like its on the very edge of chaos and conflagration -- it's probably the first time that I've genuinely felt that the hero wouldn't "win" in superhero movie.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Heath Ledger is getting a lot of praise, and deservedly so, he's outstanding. I'm also interested in how the movie manages to capture the icon of The Joker while using almost nothing from the canonical comic version. (Early on, Gordon or somebody calls The Joker just a guy in makeup and I thought, okay, nobody knows that's what he really looks like. But in this movie, he is just a guy in makeup.)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The comic version is, at least recently, usually shown as already the head of a large empire, and also usually as having a plan. In Alan Moore's &lt;em&gt;Killing Joke&lt;/em&gt;, which is probably one of the main comic book influences on this movie, The Joker plans to destroy Gordon by giving him the worst day of his life. In this movie, the idea to destroy Harvey Dent is more of a target of opportunity. The movie Joker doesn't really plan -- he's the anti-plan, just chaos. And the movie doesn't flinch at showing how scary that can be with very little effort.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Often, superhero movie series come to feel like the hero's greatest hits album -- a series of unrelated stories. One thing &lt;em&gt;Dark Knight&lt;/em&gt; is very smart about is exactly how The Joker arises in direct response to Batman disrupting Gotham's mob scene in the first movie.  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I really never thought I'd see a Batman movie go all the way to, "Is Gotham really better off with Batman there". It's a common feature of superhero sequels to have the hero struggle with giving up the fight. But in &lt;em&gt;Superman 2&lt;/em&gt; and &lt;em&gt;Spiderman 2&lt;/em&gt;, the hero is trying to decide whether they can be personally fulfilled while being the hero. Batman is beyond that, in &lt;em&gt;Dark Knight&lt;/em&gt; he's trying to decide if he's done any good at all.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Which brings us to Harvey Dent and Two-Face. Who, interestingly, is much closer to the comic version (although in the comic version, the Dent defaces the coin himself after he's injured -- actually, the movie version is better...) I really like how they kept contrasting what Batman could and couldn't do in the shadows with what Dent, as DA could and couldn't do in the public eye, and how Batman was almost eager to have Dent be Gotham's by-the-book hero.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The sequence where Rachel dies was a bit odd. My read on it was that the Joker didn't really care which one Batman tried to save, he just wanted to make sure that he'd fail no matter what. Still, it seemed out of character that Bats would go after Rachel.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The movie's use of the Chicago locations is outstanding. (Frankly, everytime I'm on Lower Wacker, I always kind of feel like I'm in a creepy action movie). Despite the fact that Gotham is nominally fictional, the locations ground it in a way that say, the Spidey movies don't quite get even though they use New York as itself. Or maybe that's just because I'm more familiar with the Chicago streets used.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;One question that I keep wondering about is whether these two movies would have been successful 20 years ago in place of the Burton movies. Assuming, of course, that the studio in 1989 would have let that movie be made. I'm not sure. I know the fan base would have still loved it.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Also. Is it the best superhero movie ever? Right now, I make the top four, in no particular order, as &lt;em&gt;Spidey 2&lt;/em&gt;, &lt;em&gt;Dark Knight&lt;/em&gt;, &lt;em&gt;Iron Man&lt;/em&gt;, and &lt;em&gt;The Incredibles&lt;/em&gt;. There's another story about how the movie that would have been considered as the best for years and years (&lt;em&gt;Superman 2&lt;/em&gt;) has had it's critical stock bottom out recently. I'm not sure on the order of my top four, though..&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I'll probably think of a dozen things after I post this, but that's all for now.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4727132032076284344?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4727132032076284344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4727132032076284344'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/08/things-i-need-to-write-about-part-two.html' title='Things I Need To Write About, Part Two: The Dark Knight'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7109501404076119312</id><published>2008-07-31T23:35:00.001-05:00</published><updated>2008-07-31T23:35:15.407-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><title type='text'>Thing I Need To Write About, Part 1: Dr. Horrible</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;It seems like I'm forever mentioning that I'm not posting here as much as I'd like. I said a while back that between here and &lt;a href="http://www.pathf.com/blog"&gt;the Pathfinder blog&lt;/a&gt; I'd be posting two to three times a week. Turns out that's actually been more or less true, just that all of it has been on the Pathfinder side.&lt;/p&gt;&lt;p&gt;I do miss it here, and there are a few big genre/geek things in the last couple weeks that I really wanted to write about here, where nobody can interrupt me. &lt;/p&gt;&lt;p&gt;First up: &lt;a href="http://www.drhorrible.com"&gt;Dr. Horrible's Sing-Along Blog&lt;/a&gt;. I have to admit that I was ridiculously over-psyched about this project from the beginning. Joss Whedon, musical, hapless supervillain, Neil Patrick Harris, Nathan Fillion. They didn't just have me at "hello", they had me at "h". Honestly, I was worried that no actual project could live up to my expectations.&lt;/p&gt;&lt;p&gt;Well, a week later, having basically memorized the songs, I'm pleased to say that it's still fantastic. &lt;/p&gt;&lt;p&gt;I want to talk about this as a business model first, since it lets me put spoilers at the bottom.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;There's no question but that this is a huge test of whether online-only content is financially viable. If Joss Whedon can't turn a buck on this, given his huge existing support and the amount of buzz this show has gotten, then it's going to be very hard for other established creators to justify web-content. As much as I don't like judging movies or TV by their bottom line, in this case, if it's a gold rush, then we're going to see a lot more of it.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;That said, it's not completely clear this has much implication for a more typical web video project, like Felicia Day's &lt;em&gt;The Guild&lt;/em&gt;, which would have a much smaller budget and much less entrenched fan base. I think the main implication is "get it done and get it out there".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A back-of-the envelope guess suggests they haven't made a profit yet (or not much of one), but almost certainly will shortly. Hard numbers are scarce, two that have been released publicly: Whedon said the budget was "in the low six figures" (and that may be without paying the cast and crew), and that there were about 2 million individual hits on the web site for individual episodes.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;So.. that's probably around 500,000 people who streamed all three episodes. No idea how many people have bought it on iTunes yet, but I'd be surprised if it was more than 50,000 and very surprised if it was more than 100,000. Again, no clue what their deal on iTunes is, but I'd be surprised if they got more than about $2 per download of the episodes in a bundle. Add that up, and they are break-even at this point at best.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;But there are more revenue streams. I don't know what their arrangement with Hulu was for streaming. There's merchandise. There will be a soundtrack, and there will be a DVD release. And people are still buying it on iTunes. So in the end, I expect it will more than financially justify everybody's time, while not exactly being a Scrooge McDuck level of money pile.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That's more than enough on financial stuff, let's talk about it as a show. Spoilers ahead, I guess.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;All three of the main players are great, but Neil Patrick Harris takes it to an entire other level. Really, there's very little in the entertainment world that I've enjoyed more in the last few years than watching Harris methodically take it over. This part is a perfect showcase for everything he does well -- it's dark, it's light, it's funny, it's serious, and he sings amazingly.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I'm not really qualified to judge the music, but it's been stuck in my head for the last couple of weeks, so I'm going to confidently say that it's pretty catchy. Some great lyric work here. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;After some back and forth in my head, I've come to accept the ending, even though it's a bit depressing. Here's why: For about 30 minutes of show, Whedon is deliberately ambiguous about whether Billy Horrible (not his real name) is actually evil, or just playing around. He calls himself Dr. Horrible, but he's kind of a buffoon (at first), he kind of is creepily stalking Penny, but Captain Hammer is an even bigger jerk, he wants to join the Evil League of Evil, but is clearly squeamish about killing...&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;What works about the ending is that it preserves the ambiguity in the most intense possible way. Horrible is willing to disrupt the event, but flinches at the moment when he could kill Captain Hammer. He's willing to reap the benefits of being perceived as a killer, but is obviously -- given the last line -- somewhat ambivalent about it. It'll be interesting to see where the character goes if and when everybody gets around to another shoot.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Hmm... that turned out longer than expected, no wonder I'm not posting here as often as I'd like.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7109501404076119312?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7109501404076119312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7109501404076119312'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/07/thing-i-need-to-write-about-part-1-dr.html' title='Thing I Need To Write About, Part 1: Dr. Horrible'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7139133484934598662</id><published>2008-06-23T23:17:00.001-05:00</published><updated>2008-06-23T23:17:00.763-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indulgent'/><title type='text'>The Not Too Distant Future</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;blockquote&gt;If you see RiffTrax at a party, say "Hi" from us.&lt;/blockquote&gt;&lt;p&gt;That's what Joel Hodgson said about the relationship between the two different groups of Mystery Science Theater 3000 alumni roving around the country skewering bad and pretentious movies. Hodgson's group, is &lt;a href="http://www.cinematictitanic.com"&gt;Cinematic Titanic&lt;/a&gt;, while Mike Nelson's group is called &lt;a href="http://www.rifftrax.com"&gt;RiffTrax&lt;/a&gt;.  The two groups  have a different approach to making fun of movies, although the personnel differences seem to be more a matter of geography then any long-simmering feud.&lt;/p&gt;&lt;p&gt;I finally got to indulge my long-dormant inner MST fan, and watched an episode from both groups.&lt;/p&gt;&lt;p&gt;RiffTrax, which has been around a bit longer, primarily produces MP3 files which you listen too while you watch a separate DVD. Since they don't have to clear rights, this allows RiffTrax to produce episodes on actual real movies that you have heard of. They also do some video + audio releases of public domain shorts and films, although even in those videos, the RiffTrax performers remain offscreen.&lt;/p&gt;&lt;p&gt;Cinematic Titanic, which has done two episodes to date, uses an updated form of the MST shadowvision motif, placing the five performers in tiers along the sides of the film. CT releases their videos for DVD or download. There's none of the character kind of stuff from MST, although the CT performers periodically pause the action for a separate bit or to interact with the film some.&lt;/p&gt;&lt;p&gt;The CT download (which is $9.99) is an entire VIDEO_TS directory of the DVD, a 3GB download. Plus the special download manager you need to used repeatedly crashed, though I was able to burn the DVD using other software. On my second try. That was frustrating. On the plus side, I now have it on a DVD, and I can make it portable and take it with me if I want. &lt;/p&gt;&lt;p&gt;RiffTrax is a much smaller MP3 file. To watch on a conventional TV, you play the DVD and also play the MP3 file on some audio player. A short introduction on the file helps you get the two synchronized. Periodically through the film, a robotic voice will repeat a line of dialog to help you keep the DVD and MP3 in synch. That's clever. It'd be more clever if the file had an AAC option with chapters or if the chapters matched the DVD chapters. Still, I was mostly able to keep the two in synch with a manageable amount of irritation. (If you want to watch the DVD on your computer, there are some software options that will handle DVD and audio file together).&lt;/p&gt;&lt;p&gt;As for the quality of the material, I enjoyed both of them quite a bit. The RiffTrax I sampled was &lt;em&gt;Willy Wonka&lt;/em&gt;, with Mike Nelson and guest riffer Neal Patrick Harris. Excellent choice of movie and they had fun with it. (It's just not true that a movie has to be bad to be MST-able. It just has to be pretentious and weird.) &lt;/p&gt;&lt;p&gt;My Cinematic Titanic experience was their first film &lt;em&gt;The Oozing Skull&lt;/em&gt;, which would have made for a very good MST episode back in the day. CT is doing something a little bit harder, at least from a strictly production standpoint, and I think that some further work on managing the five performers and interacting with the movie will improve their outings a lot. Still, I really liked &lt;em&gt;Oozing Skull&lt;/em&gt;, laughed out loud, and would recommend it to friends. I didn't quite realize how much I had missed Joel Hodgson's distinct voice and timing until I heard him. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7139133484934598662?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7139133484934598662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7139133484934598662'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/06/not-too-distant-future.html' title='The Not Too Distant Future'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-5257400584047248722</id><published>2008-06-04T16:29:00.001-05:00</published><updated>2008-06-04T16:29:44.562-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Ruby on Rails article</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Just a quick mention that &lt;a href="http://www-128.ibm.com/developerworks/opensource/library/os-eclipse-iphoneruby1/"&gt;part 1 of my article series on using Rails to write iPhone apps&lt;/a&gt; is online at IBM Developerworks.&lt;/p&gt;&lt;p&gt;Parts 2 and 3 will be published sometime in the rather near future.&lt;/p&gt;&lt;p&gt;In other notes, Pathfinder has updated the company blog URL to &lt;a href="http://www.pathf.com/blogs"&gt;http://www.pathf.com/blogs&lt;/a&gt;. Individual authors now have unique pages, I'm &lt;a href="http://www.pathf.com/blogs/noel-rappin"&gt;http://www.pathf.com/blogs/noel rappin&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Recent pieces there include &lt;a href="http://www.pathf.com/blogs/2008/05/welcome-to-railsconf/"&gt;a quick welcome to RailsConf&lt;/a&gt;, and a two-part article on HTML and code markup in Rails, available &lt;a href="http://www.pathf.com/blogs/2008/05/down-with-html/"&gt;here&lt;/a&gt; and &lt;a href="http://www.pathf.com/blogs/2008/05/html-code-marku/"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-5257400584047248722?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5257400584047248722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5257400584047248722'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/06/ruby-on-rails-article.html' title='Ruby on Rails article'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1160309153655111291</id><published>2008-05-23T00:04:00.002-05:00</published><updated>2008-05-23T08:27:31.550-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='indulgent'/><title type='text'>Notes and Notes</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;A couple of recent life, the universe, and everything notes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;I realize I've been away from here for most of the last couple of weeks -- a side project has been eating up a lot of time. I should be done with in next week, and back to posting here more regularly. I know, I always &lt;em&gt;say&lt;/em&gt; that. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I'll be at RailsConf 08 later this month, and I'll probably have some number of copies of &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;Professional Ruby on Rails&lt;/a&gt; to do something promotional with, but I haven't exactly decided what. If you are going, I hope to see you there.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The &lt;a href="http://github.com/noelrappin/rails-iui/tree/master"&gt;rails_iui&lt;/a&gt; plugin was mentioned on the &lt;a href="http://www.railsenvy.com/podcast"&gt;Rails Envy Podcast&lt;/a&gt; -- thanks to Gregg for the mention. There are now just over 35 people following the project on GitHub. I do plan to add more features over the coming weeks.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On a related note, I've turned in a 3-part article for IBM DeveloperWorks about iPhone development with Ruby on Rails. No idea when it'll show up, though.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1160309153655111291?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1160309153655111291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1160309153655111291'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/05/notes-and-notes.html' title='Notes and Notes'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4367950013481792385</id><published>2008-05-05T13:28:00.001-05:00</published><updated>2008-05-05T13:28:30.286-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Rails Development for iPhone with rails_iui</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;&lt;img src="http://blogs.pathf.com/agileajax//iphone_sim.jpg" alt="iphone_sim.jpg" border="0" width="200" height="370" align="left" style="margin: 0px 5px 5px 0px" /&gt;&lt;/p&gt;&lt;p&gt;I've been doing some web development for iPhone and Mobile Safari lately, not least because of a series of articles that will be showing up in IBM DeveloperWorks soon.&lt;/p&gt;&lt;p&gt;I was using the &lt;a href="http://code.google.com/p/iui/"&gt;iUI toolkit&lt;/a&gt;, which contains a number of CSS styles and JavaScript event handlers to make iPhone Web apps look and feel somewhat like native iPhone applications. As I was working with iUI, I realized I was building up a library, so I converted everything to a Rails plugin: &lt;a href="http://github.com/noelrappin/rails-iui/tree/master"&gt;rails_iui&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Get the plugin from github: git://github.com/noelrappin/rails-iui.git&lt;/p&gt;&lt;p&gt;Right now the plugin is primarily interested in doing a few things:&lt;/p&gt;&lt;p&gt;It contains a rake task to download iUI, move it's files to the Rails public directories, and change the CSS image URL's accordingly.&lt;/p&gt;&lt;p&gt;There's a controller class method &lt;code&gt;acts_as_iphone_controller&lt;/code&gt;, calling that sets up a before filter that captures the Mobile Safari user agent string and sets the request format to &lt;code&gt;iphone&lt;/code&gt; for use in &lt;code&gt;respond_to&lt;/code&gt; blocks. For testing purposes you can call the method as &lt;code&gt;acts_as_iphone_controller(true)&lt;/code&gt;, and all calls will be treated as iPhone requests.&lt;/p&gt;&lt;p&gt;There is a module of helper methods that are wrapper methods or combinations of iUI CSS classes. Included are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;A method for creating the iPhone toolbar at the top of the view.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Methods for creating the iPhone list structures from a list of elements that know their associated URLs, including a grouped list in the style of the iPod application&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Rounded rectangle classes&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A form helper for the iPhone toggle button, as seen in the settings page.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A method to specify an Ajax callback when the phone changes orientation&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The short term goals for the project are to tighten the code a bit and improve documentation and testing. Longer term goals are to augment iUI's JavaScript handlers with something a bit friendlier with Rails, particularly in handling history and back behavior.&lt;/p&gt;&lt;p&gt;So take it for a spin, let me know what you think. Hope you find it useful.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Please check out my book, &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;Professional Ruby on Rails&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4367950013481792385?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4367950013481792385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4367950013481792385'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/05/rails-development-for-iphone-with.html' title='Rails Development for iPhone with rails_iui'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6743918988194696175</id><published>2008-04-24T23:50:00.001-05:00</published><updated>2008-04-24T23:50:30.277-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><title type='text'>Bind is actually rather an understatement...</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;h4&gt;&lt;em&gt;Battlestar Galactica&lt;/em&gt; 403 (or 405) "Ties that Bind"&lt;/h4&gt;&lt;p&gt;That was dark even by the really, really high standards this show has set for being dark and unsettling.  It was an unrelenting parade of deeply screwed up people in torment, and the relationships that torment them. Naturally, I loved it, but if it wasn't so well written and acted, it'd be insufferably gloomy.&lt;/p&gt;&lt;p&gt;Bullet points -- if you haven't seen it, and plan to, look away.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The directing in this show was very overt, a lot of very artistic effects -- Starbuck only being shown from the back, a lot of blurred backgrounds and voice in Cally's point-of-view shots, the rotating star design motif. Most of it worked -- I thought that keeping us from seeing Starbuck's face was very effective. I could have done without the kind of druggy shots of the kid's mobile or whatever the heck that was.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I was spoiled on Cally's death, but the spoiler note implied it was a suicide, so I was surprised by both the addition of the baby in the scene (which made it about 100 times darker), and by Tory's involvement. I guess we'll find out next week whether Tory told Chief what she did.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I realize this is an odd place to make a stand on plausibility but... let me get this straight. Kara's crew has her, presumably pretty widely known in the fleet even before she died and came back; Helo, notorious as "the guy who married the toaster", plus he ran the refugees for a while, and he was Galactica's XO; and Anders, world famous athlete. All three of these people can just disappear for three weeks without anybody noticing?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;This is true: at the beginning of the episode I was thinking, hmm... on a spaceship it's never warm enough for people to get uncomfortable and sweaty. Then they cut to the Starbuck ship, which made &lt;em&gt;Cool Hand Luke&lt;/em&gt; look like &lt;em&gt;Ice Age&lt;/em&gt; (&lt;em&gt;Cool Hand Luke&lt;/em&gt; = sweatiest movie ever in the pilot for &lt;em&gt;Cheers&lt;/em&gt;... so it's a joke. Get it?).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Haven't even covered: They made clear some things about Cally that were almost subliminal, about how she feels about Chief and all... thought that was nice to see. Also, Lee remains the easiest person to manipulate in the entire history of the Galaxy. Presumably Zarek nominated him to the council so he could always have one person he could con into doing goofy things.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6743918988194696175?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6743918988194696175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6743918988194696175'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/bind-is-actually-rather-understatement.html' title='Bind is actually rather an understatement...'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1867238265015077197</id><published>2008-04-23T21:01:00.001-05:00</published><updated>2008-04-23T21:01:29.843-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Quick Program Notes</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;A couple of updates on book and article news...&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;It looks like the screencast/video thing is going to happen, thanks to Jim Minatel. The main constraint is that they'd like the videos to be about five minutes long. I think the first one will be setting up a Rails project in Subversion (chapter 2 of the book, essentially), and I'd do a remix of that chapter using Git if there's interest. Wiley would like several of these, so I'm open to any topic ideas.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;At one point, I think I mentioned here that a .pdf version of the book would be available about six weeks after initial launch. Obviously that hasn't happened yet, and I'm not sure when that might come together. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I'm going to have another series up at IBM Developerworks sometime in the relatively near future on developing iPhone web applications in Rails. More on that as it gets closer.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I'll be attending (but not, alas, presenting at) RailsConf this year in Portland. Since it's an O'Reilly run conference, there won't be an official Wiley presence, but I'm hoping to have some book-related activity there.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1867238265015077197?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1867238265015077197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1867238265015077197'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/quick-programming-notes.html' title='Quick Program Notes'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2900212474980306664</id><published>2008-04-21T10:24:00.001-05:00</published><updated>2008-04-21T10:24:55.590-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Two Parter on Hide And Seek</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Two articles on the Pathfinder blog on adding show and hide toggles to a Rails application:&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/04/hide-and-go-see.html"&gt;http://blogs.pathf.com/agileajax/2008/04/hide-and-go-see.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/04/hide-seek-and-s.html"&gt;http://blogs.pathf.com/agileajax/2008/04/hide-seek-and-s.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2900212474980306664?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2900212474980306664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2900212474980306664'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/two-parter-on-hide-and-seek.html' title='Two Parter on Hide And Seek'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8081540670476061340</id><published>2008-04-20T13:36:00.001-05:00</published><updated>2008-04-20T13:36:11.306-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>You Say Tomato, I Say To-Mato</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;In the last week, I've had two separate editors at two separate companies make a bulk change in something I was working on. Specifically, they changed "plugin" to "plug-in". This is driving me a little bit crazy. Which is right? Should I care?&lt;/p&gt;&lt;p&gt;Quick research, designed to shore up my point of view...&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Plugin"&gt;Wikipdia&lt;/a&gt; has it as "plugin", with "plug-in" as an alternate. &lt;a href="http://dictionary.reference.com/browse/plugin"&gt;Dictionary.com&lt;/a&gt; has it as "plug-in", although that's clearly an antiquated reference based on the definition ("capable of or designed for being connected to an electrical power source by plugging in or inserting"). Presumably this is where the editors are getting their style guides. The &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;&lt;em&gt;Pro Rails&lt;/em&gt;&lt;/a&gt; editors let me keep it as "plugin" -- I don't remember that being an issue.&lt;/p&gt;&lt;p&gt;More importantly, "plugin" is 100% preferred in the Rails community, I've never seen it go the other way. See &lt;a href="http://www.agilewebdevelopment.com/plugins"&gt;here&lt;/a&gt;, &lt;a href="http://wiki.rubyonrails.org/rails/pages/Plugins"&gt;here&lt;/a&gt;, or &lt;a href="http://nubyonrails.com/articles/the-complete-guide-to-rails-plugins-part-i"&gt;here&lt;/a&gt;. This is also mostly true in the &lt;a href="http://www.eclipseplugincentral.com/"&gt;Eclipse community&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Am I putting too much effort into this argument? Does this make any difference to anybody, or am I just crazy? To me, "plug-in" looks old timey and weird, like "base ball" or "e-mail", or something &lt;a href="http://areasofmyexpertise.blogspot.com/"&gt;John Hodgman&lt;/a&gt; would throw in to make his writing seem off-kilter. If I see a Rails article that uses "plug-in", I assume that either the writer is off-the-charts persnickety or that the writer is not really in touch with Rails developers. (Perhaps not coincidentally, I'm always a little worried that I'll have some writing quirk that won't match the expectations of my audience.)&lt;/p&gt;&lt;p&gt;So? Which spelling do you prefer? And does it even matter to you?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8081540670476061340?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8081540670476061340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8081540670476061340'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/you-say-tomato-i-say-to-mato.html' title='You Say Tomato, I Say To-Mato'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1555264330628228965</id><published>2008-04-17T21:59:00.001-05:00</published><updated>2008-04-17T22:15:50.216-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><title type='text'>Boxcars</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;h4&gt;&lt;em&gt;Battlestar Galactica&lt;/em&gt; 402ish "Six of One"&lt;/h4&gt;&lt;p&gt;Some quick bullet points before the next one comes down the pike.&lt;/p&gt;&lt;p&gt;Very pleased with the first two episodes of the season -- I think it's encouraging that this episode, credited to a writer whose last couple were not that strong, was arguably better than the first.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Katee Sackhoff had an amazing week -- Starbuck was all over the place, on the very edge of hysteria of not past it, a lot of great scenes. The Adama/Roslin scenes were also very good.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If you are looking for a line to take a something other than face value, I'd recommend "I'm no more a Cylon then you are"&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;How long can Tigh, Anders, Tory, and Tyrol meet together before somebody gets suspicious? It's not like they travel in the same social circles or that anybody is going to believe they've got a bridge game going...&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Loved the Cylon civil war idea -- it's very consistent with what Moore has said in a number of interviews about Cylon society being young and under it's first real stress. (This is actually where I thought they were going to go at the end of Season Two, after "Downloaded" first hinted at pro and anti human politics among the Cylons. Plus it's always nice to see Dean Stockwell. (The actual confrontation scene was capped by Tricia Helfer's look of shock at the end.)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Okay, having two farewell ceremonies for Lee was a bit much, especially since you'd think that there would be some resentment over an able-bodied person leaving the military. That said, both scenes worked on their own, and I thought the aside in the bar scene of the group presumably strip poker was weird and funny.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;There are many reasons I like this show. One is that Baltar, after the events of last episode, still had a visible scar in this episode -- a point that many shows would ignore. Watching Callis play against himself was also fun.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1555264330628228965?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1555264330628228965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1555264330628228965'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/boxcars.html' title='Boxcars'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2587942075679878708</id><published>2008-04-16T09:11:00.001-05:00</published><updated>2008-04-16T09:11:20.718-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Video Still Working On Killing The Radio Star</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Annnddd... This, of course, is what I get for posting anything about Wiley late at night without checking. Jim Minatel from Wiley added the following comment:&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;Noel: I'm interested in getting Wrox authors to to videos related to their books.... I can tell you what's involved and see what we can do.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;So, contacting in progress. Further bulletins as events warrant. Or as events don't warrant, I think further bulletins are inevitable.&lt;/p&gt;&lt;p&gt;Thanks, random blog commenter, for pushing me forward on this.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2587942075679878708?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2587942075679878708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2587942075679878708'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/video-still-working-on-killing-radio.html' title='Video Still Working On Killing The Radio Star'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7179135719921725316</id><published>2008-04-15T23:32:00.001-05:00</published><updated>2008-04-15T23:32:02.270-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Video Killed the Radio Star</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;When you have a blog with as few comments as this one, you can give every comment the kind of personal attention it deserves. This one came through from an anonymous commenter:&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;Noel, have you considred making a DVD video tutorial   of your book? This will really help those who learn by   watching videos.&lt;/p&gt;     &lt;p&gt;So what do you say? &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The short answer is not as any kind of official adjunct to the book. The longer answer is that it's not impossible that I'd be involved in online video or screencast training at some point in the future.&lt;/p&gt;&lt;p&gt;There are several issues here: logistical, legal, whether anybody would even be interested in such a thing, whether having my face on the cover is enough "me" for most people... all kinds of issues.&lt;/p&gt;&lt;p&gt;Logistically, the problem is that doing video well requires a lot of planning, equipment, and effort. I don't know much about it, but I know enough to say that it's probably more complicated than than I expect. Even a simple screencast involves scripting, time for filming, and editing.&lt;/p&gt;&lt;p&gt;Legally, Wiley/Wrox owns the copyright on the book, and while they might be okay with a short video clip that was clearly promotional, I'm not sure they'd be ok with me repurposing the book's content in bulk. On the other hand, I've never asked -- it's possible they'd see it as a marketing possibility. I don't remember the specific details of my contract, but I'm pretty sure that Wiley retains rights for any alternate media versions of the book. Which would be kind of a bummer for me if Spielberg called for the film rights.&lt;/p&gt;&lt;p&gt;All that said, the idea of some kind of screen cast, webinar, or video coming out of Pathfinder is not out of the question, although I don't see it happening in the near future.&lt;/p&gt;&lt;p&gt;Thanks for the question, Anon!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7179135719921725316?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7179135719921725316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7179135719921725316'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/video-killed-radio-star.html' title='Video Killed the Radio Star'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6209748166115343357</id><published>2008-04-13T22:23:00.001-05:00</published><updated>2008-04-13T22:23:58.437-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><title type='text'>Doctor, Doctor, Give Me The News</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;h4&gt;5 Things About: &lt;em&gt;Doogie Howser, M.D.&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Why Doogie? Because the parody at the end of &lt;em&gt;How I Met Your Mother&lt;/em&gt; a while back, plus a desire to wander through &lt;a href="http://www.hulu.com"&gt;hulu.com&lt;/a&gt;. So I watched the Doogie pilot from 1989. And now I'm writing about it.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;I was really not expecting the show to hold up at all. It's actually a pretty solid piece of late 80's TV, despite the cheesy theme music and classic 80's opening sequence.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It's still possibly the most absurd premise that a TV show ever expected the public to take seriously. In the pilot, they work around that through an exceptionally well-crafted script combined with Neil Patrick Harris' talent and likability as Doogie.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I remembered it as just a Stephen Bochco show, but it's actually Bochco and David E. Kelley. Kelley's name wouldn't have meant anything to me at the time, but in retrospect his involvement makes so much sense, it's exactly the kind of quirky drama he would become known for.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Let's take this as a writing challenge. You have one opening scene to make this ridiculous premise believable. Your hero needs to be smart enough for the audience to buy him as a doctor, but not so nerdy or arrogant that it's off-putting. Again, you have one scene. First scene of the pilot: Doogie is taking his driving road test, his mom is in the back seat, and he's clearly nervous and tentative. Until they see an accident on the roadside -- Doogie suddenly is in total control, parking, running up to the accident, ordering cops around and saving a guy's leg. That's the whole show, right there. Corny? A little bit, although Harris' performance blunts that. Effective? Yep. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Another nicely done bit: later, Doogie has the inevitable conflict with an older doctor who thinks he's a smart-ass young whippersnapper. My eyes rolled in anticipation of some scenery chewing, but actually the scene ends pretty quickly from there. The dilemma at this point is: if Doogie is right, then he comes off as kind of an insufferable know-it-all, if he's wrong, it's harder to take him seriously as a doctor. The writers opt for door number three -- events overtake the patient without proving Doogie right or wrong, he has a brief, nice scene with the older doctor, and the potential conflicts about his age are established without being nailed into our heads.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I'm about 100% sure, based on my own memory, that the scripts weren't always this good, but still, the pilot is pretty good.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6209748166115343357?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6209748166115343357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6209748166115343357'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/doctor-doctor-give-me-news.html' title='Doctor, Doctor, Give Me The News'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-357209047752418952</id><published>2008-04-06T22:25:00.001-05:00</published><updated>2008-04-06T22:25:46.313-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><title type='text'>I Believeth, I Believeth, Don't Die Tinkerbell...</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;h4&gt;&lt;em&gt;Battlestar Galactica&lt;/em&gt; 4-1 "He That Believeth In Me"&lt;/h4&gt;&lt;p&gt;I'm relieved, frankly. Not surprised, exactly. I liked Season 3 more than a lot of people seemed to, and I'm optimistic that Ron Moore and his crew understand what the problems were and how to avoid them. Still, it's good to see the show starting out it's final season with a strong episode.&lt;/p&gt;&lt;p&gt;This was basically the episode I was hoping for, with two extra plusses, and one kind-of minus.&lt;/p&gt;&lt;p&gt;Spoilers Ahead, I suppose&lt;/p&gt;&lt;p&gt;I really liked where they took the Final Four Cylon story. After three seasons of asking "What does it mean to be a human", they inverted it -- what does it mean to be a Cylon? What does it mean if your spouse, or best friend, or your whatever the heck Lee and Kara are, turns out to be Cylon? Does it matter? Should it? Great questions, and I can't think of a previous SF work that's attacked the basic what-is-human question from this angle.&lt;/p&gt;&lt;p&gt;The specific pieces of the storyline were well-done. Anders' nerves about going into combat, Tigh's general Tigh-ness. The bit where the Cylon Raider scans Anders and get's the blip response was very cool.&lt;/p&gt;&lt;p&gt;But what really made the episode was the way that Starbuck's return integrated with the Final Four. Of course everybody would think Starbuck is a Cylon trick -- half the audience thinks so too. In the show, this allowed the characters to all talk about what it would mean to be a Cylon over the uncomfortable glances of the Fantastic Four. A really clever piece of writing structure.&lt;/p&gt;&lt;p&gt;The negative is the Baltar storyline. Not only does this put Baltar back in another situation where he's separated from the rest of the crew and in a place with creepy customs, but the whole thing is way too much like the telepath underground from the final season of &lt;em&gt;Babylon 5&lt;/em&gt; for comfort. (Personally, I wouldn't be surprised if the attack on Baltar was staged to make him stay with the cultists. But then, I'm cynical.)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Some great acting work all around -- watch how much of the episode is carried by the reactions of the Fab Four. And James Callis' facial expressions were the most bearable part of the Baltar story.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I thought that the tension between Lee and Adama was maybe resolved too quickly given how intense their argument was. I'm assuming the writers have bigger fish to fry.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I watched this one on hulu.com, since I don't get Sci-Fi on my cable system, and they pulled out of iTunes. Overall, it wasn't bad. The video quality was worse than the iTunes files but still watchable. The biggest problem was the interspersed commercials -- not that I'm inherently against the commercials, just that they aren't synched right. Two of the breaks came about a second after the actual episode act break and one of them came right in the middle of Baltar being attacked. Annoying.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-357209047752418952?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/357209047752418952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/357209047752418952'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/i-believeth-i-believeth-don-die.html' title='I Believeth, I Believeth, Don&amp;#39;t Die Tinkerbell...'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8211563764952072272</id><published>2008-04-04T12:44:00.001-05:00</published><updated>2008-04-04T12:44:16.073-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>BDD: Book Driven Development</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;&lt;img src="http://blogs.pathf.com/agileajax//recipes.jpg" alt="recipes.jpg" border="0" width="448" height="80" align="left" style="margin: 0px 5px 5px 0px" /&gt;(This one is also on the Pathfinder blog, but since it fits in here, I wanted the full text here...)&lt;/p&gt;&lt;p&gt;Jay Fields, who has been posting a very nice sequence of nuts-and-bolts Ruby and Rails guidelines, &lt;a href="http://blog.jayfields.com/2008/03/example-dilemma.html"&gt;pauses to talk about creating examples&lt;/a&gt;. It's a topic I've wanted to write about here for a while, and this is as good a lead-in as any. Plus, I'm generally interested in how principles of software development apply or don't apply in odd cases, and software being developed specifically for example purposes certainly qualifies as an odd case.&lt;/p&gt;&lt;p&gt;For &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;Professional Ruby On Rails&lt;/a&gt;, I knew that I wanted to run a single example application through the book. I had some grand visions of it being a "real" application or at least a real example of coding best practices. For best practices, I think it's pretty good on a method-by-method bases, but has some weaknesses as an entire app, for reasons that I think will become clear.&lt;/p&gt;&lt;p&gt;The first question was exactly what I wanted the sample application to do. On some level, this is a superficial question -- who really cares what the fake app in the book does? At the same time, certain application structures would make it easier or more plausible to discuss certain features. And I had a list of features I wanted to cover -- legacy databases, users and roles, navigation, and graphics. Ideally, the sample app would have some kind of consistency that would make it reasonable to have these features. &lt;/p&gt;&lt;p&gt;In addition, I didn't want it to be a thinly-veiled version of a site that everybody would recognize, and I wanted it to be something that I could type every day for six months without going crazy. &lt;/p&gt;&lt;p&gt;One of my first ideas was to resurrect an old Web 1.0 joke for my killer e-commerce plan: a web-based store for selling and delivering gasoline. But I decided that the gag was a lot less funny with gas in the $3 per gallon range, and I also decided that I didn't want the fake site to be primarily an e-commerce site.&lt;/p&gt;&lt;p&gt;Brainstorming ensued. I almost did a social networking site for pets, but I decided that was too silly, subsequently discovering that there are already a zillion pet social networking sites...&lt;/p&gt;&lt;p&gt;Eventually, I settled on Soups OnLine, a soup recipe-sharing site. It had the advantages of:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Having a data model that could plausibly handle RESTful nested resources (recipe and ingredients)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Having an actual user model.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Being a plausible site, while still being silly enough to keep anybody from taking the whole thing too seriously.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The first problem came up almost immediately -- site design. I felt that a site that was just dull HTML would not be credible or interesting, but at the same time, I didn't really have the time or resources to create a full site design from scratch, nor did I want the book to become about site design. My solution, which I'm not prepared to defend to the death, was to integrate a template from freewebtemplates.com. This kind of sideswipes the whole issue, providing reasonably good-looking site without having to get into the weeds debating CSS minutia.&lt;/p&gt;&lt;p&gt;Over time, the example mutated away from a normal application development process in a few interesting ways.&lt;/p&gt;&lt;p&gt;The nature of the book-writing itself was a strong anti-agile push, in much the same way that any large body of documentation is. Changes in code structure affect the tests, which is fine, but also affect some amount of text in the previous 300 pages, which there's no easy way to find. (As you &lt;a href="http://blogs.pathf.com/agileajax/2007/11/agile-publishin.html"&gt;can read in this post&lt;/a&gt;, the issue affected not just me, but also the editors on the book). At least once, a late change in Rails invalidated a helper method I used in an early chapter. Not a big deal, except I also used that helper method to demonstrate a test structure later in the book -- I wound up keeping a shell of the original method redirecting to the new Rails method.&lt;/p&gt;&lt;p&gt;Also, some features that I had hoped to get in, didn't quite get there -- because I ran out of time or because they didn't with the chapter structure. (If you read the book, you'll see some early structures that imply that the app will eventually convert between English and Metric, which I never quite got to.) Again, this is the kind of thing that happens in all the time in real projects, but is hard to smoothly redirect when there's all that pre-existing text describing the earlier plans.&lt;/p&gt;&lt;p&gt;Sometimes, the sample app has more features than a real app would, rather than less. Since the book tries to cover multiple plugins or ways to accomplish things, Soups OnLine wound up with far more plugin load than a normal app would -- a regular app wouldn't normally have RSpec and Shoulda and Dust, or RMagick and MiniMagick and ImageScience. Inevitably some conflicts happened between multiple plugins trying to cover the same space, making the final code somewhat wilder than I'd really like. (If you've read the book and want to experiment with the outstanding code, it's probably easiest to work with around chapter 9, before Globalize and the image plugins are added...)&lt;/p&gt;&lt;p&gt;Ultimately, of course, as Fields concludes, it's the author's fault if the example doesn't help the user understand the issues at hand. It's my job to understand the constraints of the form and still try to present as realistic an application as possible while explaining how to to build similar applications.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8211563764952072272?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8211563764952072272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8211563764952072272'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/bdd-book-driven-development.html' title='BDD: Book Driven Development'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2328187325987799039</id><published>2008-04-01T23:45:00.001-05:00</published><updated>2008-04-01T23:45:22.945-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Book Recommendations</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;I've been meaning to do this sooner, but, wow time flies...&lt;/p&gt;&lt;p&gt;Here are some brief comments about books I've read so far this year and would recommend. I think I'll pass on doing negative reviews here at the moment, unless I can make a larger point somehow.&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Captain's Fury&lt;/em&gt;, by Jim Butcher&lt;/h4&gt;&lt;p&gt;Book four in the Codex Alera series continues pretty much everything that's enjoyable about the series. I particularly like the way Butcher continues to move the story along, as well as how he's resisted the easy way to manage the hero and his lack of fury powers.&lt;/p&gt;&lt;h4&gt;&lt;em&gt;The Dragons of Babel&lt;/em&gt;, by Michael Swanwick&lt;/h4&gt;&lt;p&gt;So about fourteen years ago, Swanwick published &lt;em&gt;The Iron Dragon's Daughter&lt;/em&gt;, which was, I think, the first prominent example of a crossover between common fantasy icons and dystopian SF icons. If I remember correctly (always a dubious assumption) a lot of people (meaning me) weren't quite sure what to make of the weirdness. I don't think &lt;em&gt;The Iron Dragon's Daughter&lt;/em&gt; is a great novel -- it's very episodic, for one thing -- but it is one of the most inventive and memorable novels you'll ever read.&lt;/p&gt;&lt;p&gt;&lt;em&gt;The Dragons of Babel&lt;/em&gt; is marketed as a sequel, although I don't think there's any particular crossover beyond tone and some place or character names -- I don't remember &lt;em&gt;Iron Dragon's Daughter&lt;/em&gt; having much plot to continue. It does however, continue the same tone as the original, a world that freely mixes fantasy elements with ideas from "the real world", and with a certain, say, lack of reverence toward High Fantasy. &lt;/p&gt;&lt;p&gt;The title Babel is a city, somewhat loosely based on the biblical and Mesopotamian myth, but populated with all kinds of fey, including ghouls and their corrupt city alderman leader, underground horse keepers, a mysterious throne with an absent king, guns, spells, and con men.&lt;/p&gt;&lt;p&gt;It's still fairly episodic, but I think it holds together as a coherent story better than &lt;em&gt;Iron Dragon's Daughter&lt;/em&gt;, and it'll certainly mess with your head. In a good way. Mostly.&lt;/p&gt;&lt;h4&gt;&lt;em&gt;God Save The Fan&lt;/em&gt; by Will Leach&lt;/h4&gt;&lt;p&gt;Leach is the editor and proprietor of &lt;a href="http://www.deadspin.com"&gt;Deadspin&lt;/a&gt;, which is the pre-eminent sports blog if you are a certain kind of fan -- irreverent? immature? Dunno, but it's one of my favorite sports web sites, serving up sports news and analysis while not stinting on pictures of drunken, partying quarterbacks.&lt;/p&gt;&lt;p&gt;The book is essentially Leach's attempt to make the Deadspin worldview explicit. (Although only one piece in the book is taken directly from Deadspin, regular readers will recognize many of the running jokes...) It's a collection of essays with the common goal of recovering sports from the people who take them too seriously. It's kind of hit and miss, but the best pieces are worth your time, and Leach has probably my favorite take on the steroid issue -- which is we're sick of it, please stop moralizing over it.&lt;/p&gt;&lt;h4&gt;&lt;em&gt;The Invention of Hugo Cabret&lt;/em&gt;, by Brian Selznick&lt;/h4&gt;&lt;p&gt;I think this book is the longest work to ever win the Caldecott Medal for children's book illustration. Most Caldecott winners are your basic short kids picture books. Selznick has written a 500 page novel, about half of which is told through words, and about half through wordless pictures.&lt;/p&gt;&lt;p&gt;The story takes place in Paris in the 1930s. Hugo Cabret lives alone in the Paris Metro station, winding the clocks through a series of out of sight tunnels, and repairing a mechanical automaton rescued from a fire by his late father. Eventually, he comes to the attention of an elderly man who runs a mechanical toy shop in the station. The early history of French silent film is involved, along with an image you've surely seen of a rocket ship hitting the man in the moon square in the eye. &lt;/p&gt;&lt;p&gt;The pictures carry a lot of the story load, and they are moody and atmospheric without losing clarity -- it's never hard to follow the story, and you can't easily do things like slow zooms in pure text. There's a nice meta twist at the end, too. Definitely track down this unique and interesting book.&lt;/p&gt;&lt;h4&gt;&lt;em&gt;Lincoln and Douglas&lt;/em&gt; by Allen C. Guelzo&lt;/h4&gt;&lt;p&gt;Somehow &lt;em&gt;The Daily Show&lt;/em&gt; and &lt;em&gt;The Colbert Report&lt;/em&gt; became my main sources for new non-fiction book recommendations (Stewart has almost completely stopped having actors as guests in favor of non-fiction authors, Colbert never really had many actor guests to begin with...). Guelzo was on &lt;em&gt;The Daily Show&lt;/em&gt;, since books on the buildup to the Civil War really pack in the ratings.&lt;/p&gt;&lt;p&gt;The book is interesting, if not as dazzling in prose style as your super top-notch non-fiction books. It certainly focused on some areas that were relatively new to me. Notably, how the feud between Douglas and James Buchanan affected the race, and how East Coast Republican leaders didn't really support Lincoln out of the probably-vain hope that Douglas would reveal himself as a Republican. Guelzo also covers the various political pressures that affected Lincoln's message as well.&lt;/p&gt;&lt;p&gt;The interesting "what-if" scenario here is what would have happened had Douglas not chosen to debate Lincoln -- he had not much to gain from the debates as the prohibitive favorite. Absent the fame from the debates, there's no way Lincoln is the nominee in 1860. But absent the questions he had to answer in the debates, Douglas is much more likely to have cobbled together the Southern states into a coalition that could have elected him (adding a Southern VP, possibly). Where it goes from there is anybody's guess, especially since Douglas would have died months after taking office (although absent the debates, his health might have been better...)&lt;/p&gt;&lt;h4&gt;&lt;em&gt;The Mirador&lt;/em&gt;, by Sarah Monette&lt;/h4&gt;&lt;p&gt;Book three in a series. One of those cases where the author settles character situations at the end of a book, then in order to write the next book in the series, she has to roll back some of the plot and character gains. That's what this book feels like -- the three main characters, acting mostly in harmony at the end of the second book, spend a lot of this book rehashing the arguments and conflicts from the last book.&lt;/p&gt;&lt;p&gt;That said, there's a lot in the book that does work. Monette does a nice piece of writers indirection, hiding the identity of an important character for a while. The characters and plot all move forward, maybe reaching new understandings in the end. Still looking forward to the next book.&lt;/p&gt;&lt;h4&gt;&lt;em&gt;New Amsterdam&lt;/em&gt;, by Elizabeth Bear&lt;/h4&gt;&lt;p&gt;I read Bear's first novel (&lt;em&gt;Hammered&lt;/em&gt;), thought it was okay, but never went back to the series. Since then, she's jumped her way around several genres, and the description of this one was compelling enough for me to check back in. It's alternate history, the difference point not quite spelled out, but America is still a British colony, and New Amsterdam remained a Dutch colony until the early 19th century when it was given to the British.&lt;/p&gt;&lt;p&gt;Our two lead characters are Sebastian de Ulloa, a centuries old vampire (the book favors "wampyr") and Abigail Irene Garret, a forensic sorcerer. Together they fight crime. Really.&lt;/p&gt;&lt;p&gt;The book is a series of connected short stories that eventually connect enough to roughly form a novel (some, if not all, of the stories were published separately). The early stories are mostly standalone, and have a certain Agatha Christie meets Bram Stoker kind of feel. Later stories build on each other, as both Sebastian and the British Crown find their positions in America become increasingly untenable.&lt;/p&gt;&lt;p&gt;I liked this book for it's atmosphere and for the main characters, I think it would have been even better fully structured as a novel -- I think it might have drawn out the supporting characters a bit more. The mystery elements give the story some texture, but the magical background behind the crimes is a little opaque to the reader... not a problem exactly, just a comment on what kind of mystery story this is. Plus, I'm an easy mark for any novel with the British Crown still ruling America. (If I met Richard Dreyfuss, I'd probably ask him what it was like to work with Harry Turtledove.) I'm hoping for a continuation to this story, and I'll check out some of Bear's other fantasy work in the meantime.&lt;/p&gt;&lt;h4&gt;&lt;em&gt;T is for Tresspass&lt;/em&gt; by Sue Grafton&lt;/h4&gt;&lt;p&gt;Grafton is one of the few really best-selling authors that I read, and one of the things I like about her recent work is that she's been able to avoid having Kinsey Milhone solve the same case over and over again. In this case, the point of view goes back and forth between Kinsey and a sociopathic predator posing as a home nurse, the better to steal large sums of money from the neighborhood elderly recluse.&lt;/p&gt;&lt;p&gt;The mouse in this game sees Kinsey coming from a mile away, and manages to manipulate her into losing her temper and seeming unhinged to any authority figure Kinsey is inclined to consult. That's frustrating for Kinsey, but interesting for me -- I generally like watching the hero have their strengths used against them judo-style. The book is tense, although the actual ending struck me as a bit too easy. &lt;/p&gt;&lt;p&gt;It's also kind of interesting to watch Kinsey's stories, which take place a few months after each other and are therefore still in 1988, increasingly become period pieces. I think Grafton is increasingly referencing current events to make it easy for the reader to remember the time frame, and not wonder why Kinsey doesn't use a cell phone or the internet. &lt;/p&gt;&lt;p&gt;Coming soon: Matthew Hughes &lt;em&gt;Magestrum&lt;/em&gt; series. New Lois McMaster Bujold. The third book in John Varley's Mars series. Jim Butcher's latest Dresden novel...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2328187325987799039?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2328187325987799039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2328187325987799039'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/04/book-recommendations.html' title='Book Recommendations'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8115956296078702190</id><published>2008-03-21T10:14:00.001-05:00</published><updated>2008-03-21T10:14:45.429-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>My Favorite Monkeys</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;New post at Pathfinder &lt;a href="http://blogs.pathf.com/agileajax/2008/03/my-favorite-mon.html"&gt;on monkey patching&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8115956296078702190?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8115956296078702190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8115956296078702190'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/03/my-favorite-monkeys.html' title='My Favorite Monkeys'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2691121435946343696</id><published>2008-03-17T21:35:00.001-05:00</published><updated>2008-03-17T21:35:47.112-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indulgent'/><title type='text'>Beep Repaired</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;I don't know what this says about me, or anybody else for that matter...&lt;/p&gt;&lt;p&gt;I've been a huge Tom Lehrer fan ever since my 8th Grade Social Studies teacher decided to warp all our minds by playing "That Was the Year That Was" during a reading period. (It was 1985, so it's not like the recording was current or anything...) I was pretty instantly hooked, and a few years later when his albums were re-released on CD, bought them instantly, and have more-or-less memorized them.&lt;/p&gt;&lt;p&gt;I also became aware of the existence of the musical Tom Foolery, a review of Lehrer's songs that had apparently even recorded a cast album somewhere along the line, but not anywhere that coincided with a record shop I ever saw. I had always kind of wondered about it, and about a week ago, sort of randomly popped it into an iTunes search, and was really, really surprised to see the album actually show up. In DRM free iTunes plus, no less.&lt;/p&gt;&lt;p&gt;The album also has 24 reviews of which break down into: a) this isn't Tom Lehrer, b) Tom sings all these songs better, c) when is iTunes going to get &lt;strong&gt;real&lt;/strong&gt; Tom Lehrer, and d) they don't even use the real lyrics, and e) who are these whiney English people pretending to be Tom Lehrer. People seem to be genuinely angered that anybody else would even bother to record Lehrer's songs (in addition to being somewhat confused as to what this recording actually is -- for example, the "wrong" lyrics were actually written by Lehrer for the production...). Oy.&lt;/p&gt;&lt;p&gt;Well, I wasn't about to let 20 some-odd random strangers dissuade me from an album I've been looking for for almost twenty years. Although I did pause for a microsecond or two. &lt;/p&gt;&lt;p&gt;Preparing for disappointment, I downloaded the album.&lt;/p&gt;&lt;p&gt;And you know what, it isn't Tom Lehrer. It's also actually pretty good. All in all, I like Lehrer's syncopated, ironic style better on most of the songs, but it's not true that the English cast sings the songs with no bite. It is true that they have better-trained voices than he does, and that works in favor of some songs and against others. Still, it's nice to hear some songs in character -- "Poisoning Pigeons in the Park" is cute as a duet, and I liked most of the adult lyric additions to "Silent E".&lt;/p&gt;&lt;p&gt;The really dark ballads don't all do as well, but the uptempo songs are great. There are a couple of cases where the accents invalidate a rhyme or two, but overall, I had no problem with these people singing Lehrer's songs. (It was a little weird to hear them using so much of his monologues to introduce the songs...) So, I guess it's Random English Singers 1, Random Internet Commenters 0, at least as I keep score.&lt;/p&gt;&lt;p&gt;One last geeky thing... like a lot of live recordings made for vinyl, the tracks begin with the actual start of the song and end with the introduction to the next song. This is fine in a record album, where you would use the track breaks to find the beginning of the musics, but it's really irritating in an iPod, mix-and-match world, since any song that comes up ends with the introduction to then next song that isn't going to be played. This really bothered me for this album, since the introductions really do need to be tied to their actual songs. &lt;/p&gt;&lt;p&gt;But these were DRM-free songs, and I can be an own-your-media type on occasions, so I took them all into GarageBand and re-split the tracks so that the introductions are on the same tracks as the actual song. Took under an hour, and only that long because I didn't know that GarageBand had a global preference for export quality that was set too low. Much better that way.&lt;/p&gt;&lt;p&gt;Speaking of iPod, mix-and-match worlds, someday I really must introduce my iTunes random playlist generator...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2691121435946343696?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2691121435946343696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2691121435946343696'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/03/beep-repaired.html' title='Beep Repaired'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4858105401009317539</id><published>2008-03-10T23:59:00.001-05:00</published><updated>2008-03-10T23:59:28.006-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>The Average Programming Book</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;One weird aspect of being a published writer is that you get very little information about sales. You see your own numbers (several months after the fact), but there's no larger context, and no sense of what a reasonable expectation of sales might be.&lt;/p&gt;&lt;p&gt;Which is why I love it when O'Reilly Radar puts up one of their &lt;a href="http://radar.oreilly.com/archives/2008/03/state-of-the-computer-book-mar-23.html"&gt;periodic looks at the computer book market&lt;/a&gt;. I haven't pored over stat line like this since I collected baseball cards when I was ten. &lt;/p&gt;&lt;p&gt;I'm going to assume you've gone and followed the link, and post some further thoughts, rather than rehash the points already made.&lt;/p&gt;&lt;p&gt;So, the average programming book sold about 1100 copies in 2007. Given the probable distribution, I'd imagine the median is significantly lower, probably under 1000, although I have no way of knowing for sure. Obviously that conflates a lot of things, new books/old books, general books/specific books, but it seems to be a reasonable baseline.&lt;/p&gt;&lt;p&gt;It's not clear what that means for total sales, since I don't have a good sense of how long a particular book is viable. &lt;em&gt;Jython Essentials&lt;/em&gt;, which is nobody's idea of a best-seller, is still selling the odd few copies a month, and 2007 was it's sixth calendar year of sales, (it probably just slipped below the 1100/year figure based on 2007). &lt;/p&gt;&lt;p&gt;You might expect that the per-unit total is larger for the larger language markets, but that doesn't seem to be the case. In fact, three of the top ten languages have much lower per-unit figures (Java, C, Visual Basic). Presumably, this is because the larger markets encourage specialized books in a way that, say, the Groovy market doesn't. Yet.&lt;/p&gt;&lt;p&gt;It does seem to be the case that markets whose share is growing have high per-unit sales and vice-versa. This makes sense, especially when you factor in the lag time that publishers operate under. Growth markets result in high sales for the relatively few titles available, then the average gets driven down later on as more players enter the market. (The most interesting counter example is PHP, which maintained a pretty good per-unit sales rate despite an overall drop.)&lt;/p&gt;&lt;p&gt;Quick thoughts:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Ruby has the highest per-unit sales rate in 2006 and 2007 (books are placed based on what language the examples are in, so this includes all Rails books). It's still a very strong growth market, though. (But I wonder what the average is if you subtract the two Dave Thomas books...)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Python passed Perl, for presumably the first time since ever. That's really weird sounding. If you'd told me when I bought the Pickaxe book in 2001 that six years later Python would outsell Perl, and Ruby would outsell both of them combined... It's weird.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If the trendlines come even close to continuing, C# will be the biggest language market in 2008. That seems strange too... but I guess the Microsoft Bubble of Tools is pretty big.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4858105401009317539?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4858105401009317539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4858105401009317539'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/03/average-programming-book.html' title='The Average Programming Book'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3712250383825950560</id><published>2008-03-08T21:39:00.001-06:00</published><updated>2008-03-08T21:39:55.498-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iPhone SDK</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;I'm trying to figure out exactly why I'm so psyched by the Apple iPhone SDK announcement. The basic announcement wasn't a surprise, and I don't even own an iPhone. I did, however, dig out my Cocoa programming book and start studying.&lt;/p&gt;&lt;p&gt;Further thoughts:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The tools themselves seemed somewhat slicker than what was expected -- a lot of Mac developers were pleasantly surprised that Interface Builder was included (although apparently it's not in the first beta). There was a lot of speculation that the SDK release was delayed over security issues, but it also looks like polishing the tools took some time.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The demos were exceptionally well done, a very nice range of choices, and the continual push of how easy it was to make them. The quality of the demo is clearly one of the reasons that I'm excited.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;As an aside.. say your boss came up to you and said you're going to fly to Cupertino for two weeks to build something in the super-secret iPhone SDK, which you will get to present in a full-on Steve Jobs media event. How many nanoseconds would you need to wait before accepting?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Let's see, the iPhone 2.0 comes out the end of June. So... by August 1, it should be the top mobile gaming platform going, right? Those were some seriously cool looking games...&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The terms were more open than I expected. It's particularly nice that Apple is allowing the developers to set the price. It's particularly nice that they specifically included "free" as a price. They seemed to emphasize that Apple was going to try and get as many apps in front of developers as possible -- I'd take the inclusion of AIM as a demo as a sign that even things that AT&amp;amp;T might not be thrilled with will be allowed.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The general sense of the existing indy Mac community is that the 70/30 split is reasonable given what Apple is offering. It'll be interesting to see how the price points play out. (As pointed out by &lt;a href="http://mooseyard.com/Jens/2008/03/the-beauty-of-99¢-iphone-apps/"&gt;Jens Alfke&lt;/a&gt;, the App store model enables an entirely new class of micropayment software)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Still a number of questions: how will developers manage limited betas? Will developers be allowed to have the download be free, but have a separate license authorization? What about free but add supported (like Twitteriffic)?&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Early line, here's a short list of people or apps off the top of my head I expect greatness from:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;MobileTwitteriffic, already essentially announced. The trick here will be improving on the web UI.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Red Sweater, apparently Daniel is considering porting Black Ink, and maybe MarsEdit.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ambrosia Software. For a really great game -- Sketch Fighter would work...&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The Desktop Tower Defense guy. The UI would be tricky, though...&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Somebody to do the killer To-Do list or GTD app. Omni?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A really cool doodle/draw program.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I think this is going to be a very fun ride...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3712250383825950560?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3712250383825950560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3712250383825950560'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/03/iphone-sdk.html' title='iPhone SDK'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4067506419412855643</id><published>2008-03-06T15:16:00.001-06:00</published><updated>2008-03-06T15:16:23.369-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Pathfinder Post: Using Null Objects with ActiveRecord</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Enjoy:&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/03/using-the-null.html"&gt;http://blogs.pathf.com/agileajax/2008/03/using-the-null.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4067506419412855643?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4067506419412855643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4067506419412855643'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/03/pathfinder-post-using-null-objects-with.html' title='Pathfinder Post: Using Null Objects with ActiveRecord'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8833321216988480279</id><published>2008-03-05T07:14:00.001-06:00</published><updated>2008-03-05T07:14:53.865-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sf'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><title type='text'>Cuts Like A Knife</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;h4&gt;SF Movie Review: &lt;em&gt;Battlestar Galactica: Razor&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;(Continuing the enlargement of things I write about on this site, and I think this will be the last post containing a disclaimer about topics...)&lt;/p&gt;&lt;p&gt;I'm not sure what this says about me or my relationship to this show, but the following is all true:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I bought this DVD the day it came out (I don't get Sci-Fi at the moment...)&lt;/li&gt;&lt;li&gt;I then let it sit for three entire months while waiting for the right time to watch it in one sitting.&lt;/li&gt;&lt;li&gt;I finally decided that I'd watch it in pieces, so I started it at about 10:45 at night.&lt;/li&gt;&lt;li&gt;Got so caught up in it that I watched it all the way through, then read &lt;a href="http://www.televisionwithoutpity.com/Shows/Battlestar-Galactica/Stories/Razor"&gt;Jacob's incredible TWoP recap&lt;/a&gt; before sleep.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The movie is made up of several nested flashback stories (don't even try to use this movie as an introduction to the Galactica universe...), mostly unified by the person of Kendra Shaw, whose official title might be "Highest Ranking Pegasus Officer We Never Saw Before". Shaw arrives on Pegasus about fifteen minutes before the original Cylon attack, and has a front row seat for the craziness hinted at during the first time through the Pegasus story. Later, she becomes Lee Adama's XO, and leads a mission to a mysterious Cylon outpost dating from the first Cylon war. Add in a couple of flashbacks as to what the elder Adama and Cain were doing on the last day of the first war, and you've about got it.&lt;/p&gt;&lt;p&gt;The basic issue with a this movie, which is designed specifically not to be necessary to understand the main story, is for the show to justify it's existence as more than a way to move DVD's at Best Buy. I think it does, not so much at a plot level, but in the way that it deepens the Pegasus story, already one of the show's best storylines.&lt;/p&gt;&lt;p&gt;The &lt;em&gt;Galactica&lt;/em&gt; story has always revolved around about three questions, how do you deal with overwhelming loss, how are you supposed to act in the name of survival, and how are you supposed to treat a mortal enemy. &lt;em&gt;Razor&lt;/em&gt; encompasses all three. The earlier &lt;em&gt;Pegasus&lt;/em&gt; arc was, in some ways, a little too easy -- Cain fits very neatly into the model of Crazy Commanding Officer Who Goes Too Far. By taking us through the all the steps from beginning to end, &lt;em&gt;Razor&lt;/em&gt; makes it harder to dismiss Cain as a lunatic -- it explains her actions without excusing them. Kendra Shaw, who pretty much wears a sign at the beginning saying "I'm Not Crazy" gets drawn straight into the heart of it all. As a result, &lt;em&gt;Razor&lt;/em&gt; ends up being a very dark story even by &lt;em&gt;Galactica&lt;/em&gt; standards.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;My list of bedrock &lt;em&gt;Galactica&lt;/em&gt; questions doesn't include the question of whether the Cylons are human. While that's frequently a topic of discussion on the show, it's clear to me that the creators of the show know the answer to that question... they use the human/robot question as a way of getting at the deeper issues.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I liked the subtle ways in which the movie placed itself in the Galactica timeline, the exact number of survivors in the credits places it, plus there were a couple of background references to major events in the last half of season 2.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Have they ever mentioned on the show exactly what caused the first Cylon war to end so abruptly? That's a possible plot issue to be dealt with in season 4. Or, I suppose, the on-again, off-again &lt;em&gt;Caprica&lt;/em&gt; miniseries. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Moore's commentary is very interesting -- as with many other Galactica episodes, this one changed dramatically in editing. Essentially, they turned the entire movie inside out, and what was originally the framing sequence became the ending mission, and the original meat of the movie became the framing sequence. &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8833321216988480279?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8833321216988480279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8833321216988480279'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/03/cuts-like-knife.html' title='Cuts Like A Knife'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-9214171431326942097</id><published>2008-03-03T12:07:00.001-06:00</published><updated>2008-03-03T13:29:52.758-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Using Active Record For Migrations</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;New post on the pathfinder blog:&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/03/using-activerec.html"&gt;Using ActiveRecord to Migrate Legacy Data&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-9214171431326942097?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/9214171431326942097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/9214171431326942097'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/03/using-active-record-for-migrations.html' title='Using Active Record For Migrations'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2774620398040693636</id><published>2008-02-26T10:35:00.001-06:00</published><updated>2008-02-26T10:35:46.217-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Buy My Book! (Please?)</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;&lt;img src="http://blogs.pathf.com/agileajax//223888 cover_df.pdf (3 pages).jpg" alt="223888 cover_df.pdf (3 pages).jpg" border="0" width="182" height="213" align="left" /&gt;&lt;/a&gt;This week, my book &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;&lt;em&gt;Professional Ruby on Rails&lt;/em&gt;&lt;/a&gt; will be officially released. You can see &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-047022388X.html"&gt;sample chapters here&lt;/a&gt;, and you can &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;buy the book at Amazon (affiliate link)&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;This book is designed to meet the needs of an intermediate to advanced Ruby on Rails user. The first wave of Rails books could not assume that the user had any pre-existing knowledge of Rails. As a result, they spent a lot of time covering the basics. The target reader for this book is somebody who has already read one of the basic books and now has to apply this knowledge to building a complete web site all the way from conception to deployment. &lt;/p&gt;&lt;p&gt;Written over the summer and fall, all the sample code in the book uses Rails 2.x, specifically including RESTful structures, &lt;code&gt;respond_to&lt;/code&gt;, new migrations, cookie-based sessions, and other new features.&lt;/p&gt;&lt;p&gt;The book covers the kinds of tasks that nearly every site needs to handle -- user models, database performance, time zones and internationalization, creating common JavaScript navigation elements, REST web services, and graphics. Where there are commonly used plugins to support those features, the book covers those as well.&lt;/p&gt;&lt;p&gt;In addition to the application itself, there are other parts of the Rails life cycle. The book covers many of these issues including how to manage a Subversion repository, how to use Rake to simplify common tasks, Capistrano for deployment, RailsBench and profiling tools, generators, and plugins.&lt;/p&gt;&lt;p&gt;I wanted to include comprehensive and integrated coverage of automated testing. In addition to a chapter dedicated to advanced testing tools, nearly all of the sample code in the book is presented with its associated tests first. I believe this promotes the use of test-driven development and gives examples of how to test complex Rails code. &lt;/p&gt;&lt;p&gt;I had a lot of fun writing this book. If you are a Rails programmer, this book will improve your programs, and hopefully save you time and effort. If you're interested, please check out the &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/productCd-047022388X.html"&gt;samples&lt;/a&gt;, and &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;buy the book&lt;/a&gt;.  Thanks.&lt;/p&gt;&lt;p&gt;&lt;!-- Technorati Tags Start --&gt;&lt;/p&gt;&lt;p&gt;Technorati Tags:&lt;a href="http://technorati.com/tag/book" rel="tag"&gt;book&lt;/a&gt;, &lt;a href="http://technorati.com/tag/ruby" rel="tag"&gt;ruby&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- Technorati Tags End --&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2774620398040693636?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2774620398040693636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2774620398040693636'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/02/buy-my-book-please.html' title='Buy My Book! (Please?)'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2216634827210597983</id><published>2008-02-24T13:08:00.002-06:00</published><updated>2008-02-25T09:19:18.777-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='fiction'/><title type='text'>10 Print "Favorite Books, 2007"</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;For my first real non-techy post on this site (I'm a little nervous about that....), here's one of my favorite things to write about -- a list of favorite books that I read in 2007.&lt;/p&gt;&lt;p&gt;All the books on this list were published recently enough to qualify as "new". I also group books in the same series more or less on whim. My tastes... well, they tend toward Fantasy and SF, beyond that, you'll just have to infer from the list.&lt;/p&gt;&lt;p&gt;First up, the honorable mention, all these books are definitely recommended. All links are to Amazon affiliate pages.&lt;/p&gt;&lt;h4&gt;Honorable Mention&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0441015476?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0441015476"&gt;Cursor's Fury&lt;/a&gt;&lt;/strong&gt;, Jim Butcher. This is book three of the Codex Alera series (book four came out in January '08). The series is notable for likable characters, tight plotting, and a very interesting fantasy world based on the Roman empire. This particular book has a well handled reveal of secrets, including clues that had been staring the reader in the face since page one of the first book. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/1416951172?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1416951172"&gt;Extras&lt;/a&gt;&lt;/strong&gt;, Scott Westerfeld. Book four of Westerfeld's exceptional YA &lt;em&gt;Uglies&lt;/em&gt; series. Maybe down a slight notch from the first three, but still an interesting and fun book. Westerfeld has a knack for aligning his SF worlds with the concerns of his YA readers, but the book is also worth reading for adults.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0340752017?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0340752017"&gt;First Among Sequels&lt;/a&gt;&lt;/strong&gt;, Jasper Fforde. This one is book five in a series, in this case Fforde's funny and off-the-wall Thursday Next books. It's about fifteen years later, Thursday is still fighting bad guys in and out of books, in this case, she's assisted by two different fictional versions of herself. This series is kind of like what Douglas Adams might have come up with if he had decided to parody the English Lit canon. Only with more croquet, dodoes, vampires, and neanderthals. This book also has a great (read: clever and silly) time travel paradox.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0765318539?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765318539"&gt;Ha'penny&lt;/a&gt;&lt;/strong&gt;, Jo Walton. Much less funny, this is a sequel to &lt;em&gt;Farthing&lt;/em&gt;, Walton's alternate history world where the British made peace with Nazi Germany in 1940, ceding the rest of the continent to German control. Like the first book, this is chilling in it's matter-of-factness as Britain increasingly becomes a police state. (There aren't many more disturbing phrases in an alternate history than "President Lindburgh"...). &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0441014984?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0441014984"&gt;Halting State&lt;/a&gt;&lt;/strong&gt;, Charles Stross. The only non-series book in the entire Honorable Mention list. That's really odd. Near fiction SF that takes off from a daring bank robbery inside a World of Warcraft like virtual game. Moving forward from there, the stakes get much higher, since anybody who can crack the encryption used in the game can do... well, pretty much anything. This was the last book to fall off the final nominee list, it's an excellent, mind-warping SF book. Stross is kind of hit-and-miss, this is one of his hits.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/055358894X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=055358894X"&gt;The Lies of Locke Lamora&lt;/a&gt;&lt;/strong&gt; &amp;amp; &lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0553804685?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0553804685"&gt;Red Seas Under Red Skies&lt;/a&gt;&lt;/strong&gt;, Scott Lynch. Right up until the actual last book I read in 2007, this was my favorite new author of the year. It's a dark series (projected to seven books) about elaborate con games in an urban fantasy environment. The first one reads like a violent cross between &lt;em&gt;The Sting&lt;/em&gt; and China Mieville, the second one start that way, but veers off into a long pirate digression. The first book, on it's own, would probably have squeaked in the nominee list, the second one is a little weaker, but still has its moments.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0441014178?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0441014178"&gt;Melusine&lt;/a&gt;&lt;/strong&gt; &amp;amp; &lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/B000OFOJ12?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000OFOJ12"&gt;The Virtu&lt;/a&gt;&lt;/strong&gt;, Sarah Monette. One novel, published in two parts. Another dark fantasy, an extremely well written mood and character piece about two half-brothers, one a wizard gone insane, the other an assassin turned cat burglar. (Boy, that makes it sound kind of goofy -- it's not.) The book oozes atmosphere.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0765315076?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765315076"&gt;Ragamuffin&lt;/a&gt;&lt;/strong&gt;, Tobias Buckell. Sequel to &lt;em&gt;Crystal Rain&lt;/em&gt;, this book opens up the universe and has a much more space-opera feel. Includes a fantastic SF set piece that takes place down the axis line of a cylindrical space-station, involving Newton's second law and machine guns. &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Also recommended, to one degree or another:&lt;/p&gt;&lt;p&gt;&lt;em&gt;Always&lt;/em&gt; by Nicola Griffith, &lt;em&gt;Heart Shaped Box&lt;/em&gt; by Joe Hill, &lt;em&gt;Kusheil's Justice&lt;/em&gt; by Jaqueline Carey (last book off the above list), &lt;em&gt;Magic's Child&lt;/em&gt; by Justine Larbalestier, &lt;em&gt;The Merchant's War&lt;/em&gt; by Charles Stross, &lt;em&gt;Precious Dragon&lt;/em&gt; by Liz Williams, &lt;em&gt;The Sharing Knife: Legacy&lt;/em&gt; by Lois McMaster Bujold, &lt;em&gt;Sixty Days and Counting&lt;/em&gt; by Kim Stanley Robinson, &lt;em&gt;Spook Country&lt;/em&gt;by WIlliam Gibson, &lt;em&gt;The Sons of Heaven&lt;/em&gt; by Kage Baker, &lt;em&gt;Soon I Will Be Invincible&lt;/em&gt; by Austin Grossman, &lt;em&gt;The Sword Edged Blonde&lt;/em&gt; by Alex Bledsoe, and &lt;em&gt;White Night&lt;/em&gt; by Jim Butcher&lt;/p&gt;&lt;p&gt;The following books are the actual nominees for whatever mythical award I give out -- my favorite books of the year. This was an excellent year, all of these books are highly recommended.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0765312182?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765312182"&gt;Blindsight&lt;/a&gt;&lt;/strong&gt;, Peter Watts. The essential quote about Watts is from James Nicoll, "Whenever I find my will to live becoming too strong, I read Peter Watts." This is a grim book about the limitations of the human mind -- if you think your mind is actually good at stuff, be prepared to have that idea debunked forcefully. This is a first contact book with a very alien race, but it's completely subversive to the normal ideas of a first contact book. And it has SF vampires.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0545010225?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0545010225"&gt;Harry Potter and the Deathly Hallows&lt;/a&gt;&lt;/strong&gt;, J.K, Rowling. Odds are that you've already read this if you have even the slightest interest, either way you're probably not interested in what I have to say about this one. I just wanted to point out that, as a longtime Potter fan and Rowling supporter, I was a little worried that she wouldn't stick the landing. She did -- the book is a very satisfying end to the story.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0765316978?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765316978"&gt;The Last Colony&lt;/a&gt;&lt;/strong&gt;, John Scalzi. Book three of the &lt;em&gt;Old Man's War&lt;/em&gt; series, paying off on a series of hints in the earlier books that the surrounding universe is much more complex then originally let on. This book has more of an intrigue/spy feel than the earlier two, which were more military. Scalzi is trying very hard to write SF novels that are accessible to people who don't normally read SF. This does not mean the books are dumbed-down or uninteresting, just that you're actually going to be able to recommend them to more people who will enjoy them. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/075640407X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=075640407X"&gt;The Name of the Wind&lt;/a&gt;&lt;/strong&gt;, Patrick Rothfuss. This was my favorite new novelist of the year. The funny thing is that I could come up with a list of plot elements that would make this sound like the most derivative thing ever -- it's got a magical university, the kid from nowhere who's the most talented wizard anybody's ever seen, dark forces afoot, the older hero being dragged into the game one more time, takes place in an inn. All that said, the execution of the book is outstanding. The characters are far more interesting then the plain list would suggest, and the sentence by sentence writing is very good.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0765315440?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0765315440"&gt;The Queen of Candesce&lt;/a&gt;&lt;/strong&gt; Karl Schroeder. Book Two of Schroeder's Virga series, which takes place on maybe the best SF big object since Ringworld -- a giant, hollow planet, filled inside with atmosphere, and dozens upon dozens of smaller worldlets, the size of small towns and smaller, that spin to create their own gravity. It's a space opera if space had air. This book takes place on a very small, but strange, part of the larger world (the first book was basically an end-to-end tour of the place). The world building is amazingly good, the worldlet that the story takes place on is covered with countries the size of mansions that spend all their time in deep intrigue over centuries-old grudges. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0345458443?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0345458443"&gt;Un Lun Dun&lt;/a&gt;&lt;/strong&gt; China Mieville. It seems like this one kind of slipped past a lot of people, maybe they thought it was just another adult writer trying YA because it's a big market. In fact, it's a funny and clever subversive take on Narnia-style other worlds, and it has enough wordplay to qualify it as &lt;em&gt;The Phantom Tollbooth&lt;/em&gt; for the 21st century. This is the kind of book where The Chosen One is out of action on page 35, where a character is told that there is a long list of Trials That Must Be Done and says, in effect "I don't have that kind of time, just tell me where the last one is..." You'll never think about fantasy quests in the same way again. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.amazon.com/gp/product/0007149824?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0007149824"&gt;The Yiddish Policeman's Union&lt;/a&gt;&lt;/strong&gt;, Michael Chabon. Alternate history novel on the premise that the US saved 4 million European Jews in World War II and housed them in a protected reserve in Sitka, Alaska. Where they settled in and created a unique, Yiddish-based culture. Only now its 2007, and the lease is running out. On top of all that, it's a murder mystery. I was ready to love this book on premise alone, and the book more than lives up to the premise. As an Ashkenazi Jew, Sitka, Alaska is my lost culture, and Chabon makes it seem absolutely real -- I want to see this place as much as I've ever wanted to visit a fictional book. This just became the first novel ever to be nominated for best novel for both the Mystery Writers of America's Edgar Award, and the SF Writers of America's Nebula award. Hands down, my favorite book of the year. &lt;b&gt;Update:&lt;/b&gt; My &lt;a href="http://www.mediabistro.com/galleycat/awards/michael_chabon_wows_peers_across_two_genres_78141.asp"&gt;source&lt;/a&gt;  for the Edgar/Nebula has made a partial correction, pointing out that "Jeffrey Ford's The Girl in the Glass was nominated for the best novel Nebula and won the best paperback original Edgar in 2006". Still, Best Paperback Original is not, I suppose, Best Novel...&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2216634827210597983?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2216634827210597983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2216634827210597983'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/02/10-print-books-2007.html' title='10 Print &amp;quot;Favorite Books, 2007&amp;quot;'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8508736692832170842</id><published>2008-02-22T10:34:00.001-06:00</published><updated>2008-02-22T17:48:28.456-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Shipping!?</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Amazon is now saying that &lt;em&gt;Professional Ruby On Rails&lt;/em&gt; is in stock! I haven't seen my copies yet, and I suspect Amazon purchases will actually go out next week, but it's a real page and everything.&lt;/p&gt;&lt;p&gt;The link to purchase is &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;right here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I've also added a &lt;a href="https://docs.google.com/Doc?docid=ah2szrczrmxv_26z j8npddd&amp;amp;hl=en"&gt;running list of errata and updates&lt;/a&gt;. Check back on that every now and then.&lt;/p&gt;&lt;p&gt;Much more on the book over the next week.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8508736692832170842?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8508736692832170842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8508736692832170842'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/02/shipping.html' title='Shipping!?'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-398284612854539590</id><published>2008-02-19T20:21:00.001-06:00</published><updated>2008-02-24T13:17:23.183-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Lesser Known Test Processes</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;New post on the Pathfinder site. I had fun writing this one. It's on some lesser known variants of test-driven development.&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2008/02/lesser-known-te.html"&gt;http://blogs.pathf.com/agileajax/2008/02/lesser-known-te.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-398284612854539590?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/398284612854539590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/398284612854539590'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/02/lesser-known-test-processes.html' title='Lesser Known Test Processes'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2866564379700843618</id><published>2008-02-18T21:08:00.001-06:00</published><updated>2008-02-18T21:08:03.684-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indulgent'/><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>State of the Blog</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;This is for any intrepid readers out there who have been following this blog for any length of time. Executive summary: this blog should be getting more content (and more varied content) in the future. Really.&lt;/p&gt;&lt;p&gt;Here's the thing. At the moment, I'm trying to maintain the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This blog&lt;/li&gt;&lt;li&gt;Entries on the &lt;a href="http://blogs.pathf.com/agileajax"&gt;Pathfinder Agile Ajax Blog&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;A private blog where I review books and the like.&lt;/li&gt;&lt;li&gt;Two Twitter accounts (one for book updates, one for me)&lt;/li&gt;&lt;li&gt;Two del.icio.us tags published to blog sidebars.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All of which got neglected during the big book push. &lt;/p&gt;&lt;p&gt;That's clearly an insane amount of stuff to manage, and it was all suffering for it. On top which, dividing blogs between professional and personal/geeky content was not turning out to be pleasant. &lt;/p&gt;&lt;p&gt;That said, I obviously need to continue posting to the Pathfinder blog, what with them paying me and all. So the plan is this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The private blog will no longer be updated. Since it is actually private, I'm pretty much the only person this affects.&lt;/li&gt;&lt;li&gt;Some of the topics that I would have posted there will now come here. I'll try to keep a technical focus (or at least a geekfan focus), but I'll be defining that somewhat more broadly.&lt;/li&gt;&lt;li&gt;However, issues that fall under Pathfinder's purview (meaning Ruby and Agile topics) will be posted there. I'll continue to add links to those articles on this blog.&lt;/li&gt;&lt;li&gt;The twitter account with book updates will no longer be updated -- my "real" account is now the sidebar on this blog.&lt;/li&gt;&lt;li&gt;The old del.iciou.us sidebar is also gone. That content will go into the twitter stream.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The goal is 2-3 Twitter updates a day for links or other short thoughts, and 2-3 larger blog articles a week. Fingers crossed on that last one. Stay tuned.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2866564379700843618?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2866564379700843618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2866564379700843618'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/02/state-of-blog.html' title='State of the Blog'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1671613717719623343</id><published>2008-02-11T11:23:00.001-06:00</published><updated>2008-02-11T11:23:13.569-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Hey, Free Book Samples!</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;As I've mentioned here a few times, I have a book coming out, "Professional Ruby on Rails", available later this month.&lt;/p&gt;&lt;p&gt;If you'd like a sneak peek, Wrox has put some samples online as PDF files. You can also just &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;buy the book&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://media.wiley.com/product_data/excerpt/8X/04702238/047022388X.pdf"&gt;Chapter 1&lt;/a&gt; -- This sets up the sample project used in the book, and talks about the new REST features in Rails.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://media.wiley.com/product_data/excerpt/8X/04702238/047022388X-1.pdf"&gt;Table of Contents&lt;/a&gt; -- Take a look at this to see if your favorite topic is covered.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://media.wiley.com/product_data/excerpt/8X/04702238/047022388X-2.pdf"&gt;Index&lt;/a&gt; -- A more detailed way to see if your favorite topic is covered. Also, maybe you collect indexes... &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I'm not sure if the publisher plans on adding more sample content -- if so, I'll update this post.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1671613717719623343?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1671613717719623343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1671613717719623343'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/02/hey-free-book-samples.html' title='Hey, Free Book Samples!'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6072615443629594417</id><published>2008-01-14T19:22:00.001-06:00</published><updated>2008-01-14T19:22:39.088-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Pre Macworld stuff</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Haven't done an Apple post in a while, just a couple of pregame things I want to get down...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;I would not have projected that the remaining three music companies would go DRM free on all other services just to spite Apple. It's probably their smartest business move in a while, at least for some definition of smart, but it's not exactly consumer friendly. It does make the Amazon store pretty compelling though.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;For what it's worth, I find the Amazon store pretty good for downloading entire albums, but kind of a pain for just grabbing a bunch of unrelated tracks (the iTunes feature of being able to complete the set at the discounted album price is an advantage).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tomorrow's keynote: A new iTunes with rental movies seems to be a forgone conclusion. I would probably use this service, assuming the price and terms were convenient, which I'm kind of skeptical about.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;iPhone SDK is a probable announcement, but I also wouldn't be surprised if it was delayed a bit -- I think the original claim was for February.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The other hot rumor is some kind of subnotebook or tablet or whatnot. Any of the proposed specs sound cool and I suspect they'll sell a skillion of them.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;More tomorrow, when there's actual news.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6072615443629594417?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6072615443629594417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6072615443629594417'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/01/pre-macworld-stuff.html' title='Pre Macworld stuff'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-75946212227570979</id><published>2008-01-13T15:50:00.001-06:00</published><updated>2008-01-13T15:50:27.838-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Publication And Other Updates</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;First off, several pathfinder blog posts to catch up on...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;A two part series on a quick little testing tool that I wrote called testbed. &lt;a href="http://blogs.pathf.com/agileajax/2007/11/live-ruby-testb.html"&gt;Part 1&lt;/a&gt;. &lt;a href="http://blogs.pathf.com/agileajax/2007/12/live-ruby-testb.html"&gt;Part2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2007/12/2008-the-year-i.html"&gt;Predictions for 2008&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2007/12/rspec-and-rails.html"&gt;How to test custom form builders in RSpec&lt;/a&gt;. I wrote this in the hope that somebody else won't have to spend two hours Googling this. Coming soon, "Why I stopped using RSpec..."&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;My contribution to a discussion on duck typing, &lt;a href="http://blogs.pathf.com/agileajax/2008/01/save-that-duck.html"&gt;Save the Duck!&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In Rails book news, I'm now proofreading the final PDF versions of the chapters, which is the first time I get to see the pages in the actual final book layout. Which is pretty cool. I'm correcting them for obvious typos, a couple of things that have changed in the last month since I last proofed the chapters, and code layout issues. Should be back to the publisher by Jan. 18th, and they claim to have the book in their warehouse by about Feb. 12th. &lt;/p&gt;&lt;p&gt;You can still &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;buy your copy in advance&lt;/a&gt; -- that's an affiliate link, in case you care.&lt;/p&gt;&lt;p&gt;In other books, I just got the wxPython statement for the quarter ending Sep, 2007. About 400 net sales, which was about what I predicted, bring it to a total of around 7200.&lt;/p&gt;&lt;p&gt;I also just got a Jython statement, same quarter, with 160 net sales on it, literally the highest it's been in years (a couple of quarters ago, the net sales were 2). I wonder if the fact that the Jython project has started moving forward again had something to do with that. Anyway, this makes it almost plausible that I might actually get a royalty on that book at some time ever.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-75946212227570979?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/75946212227570979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/75946212227570979'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/01/publication-and-other-updates.html' title='Publication And Other Updates'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2462086064225004273</id><published>2008-01-03T13:29:00.001-06:00</published><updated>2008-01-03T13:29:39.473-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Versions: Another promotion from the comments</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Somebody anonymous asks:&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;As most of the currently available books cover Rails 1.2, are you providing the code in the books also as Rails 1.2?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The sample example in the book is Rails 2.0, which was Edge Rails when I started, and I just validated all the tests against 2.0.2 last week when I turned in the finished code samples. Where there's a significant change between 1.2 and 2.0, I tried to note it in the text, but I would want to claim that I got all of them. &lt;/p&gt;&lt;p&gt;That said, most of the techniques in the book are applicable to 1.2 applications, although some tweaking may be needed.&lt;/p&gt;&lt;p&gt;There are a number of reasons for this, but mostly it boils down to a) differentiating from books that are already on the shelf and b) giving the book as long a life span as possible. Maintaining two separate versions of the sample application was not feasible given the time constraints.&lt;/p&gt;&lt;p&gt;Ruby version, for what it's worth, is 1.8.6 -- I felt that 1.9 was too experimental to be working with during most of the writing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2462086064225004273?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2462086064225004273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2462086064225004273'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2008/01/versions-another-promotion-from.html' title='Versions: Another promotion from the comments'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-746224325868632989</id><published>2007-12-30T21:41:00.001-06:00</published><updated>2008-01-02T12:37:57.389-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Professional Rails Online?</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;In response to the commenter who asked if there was going to be a beta book.&lt;/p&gt;&lt;p&gt;UPDATE: Clearly I should ask about these things before I post. Jim Minatel from Wrox added the following in comments:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;There will be a PDF about six weeks after the print book, meaning end of March or thereabouts. There will also be an Amazon Kindle version, eventually.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Also after 6 weeks, the book will be available via Wrox's online subscription service: http://wrox.books24x7.com. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It won't be on Safari, apparently Wrox books aren't part of the deal there (which I actually was kind of wondering about). Meaning I still haven't placed a book there)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I now return you to my earlier, ill-informed, blather...&lt;/p&gt;&lt;p&gt;Unfortunately, I'm pretty sure the answer is no. Not only doesn't Wrox tend to do that kind of thing, at this point, the book is do to go to press in about two weeks, so the amount of time to get feedback would be sharply limited.&lt;/p&gt;&lt;p&gt;At one point, I was told that sample chapters would be available online before release, but I don't have any information on whether there will be an e-book available. I don't think there will be a direct purchase of a PDF, but it seems as though Wiley just joined the Safari book store, and the book might be available there. I'll try and find out for sure this week.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-746224325868632989?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/746224325868632989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/746224325868632989'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/12/professional-rails-online.html' title='Professional Rails Online?'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4943112436684025851</id><published>2007-12-25T22:23:00.001-06:00</published><updated>2007-12-25T22:23:16.578-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Another Publication Update</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Just got the next version of the book chapters for my examination. I'm not 100% sure exactly where these fit in the process. It looks like they've had a good look-see from a copyeditor, largely for style, clarity, and consistency. (Any lingering "we" sentences seem to have been pruned, for example).&lt;/p&gt;&lt;p&gt;They produced a book-specific style guide, which is a listing of canonical forms for things like plugin names, capitalization of commands or tools and the like. It's kind of interesting to see if I can remember where each name or command was used.&lt;/p&gt;&lt;p&gt;Anyway, I'm supposed to have these turned around by Jan 2, so I'm reasonably sure we're still good to go to press in mid-January, and be released in mid-February.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4943112436684025851?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4943112436684025851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4943112436684025851'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/12/another-publication-update.html' title='Another Publication Update'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8677382402724428289</id><published>2007-12-09T22:14:00.001-06:00</published><updated>2007-12-09T22:14:22.281-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Things I Learned</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Some things I learned about Rails and writing while working on this book:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The great benefit of working on a project like this book is that it enabled me to compress about two years worth of research into Ruby and Rails tools into six months. In my case, this was a great opportunity to really dig into some tools to find that I've only been using a fraction of their power and also really get a sense of how elegant and flexible the tools are. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ever since I learned how to type back on an actual typewriter in the mid 80s, I've always followed the old-time typographical convention of two spaces following a period. Which was burned into my fingers despite multiple people telling me that was a silly and counterproductive thing to do in the brave new world of proportional fonts. In fact, on the wx book, I actually did a global search and replace for a period followed by two spaces to get the manuscript to correspond with the publisher's expected conventions. Somehow, I managed to break that habit while writing this book.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The hardest stylistic thing for me to get around was avoiding using "we" and "us". In other books and articles, I tend to introduce examples by saying things like "Now we should type the following" or "Let's see how that's implemented". Wiley/Wrox house style, though is to avoid "we" and write the examples as "Now you should type the following" or "I'll show you how that's implemented". Even more preferred is avoiding the pronoun altogether with "Here's how that's implemented" or "type the following". I'm not saying one way is better or worse -- I find the "we" style to be conversational, the Wiley editors clearly disagree. It did take some getting used to, though.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8677382402724428289?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8677382402724428289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8677382402724428289'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/12/things-i-learned.html' title='Things I Learned'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4592841628165666369</id><published>2007-11-29T10:38:00.001-06:00</published><updated>2007-11-29T10:38:48.357-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>We're In Production Now...</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;I turned in the last chapter of Author Review on Monday, and &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;amp;tag=10prinhell-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=047022388X"&gt;Professional Ruby On Rails&lt;/a&gt; is now in production. Target release date is still mid-February, final page count will be in the range of 450.&lt;/p&gt;&lt;p&gt;I was able to keep the test-first nature of the code going through nearly all of it, which I'm really happy with.&lt;/p&gt;&lt;p&gt;The table of contents looks something like this (in theory, still subject to change...)&lt;/p&gt;&lt;p&gt;Chapter 1: Setting up a new Rails project using REST&lt;/p&gt;&lt;p&gt;Chapter 2: Using Subversion on a Rails project&lt;/p&gt;&lt;p&gt;Chapter 3: Users, secure logins, email authorization, etc...&lt;/p&gt;&lt;p&gt;Chapter 4: Rake, writing build tasks, and using CruiseControl.rb&lt;/p&gt;&lt;p&gt;Chapter 5: Navigation elements, including menus, tagging, search, and pagination&lt;/p&gt;&lt;p&gt;Chapter 6: Database topics, including legacy databases, relationships, and security&lt;/p&gt;&lt;p&gt;Chapter 7: Testing tools: RCov, RSpec, ways to test views and helpers, and so on.&lt;/p&gt;&lt;p&gt;Chapter 8: Rails and JavaScript. Using Rails and Ajax plugins for some common tasks. RJS. Testing RJS.&lt;/p&gt;&lt;p&gt;Chapter 9: ActiveResource, generating and reading XML data, including RSS feeds&lt;/p&gt;&lt;p&gt;Chapter 10: Time and Space. Managing time and time zones, using Globalize for internationalization&lt;/p&gt;&lt;p&gt;Chapter 11: RMagick, ImageMagick, MiniMagick, and other graphic tools. Gruff and Sparkline charts.&lt;/p&gt;&lt;p&gt;Chapter 12: Deployment with Capistrano and Mongrel&lt;/p&gt;&lt;p&gt;Chapter 13: Performance benchmarking and optimization&lt;/p&gt;&lt;p&gt;Chapter 14: Using Ruby metaprogramming in your Rails application&lt;/p&gt;&lt;p&gt;Chapter 15: Using and creating plugins. Testing plugins and generators&lt;/p&gt;&lt;p&gt;Chapter 16: ERB replacements and JRuby&lt;/p&gt;&lt;p&gt;Appendix A: Things to download&lt;/p&gt;&lt;p&gt;Appendix B: Other tools inspired by or similar to Rails&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4592841628165666369?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4592841628165666369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4592841628165666369'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/11/we-in-production-now.html' title='We&amp;#39;re In Production Now...'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-5362357154383925109</id><published>2007-11-29T10:25:00.001-06:00</published><updated>2007-11-29T10:25:15.395-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Two Pathfinder Blog Posts</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Two things on the Pathfinder blog.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2007/11/agile-publishin.html"&gt;Agile Publishing&lt;/a&gt;, on publishing experiences and agile methods.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2007/11/live-ruby-testb.html"&gt;Live Ruby: Testbed&lt;/a&gt;, an attempt to work through a small test and metaprogramming problem live and on the blog.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Enjoy.s&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-5362357154383925109?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5362357154383925109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5362357154383925109'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/11/two-pathfinder-blog-posts.html' title='Two Pathfinder Blog Posts'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-592676909932294622</id><published>2007-11-10T08:53:00.001-06:00</published><updated>2007-11-10T08:53:44.560-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Heads Up</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Wow, I haven't been here for a while. Sorry about that. Here's the deal...&lt;/p&gt;&lt;p&gt;The Rails book initial draft went in about a week ago, more or less on time. (Well, on time for a slightly revised schedule). My understanding of the current schedule is that the author review phase will continue through November. After that, it goes to production, where I get another crack at revising thing that have changed. It goes to press toward the end of January for publication mid-February. If everything continues smoothly.&lt;/p&gt;&lt;p&gt;I'm pretty happy with how it turned out. I think I said almost everything I was hoping to. The main constraint was the tight schedule -- I'm hoping to get some newer features and plugins in during author review.&lt;/p&gt;&lt;p&gt;Oh, and I had another Pathfinder &lt;a href="http://blogs.pathf.com/agileajax/2007/10/switching-back-.html"&gt;blog entry&lt;/a&gt; a few weeks ago. This one is about the CDBaby Rails/PHP thing that was kind of a flap way back then.&lt;/p&gt;&lt;p&gt;That's all for now, I'll try to get back updating the Twitter feed and get back to writing here and on the Pathfinder blog more regularly... Thanks.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-592676909932294622?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/592676909932294622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/592676909932294622'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/11/heads-up.html' title='Heads Up'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8626349347226935192</id><published>2007-09-24T01:02:00.001-05:00</published><updated>2007-09-24T01:02:40.870-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Quick Book Update</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Couple quick things while I have a minute...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Just turned in Chapter 10 (of 16) of the Rails book. Still mostly on schedule for a turn in on October 26, not quite sure what that implies for a print date&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;As I write this, the wxPython book is at 11 thousand and change on Amazon, the highest I've seen in months, which is probably a fluke. Weirdly Amazon says it's the #15 book on "Website Architecture &amp;amp; Usability", which would be great if it was, you know, actually about website architecture usability...&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2007/09/rails-ajax-rjs-.html"&gt;New article up on the Pathfinder blog&lt;/a&gt;. This one is about Rails RJS templates and how to test them. It's partially a book preview, but really only an overlap of subject mat&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There's more, but I'll get it when I have a chance.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8626349347226935192?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8626349347226935192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8626349347226935192'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/09/quick-book-update.html' title='Quick Book Update'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8150905056292211689</id><published>2007-09-10T14:00:00.001-05:00</published><updated>2007-09-10T14:00:47.823-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple Fanboy Stuff</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Naturally, I did have a thought or two about the new Apple products and the other announcements this week:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;While I certainly understand why somebody who had purchased an iPhone early would be annoyed by the price cut, I did find it kind of funny that many of the same analysts who said the iPhone would never sell at its original price were then jumping on Apple for dropping the price.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Every now and then, you'll see an economist writing about how online stores should do more variable pricing -- charging a premium price to customers who are more willing to pay it. This week should be an object lesson in why companies don't do that. Since the people who are willing to pay more are usually your best customers, you run the risk of really ticking them off by making them feel like chumps. Which is generally not considered a good business strategy, I hear.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;My read on the price cut is that it comes from three factors:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;To keep the price in line with the new iPods,  particularly the iPod touch.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Taking advantage of lowered manufacturing costs since they are now making more of the touchscreens.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Really try to drive sales this quarter to take advantage of what Apple perceives as a key moment -- not so much that sales have been disappointing, but that the really are trying to seize the moment.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It could work, although the analogy to Motorola's strategy with the RAZR (gain market share at the expense of profits) is a little disquieting. On the other hand, Apple has a lot of benefits that Moto's cell division didn't, but it's probably not a good idea for me to list them...&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;As for the products themselves, they seem pretty cool. Like just about everybody, I wish they had merged the two iPod models and combined a hard drive with the touch screen. I need to see what the iPod Touch reviews look like in a couple of weeks. It is annoying that Apple seems to have made video out a proprietary cable.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8150905056292211689?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8150905056292211689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8150905056292211689'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/09/apple-fanboy-stuff.html' title='Apple Fanboy Stuff'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7349185202270315469</id><published>2007-09-08T08:59:00.001-05:00</published><updated>2007-09-08T08:59:43.117-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>Boring Software Manifesto</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;Another blog post up on the Pathfinder site. This one is about Agile in general, and features what I think is the World Blog Premiere of the soon to be famous Boring Software Manifesto.&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.pathf.com/agileajax/2007/09/agile-the-contr.html"&gt;Enjoy&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7349185202270315469?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7349185202270315469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7349185202270315469'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/09/boring-software-manifesto.html' title='Boring Software Manifesto'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7032932751795709627</id><published>2007-08-30T11:30:00.001-05:00</published><updated>2007-08-30T11:30:02.583-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>The Rails Edge</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;I was fortunate enough to attend Pragmatic's Rails Edge mini-conference here in Chicago last week. I have two blog posts up on this at Pathfinder, &lt;a href="http://blogs.pathf.com/agileajax/2007/08/the-rails-edge-.html"&gt;the first is made up of quotes from my notebook&lt;/a&gt;, and &lt;a href="http://blogs.pathf.com/agileajax/2007/08/the-rails-edg-1.html"&gt;the second is some general thoughts&lt;/a&gt;. Enjoy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7032932751795709627?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7032932751795709627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7032932751795709627'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/08/rails-edge.html' title='The Rails Edge'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1541624948146762445</id><published>2007-08-30T11:26:00.001-05:00</published><updated>2007-08-30T11:26:54.230-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Pro Rails Book Related Things</title><content type='html'>&lt;!-- Generated by Markdown to HTML in MarsEdit --&gt;&lt;p&gt;A few things I forgot to put in the last book update: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The Amazon listing has the book at 600 pages. That's almost certainly optimistic. The contract calls for 400-500.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;As far as the schedule goes, I'm currently hoping to turn the complete draft in on October 26th, which is about ten days after the original date. The publisher says that pushes publication out to April, six to eight weeks after the original date. I don't quite understand the math, but I suspect that it has to do with the logistics of availability of printing equipment and the like.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Chapter Seven appears to be on track to be delivered this week, which makes the book just a smidge less than halfway done.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1541624948146762445?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1541624948146762445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1541624948146762445'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/08/pro-rails-book-related-things.html' title='Pro Rails Book Related Things'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1253390909133394835</id><published>2007-08-20T10:40:00.001-05:00</published><updated>2007-08-20T10:40:44.166-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pathfinder'/><title type='text'>More On Test-Driven Development</title><content type='html'>My first post to one of Pathfinder's official blogs is up, it's a companion piece to the blog post here on Test-Driven Development, and you can find it &lt;a href="http://blogs.pathf.com/techdev/2007/08/test-driven-dev.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1253390909133394835?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1253390909133394835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1253390909133394835'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/08/more-on-test-driven-development.html' title='More On Test-Driven Development'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8094332126016413622</id><published>2007-08-19T16:50:00.001-05:00</published><updated>2007-08-19T16:50:40.020-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Book Update</title><content type='html'>Here's a couple notes on the current status of the Rails book and life in general.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Rails book is presently just about 30% done -- first payment triggered (yay!). I'm reasonably happy about it so far, though definitely too close to it at the moment to have a clear sense of its quality. I do like the way the test integration is working out -- it seems to help my descriptions of functionality to have the tests there.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The book is now available for preorder on Amazon. &lt;a href="http://www.amazon.com/gp/product/047022388X?ie=UTF8&amp;tag=10prinhell-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=047022388X"&gt;Here's the 10 print "hello" affiliate link&lt;/a&gt;, which will conveniently linger in the sidebar of this blog forever.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;I don't think I ever mentioned this, but the last results I got on the wxPython book (for Q1 2007), showed that sales were starting to slump. Although the data was weird -- US sales were down to about 1/3 of the previous quarter, and US returns were way up, such that net sales were almost zero. At the same time, international sales were way up, with the total affect being a drop to about 1/2 or slightly less from the previous quarter. We've now passed the 6700 mark in total sales.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Apple fanboy stuff: One of the nice features of my new job is that my work computer is now a MacBook Pro. Very nice machine, well designed, very fast. Battery life is decent. Lots of the little design details you've come to expect -- I particularly like the magnetic power cord. Now if only I could use the thing without wearing oven mitts, I think I'd be in business.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;			&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8094332126016413622?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8094332126016413622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8094332126016413622'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/08/book-update.html' title='Book Update'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-9126754240201443872</id><published>2007-08-13T21:20:00.001-05:00</published><updated>2007-08-13T21:20:11.346-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>And Now, A Special Announcement</title><content type='html'>Sorry for the radio silence for the last week or so, but I was waiting to be able to announce this:&lt;br /&gt;&lt;br /&gt;Today I started a new job at &lt;a href="http://www.pathf.com"&gt;Pathfinder Associates&lt;/a&gt;, as a senior software engineer in charge of Ruby on Rails projects. Needless to say, I'm thrilled to be back in the Web game professionally, and even more thrilled to be working on Rails projects.&lt;br /&gt;&lt;br /&gt;Everybody at Pathfinder has been super great so far, and I'm looking forward to doing exciting and fun things.&lt;br /&gt;&lt;br /&gt;I'll also be blogging on their web site roughly once a week, either at their &lt;a href="http://blogs.pathf.com/techdev/"&gt;Technical Development&lt;/a&gt; blog or their &lt;a href="http://blogs.pathf.com/agileajax/"&gt;Agile/Ajax&lt;/a&gt; blog.&lt;br /&gt;&lt;br /&gt;If you happen to be one of the maybe five people who read this blog regularly, don't worry, I'll continue to post here with updates about the book and thoughts about programming and technical publishing that wouldn't quite fit on the Pathfinder site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-9126754240201443872?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/9126754240201443872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/9126754240201443872'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/08/and-now-special-announcement.html' title='And Now, A Special Announcement'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-355923985669295812</id><published>2007-07-27T23:29:00.001-05:00</published><updated>2007-07-27T23:29:08.012-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>A Customer!</title><content type='html'>Well, that's a pleasant surprise. Somebody named Stephen has left a comment. And not one of those spam thingies, but some actual relevant questions about tech publishing.  Answering them seemed like it might be fun..&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;1. I noticed there is a pdf version available of your books. Is this something you or the publisher insisted on? Have people shown an interest for this version or are they still overwhelmingly favouring the hard copy? Aren't you or the publisher afraid that the pdf will end up on shady torrents?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I honestly don't remember an explicit decision being made over whether or not an e-book edition would exist. As far back as I can remember, they wanted one and we wanted one, so no problem. I'd imagine that the publisher's wishes would override the author's in this respect if it came down to it. &lt;br /&gt;&lt;br /&gt;I don't have the Manning contract for the wxPython book in front of me, but the Wiley contract for the Pro Rails book says "the Publisher shall publish the Work in such style and manner as the Publisher deems appropriate", and I think the Manning contract had similar language. &lt;br /&gt;&lt;br /&gt;I'm in favor of offering e-books because they are easy to store, easy to update, and easy to search. From the publisher's standpoint, they have a relatively low cost to produce and people want to buy them, so it's a potentially large win.&lt;br /&gt;&lt;br /&gt;As of the most recent statement I have on the wxPython book, e-book sales are just under 10% of total sales. I suspect that some publishers have much higher percentages -- Pragmatic, for example, really promotes their e-book sales.  The Jython book is not available for sale in an e-book form, not even on O'Reilly's Safari Bookshelf. Which is weird, because they (at least used to) offer a competitors Jython book on there...&lt;br /&gt;&lt;br /&gt;While I'm on the subject, I don't know right now if the Pro Rails book will be available via pdf. Wrox doesn't seem to do pdf much, and I don't know if they plan on starting.&lt;br /&gt;&lt;br /&gt;Funny you should mention torrents, because I relatively recently got an email from Manning that they were trying to get the book removed from a torrent site. So I know it is, or at least has been, out there. I'd say Manning takes this kind of thing pretty seriously, but it obviously hasn't stopped them from providing pdf files. So far, I haven't seen any evidence that this kind of thing is affecting sales, and I'd be very surprised if such evidence presents itself. (Standard Disclaimer -- I don't speak for Manning, and I don't speak for Robin Dunn. If you broadcast a torrent of the book Manning will try and stop you.)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;2. Technical books typically have a short shelf life and would probably benefit from frequent updates (e.g. incorporation of errata, version updates etc.). Wouldn't a more flexible way of publishing, with small, frequent runs (or even an outright on demand model a-la-Lulu) be better?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Yes, I could see where having small, frequent updates could be better for the book reader -- this is essentially what Pragmatic does with their e-books.&lt;br /&gt;&lt;br /&gt;However, the infrastructure and overhead for doing this in printed books would be pretty significant, even with some kind of publish on demand model. At the very least, the cost to print a copy would go up, probably dramatically. Then you have the secondary problems of managing which errata went into which revision, continually updating the layout when needed, dealing with people who want printed books upgraded. The headaches get big quickly.&lt;br /&gt;&lt;br /&gt;That said, something along that model is inevitable, at least for e-books. Eventually, other publishers will have processes as streamlined for this kind of thing as Pragmatic seems to.&lt;br /&gt;&lt;br /&gt;This concludes todays episode of Ask A Guy Who Once Wrote A Book. Tune in next time. I hope there's a next time...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-355923985669295812?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/355923985669295812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/355923985669295812'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/07/customer.html' title='A Customer!'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7019493257395824816</id><published>2007-07-19T20:46:00.001-05:00</published><updated>2007-07-19T20:46:12.707-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>A Little Birdie Told Me</title><content type='html'>In the interests of being able to push out quick updates on the book's progress, I've created a Twitter account for the book. You can follow that account on the sidebar of this here blog, or at http://twitter.com/noelrappinbook -- there's also an &lt;a href="http://twitter.com/statuses/user_timeline/7587862.rss"&gt;RSS feed&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please remember that any and all information about the book is subject to change at whim. Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7019493257395824816?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7019493257395824816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7019493257395824816'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/07/little-birdie-told-me.html' title='A Little Birdie Told Me'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2210205069561372926</id><published>2007-07-19T20:39:00.001-05:00</published><updated>2007-07-19T20:39:59.832-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Book Updates</title><content type='html'>It's been about a week or so of continued radio silence, so I thought I'd pop in with an update.&lt;br /&gt;&lt;br /&gt;I'm in the middle of chapter three of the Rails book. I think it's going well, but nobody other then me has read the chapters yet, so that's easy to say. My first milestone date is the end of the month, and four chapters done -- that's about one-quarter of the entire book.&lt;br /&gt;&lt;br /&gt;I did want to say a few things about how somebody like me comes to be writing a book like this. I was first contacted with this idea in early February. If you're keeping score, that means that this project spent about five months going from a gleam in an editors eye to a signed contract, and it will spend about five months going from a manuscript to a printed book, but only about four months for me to actually spend on the writing.&lt;br /&gt;&lt;br /&gt;Anyway, I have an agency (Studio B) that represents me for technical writing. Sometime in early February, I received an email from them saying that an unnamed major publisher was looking for a writer for a Rails book, and was I interested. I don't know exactly what happened between the agency and the publisher before that, but Studio B is often approached by publishers looking to match an author with a topic.&lt;br /&gt;&lt;br /&gt;I was very interested -- I'd been kind of hoping to do a book on Rails for some time. I talked to an editor at Wiley about what kinds of things they were hoping for and put together a proposal. At the same time, they also expressed interest in a proposal on a different topic, and I did that as well. The proposal contains a description of the market for the book, and a description of the outline. The goal is to convince the publisher that the book is worth doing, and that the author is a good person for the job. In this case, since the publisher had initiated the process, making the case for the book was easier than it might otherwise have been.&lt;br /&gt;&lt;br /&gt;The publisher liked the proposal. But if you were wondering who pays attention to Amazon reviews, I was specifically asked about the difference between the ratings for the Jython book versus the wxPython book, to reassure them that the higher ratings for the wx book were not solely due to the co-author. &lt;br /&gt;&lt;br /&gt;After that, there was some time spent waiting on the two proposals, and which one the publisher wanted to do. At various times, all four possible answers were given (the Rails book, the other book, both, and neither). Eventually, they settled on doing the Rails book. I was informed of that decision in early May, and then my agent and the publisher began negotiating over contract details. I don't think I can really say much about that, but most of the time is not spent on money, but rather on details of which side is responsible for various parts of the finished product beyond the text itself, and who is liable for what if things go wrong (hint: the author is usually liable...) We also settled the length of the book and the schedule.&lt;br /&gt;&lt;br /&gt;Oh, and you know the author pictures that appear on the cover of a Wrox book? Rest assured that the pictures are one very well covered topic in the Wiley/Wrox contract.&lt;br /&gt;&lt;br /&gt;And that's how a bill becomes a law. I'm enjoying working for Wiley so far, the people I've dealt with have been enthusiastic and helpful.  Now, I think this is long enough and I should probably get back to the book itself...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2210205069561372926?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2210205069561372926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2210205069561372926'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/07/book-updates.html' title='Book Updates'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-5517091641299502389</id><published>2007-07-10T00:16:00.001-05:00</published><updated>2007-07-10T00:16:54.152-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Announcing: Professional Ruby on Rails</title><content type='html'>I'm pleased to be able to say that I've contracted for a new book, &lt;i&gt;Professional Ruby on Rails&lt;/i&gt;, scheduled to be available in "early 2008", hopefully February or March. The publisher is Wiley, through the Wrox imprint -- the ones with the red covers and the author's picture on them. Wiley wanted me to be sure and mention that the ISBN number is 9780470223888, so you'll be ready to pre-order it the second that becomes possible.&lt;br /&gt;&lt;br /&gt;The imagined reader of the book is somebody who just finished a beginners book on Rails and is suddenly asked to build a complete public web application. The idea is to cover the kinds of topics that nearly every Rails site will deal with -- things like users and security, performance, deployment, navigation, team development. For each topic, I'll be discussing common solutions, existing tools, emerging standards and so on. There will also be a strong focus on writing tests throughout the book. Hopefully, I'll be able to go into more detail as more of the book is written.&lt;br /&gt;&lt;br /&gt;I'm excited and scared. This is my first solo book, which both simplifies logistics and leaves me without a co-author to catch me when I'm totally off base. I know Rails pretty well, but there's nothing like facing a skeleton book outline to impress upon you exactly how much you don't yet know. Research has been lots of fun, though -- the Rails online community is fantastic. &lt;br /&gt;&lt;br /&gt;Watch this space for more info about the book, the writing process, and anything else related. If you have a question, or if there's a specific feature that you think should be included, please do leave a comment or send me an email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-5517091641299502389?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5517091641299502389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5517091641299502389'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/07/announcing-professional-ruby-on-rails.html' title='Announcing: Professional Ruby on Rails'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7164713867429445348</id><published>2007-06-20T22:23:00.001-05:00</published><updated>2007-10-30T07:07:57.486-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Another IBM Article</title><content type='html'>It's not exactly part five of the four part GWT series, but it is closely related.  Please check out my newest article on IBM Developerworks: &lt;a href="http://www.ibm.com/developerworks/library/os-eclipse-ajaxcypal/index.html"&gt;Simplify Ajax development using Cypal Studio for GWT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I actually wrote this a few months ago, when the tool was still called Googlipse, and the final publication was delayed a bit while I rechecked all the code and instructions, and changed the name throughout.  &lt;br /&gt;&lt;br /&gt;One note: it seems as though the GWT 1.4 release candidates do not currently work with Cypal -- you have to use the GWT 1.3 version.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7164713867429445348?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7164713867429445348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7164713867429445348'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/06/another-ibm-article.html' title='Another IBM Article'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3798443464437811367</id><published>2007-06-14T07:47:00.001-05:00</published><updated>2007-06-14T09:23:30.895-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Didn't I Say I Wouldn't Compare Languages?</title><content type='html'>I posted a version of this to &lt;a href="http://jjinux.blogspot.com/2007/06/ruby-python-programmers-perspective.html"&gt;JJ Behrens' Blog post about Ruby&lt;/a&gt;, and decided it was probably worth also posting here. &lt;br /&gt;&lt;br /&gt;I use and like both Ruby and Python, here's why... &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Things I like about Ruby with respect to Python&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I think Ruby is the only language that gets accessors right.  The thing you want to do 95% of the time -- simple access -- is trivial, and the thing you want to do 5% -- something fancy in your accessor -- of the time is a pretty easy override.  Plus, it's nicely encapsulated, and you never have to wonder if that thing in another class is accessed directly or via a method.  &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Blocks.  I find that my kind of functional style flows pretty easily in Ruby.  It's also not hard to pass named functions.  When I first started with Ruby, it used to bother me that you couldn't tell from a method signature if it took a block, but I've since managed to deal.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Being able to add method to existing classes.  Although I know this really bugs some people, sometimes adding a method to String cleans up the code significantly.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Expression-based syntax.  The implicit return in Python always causes me at least one error per sessions.  Plus I like writing a ternary operator as an actual if statement. &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Things I like about Python with respect to Ruby&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Consistency.  Python enforces it.  As a result, my Python code is more likely to be readable by me six months later.  Ruby tends to be more concise, but some parts of Ruby are still a little too Perlish...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Real keyword arguments (coming to Ruby soon).  The Ruby syntax magic of gathering up map pairs into a hash is sort of annoying.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I find Python's multiple inheritance mechanism to be easier to understand then the Ruby package/module setup.  It always seems like I'm messing up the difference between 'require' and 'include'...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On balance, I prefer Python immutable strings to Ruby's mutable string/symbol split.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3798443464437811367?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3798443464437811367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3798443464437811367'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/06/didn-i-say-i-wouldn-compare-languages.html' title='Didn&amp;#39;t I Say I Wouldn&amp;#39;t Compare Languages?'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8410182165358103597</id><published>2007-06-11T21:13:00.001-05:00</published><updated>2007-06-11T21:34:26.529-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>WWDC Keynote, 2007</title><content type='html'>I think I'll have to join in the general chorus of the underwhelmed.  Bullet points:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The new desktop and finder sure look shiny.  The dock stacks do look kind of useful, and having a dedicated downloads folder strikes me as a classic kind of Apple UI move.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Having the finder be visually similar to iTunes strikes me as, on balance, a good idea.  And, although I don't find Cover Flow tremendously useful in iTunes, I can see a place for it in the Finder.  Especially if you can page through PDF files and other similar tricks.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I don't think the power-user critics of the Finder are going to be much impressed, though.  For one thing, no tabs.  (Come to think of it, I'd like tabs in iTunes, too...)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It was really weird to see so much time spent on features that have already been demoed and known for a year.  I was definitely hoping for more new stuff.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Core Animation looks really cool, and if it's half as easy to use as advertised, there's going to some very pretty Mac apps coming down the road.&lt;/li&gt;&lt;br/&gt; &lt;li&gt;Safari for Windows, which initially sounded kind of weird, actually makes sense to me.  It's probably not a very large development effort, and anything that makes Safari more valuable as a development platform for web developers makes Safari more useful, and by extension, the Mac platform more useful.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I did not have good luck with the Safari betas, though.  Windows side, the beta crashes when I try to set my proxy.  Mac side, the address bar doesn't do anything when you enter an address.  Worse, it broke the nightly WebKit builds that I've been increasingly using as my primary browser, so I had to uninstall.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;As far as I can tell, developers seem to be downright irritated by the non-SDK announcement for the iPhone.  The thing that's not clear to me is whether the webapps would have any hooks at all into the iPhone OS -- at least one of the liveblogs I was following on made it seem like there'd be some nod to tighter integration that a typical web app.  Anybody else get that?  Because otherwise, to go up and make the big announcement that the web, you know, still works even on an iPhone, that's just strange.&lt;/li&gt;&lt;br/&gt;&lt;li&gt;They placed the iPhone announcement for 6PM, which feels more humane than making people stand in line for a 9AM open&lt;/li&gt;&lt;br/&gt; &lt;li&gt;A lot of notable non-mentions: ZFS, iLife, iWork, any hardware, resolution independence, and so on...&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;			&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8410182165358103597?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8410182165358103597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8410182165358103597'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/06/wwdc-keynote-2007.html' title='WWDC Keynote, 2007'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3889195111623714820</id><published>2007-06-09T23:34:00.001-05:00</published><updated>2007-06-09T23:34:56.344-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Programming Perl, Personal Edition</title><content type='html'>Due to circumstances somewhat beyond my control, I find myself working in the largest Perl project I've ever done.  Now, I'm not in the least interested in a "my language is better than your language" deal because a) this strikes me as very well covered territory, and b) it seems particularly pointless as the Perl 6 team appears to be doing a nice job of taming Perl's more rococo features.&lt;br /&gt;&lt;br /&gt;There are, of course, some things I did want to mention...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I'd be totally lost without the very large assistance of Damian Conway's &lt;em&gt;Perl Best Practices&lt;/em&gt; book.  It's an excellent guide to the minefield of all the things Perl lets you do, pointing you to the things you actually should do (especially on a large program).  It's also refreshing to see a Perl book that doesn't treat the ability to write unreadable code as some kind of rite of passage or inalienable right.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I didn't actually intend to use all three homonyms of "write" in that last sentence, but I think I'll leave it in...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;As a result of reading Conway's book, and somewhat in self-defence against my own Perl skills, I seem to be writing the most verbose Perl in the history of the known universe.  I think I may have written more compact Java.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;This is also the first time I've worked this closely with a code-tidy utility, and I think I like it.  Usually, I advise against doing things like lining up equal signs because it's too much work to maintain, but with perl tidy, that's not an issue, and it is more readable.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Perl's cultural insistence on using plain non-jargon words is usually kind of charming, and only occasionally irritating (quick, rank "carp", "cluck", and "croak" in order of severity...)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;My most consistent error to date?  Forgetting to dereference the argument to &lt;code&gt;grep&lt;/code&gt; or &lt;code&gt;map&lt;/code&gt;, which I've been doing at the rate of about twice a day for the past two weeks.  Since the reference gets promoted to a single-element array, this is a little annoying to track down.  Luckily, unit tests were designed for this kind of thing...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I wanted to quick mention a couple of formatting things that Conway recommends in his book that I've never seen in other language's style guides (maybe I should get out more...).  First is the "cuddled else", which is the placement of an else line on the same line as both the close of the if block and the start of it's block: &lt;code&gt;} else {&lt;/code&gt;.  A quick google on the phrase confirms that it's mostly a Perl thing -- I've never seen a non-Perl style guide comment on this.  Conway, and I see that he seems not to be alone in the Perl world, recommends dropping the &lt;code&gt;else&lt;/code&gt; to the next line.  The idea being that it's more visually clear because the &lt;code&gt;else&lt;/code&gt; is now in line with it's close bracket just like any other block.  I had always thought that the Java/C style was there to visually connect the else to the if that had just closed. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Conway also recommends breaking up long lines before the operator, rather than right after an operator.  I'm reasonably sure that's different from almost any other style guide I've ever seen, but I have to say, it works for me.  The idea is that you are more likely to see the visual cue that the line is a continuation if the hanging operator is at the very left of a line rather than the right.  I think it's working for me partially because the split lines look so weird to me that I look more closely to see what's going on.  Whatever the reason, it does seem to be making the code more readable for me.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3889195111623714820?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3889195111623714820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3889195111623714820'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/06/programming-perl-personal-edition.html' title='Programming Perl, Personal Edition'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7836360565200385388</id><published>2007-06-03T23:03:00.001-05:00</published><updated>2007-06-03T23:03:51.880-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iTunes Plus... A Fresh Lemony Scent, Perhaps?</title><content type='html'>Couple thoughts on Apple's first foray into the brave world of non-DRM'd music:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I think the most of the user experience in iTunes is handled nicely.  There had been some worry about this -- I seem to recall some speculation before the EMI announcement that Apple would only take out DRM if they could do it store-wide, and keep things simple.  Anyway, the iTunes Plus branding and the simple option to either always or never see the plus songs seems to work just fine.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;That said, it's very odd that the upgrade songs feature does not allow you to select individual albums or tracks -- it's all or nothing.  That's not a good user experience.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;I'm a little surprised by the album upgrade, as well.  Since they seem to have mostly held the line on the $9.99 album even for Plus albums, it's not completely clear to me why I have to spend $3.00 to upgrade my old $9.99 album to a new $9.99 album.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;I do hear some difference in sound quality on the new tracks.  Granted that a) I know that there's &lt;em&gt;supposed&lt;/em&gt; to be a difference, b) I have really cheap sound equipment and c) not exactly professional-quality audiophile ears.  Even so, it seemed to me that sharp sounds like percussion and acoustic guitar seem to pop out of the background a little more.  The effect is more obvious in my car than on my cheap headphones.  Go figure. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The big controversy, of course, is the fact that account information is still embedded in the non-DRM files.  (Unless I'm mistaken, that information was in the DRM files, so before we get all conspiracy theory we should at least consider the possibility that it was either overlooked, or a pain to remove for some reason).  I was amused to see two different blogs where the blogger breathlessly posted this dastardly information only to have commenter after commenter say it isn't that big a deal.  Which it isn't &amp;mdash; it's not like Apple removing DRM from the music somehow changed copyright law...  I'll grant that it's always a little creepy to find a personal infobit somewhere you don't expect it, but I'm having a hard time getting worked up over it, especially since I expect it'll be fully hacked by the time I finish typing this sentence.  &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;			&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7836360565200385388?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7836360565200385388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7836360565200385388'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/06/itunes-plus-fresh-lemony-scent-perhaps.html' title='iTunes Plus... A Fresh Lemony Scent, Perhaps?'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3334096589920904045</id><published>2007-05-30T23:29:00.001-05:00</published><updated>2007-05-30T23:29:02.305-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editors'/><title type='text'>Text Auditor</title><content type='html'>I hate Microsoft Word.  I feel that I came by this rightfully, after a whole book's worth of numbered lists that refused to line up, images that refused to stay put, and the truly irritating indexing interface.&lt;br /&gt;&lt;br /&gt;For a long time I'd sort of rant about how word processing was this core user task and we still couldn't figure out the right UI for it.  I'm not totally backing off that, although I've also read people ranting that text editing was solved 20 years ago by Emacs and Vi, and there's no point in looking at anything new, which achieves a level of crankiness that makes me look calm.&lt;br /&gt;&lt;br /&gt;What occurred to me as I was thinking about writing about text entry and UI was the sheer number of different programs that I use for various kinds of word processing or text editing.  Most of these are optimized for a specific set of activities, and do that particular job well enough that it's worth learning a new program in order to get that benefit.  &lt;br /&gt;&lt;br /&gt;More and more, I find myself also using tools that help me with text cross-applications, like generic text expansion tools, or clipboard history tools, or even monster aggregators like Quicksilver.  Put that way, it sounds a little bit like the OpenDoc dream, where your spell checker would come from one place, and your text editor from another, and the font manager in from another.  But OpenDoc was about components instead of applications and looking at the list below, it's pretty clear that applications aren't going away anytime soon...&lt;br /&gt;&lt;br /&gt;So here's a list of all the apps I can think of that I do some kind of text edit in, with some comments.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adium/Pidgin&lt;/b&gt; -- IM Clients (Adium Mac side, Pidgin in Windows, plus another couple for internal work things).  None of these has a ton of text editing support, although I do wind up typing a fair amount of text into them over the course of day.  Pidgin has a great name, but I really wish it had one piece of AIM functionality, namely the ability to read text in a different size then you send it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Eclipse&lt;/b&gt; -- Currently it's my Windows side Ruby/Rails editor of choice, although I'll probably change my mind six more times before I settle on something.  It's also my Windows Perl editor of choice, as it seems to be the only free editor that does syntax checking.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;GMail/Google Docs&lt;/b&gt; -- Gmail, obviously, used for email, although I do sometimes use it as quick storage for text I want to be able to work on from multiple locations.  You're supposed to use Google Docs for that kind of thing, and I do, sometimes.  It's great for collaborating (we used it for final notes on the manuscript for the wx book, for example).  But for normal use, it's just a hair too unresponsive, and the UI is just a touch awkward within the browser.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IntelliJ IDEA&lt;/b&gt; -- Java editor of choice.  Still the most fully featured of the big Java IDE's, although the other's are catching up.  A big memory hog, though.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;jEdit&lt;/b&gt; -- Window's side default text editor, especially for Python.  Been using it for years.  Very nice feature set, I'm used to the controls, decent syntax coding for the languages I use.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Jer's Novel Writer&lt;/b&gt; -- I don't use this as much as I'd like, but I'm putting it in here as a great example of tuning a text entry program to a specific use.  In this case, writing fiction.  Nice features include easy annotating and the ability to specify separate display and printing formats -- very useful for keeping your print document in manuscript format.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MarsEdit&lt;/b&gt; -- Well, I'm writing this post in it.  Mac side editor of choice for blog posts.  Why did I spend $25 on this when it's functionality is pretty easily replicated from TextMate?  Good question.  It's got a very clean UI, and I like that it previews while you type.  And if I need to do something fancy, it interfaces with TextMate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MS Word&lt;/b&gt; -- Windows word processor when forced to use it.  Word actually isn't that that bad if you stay within the confines of a four-page office memo.  Once you add styles, though, it's a mess.  Actually, I don't think anybody's really solved the UI for a WYSWIG styles system -- which is one reason why I use HTML, Textile, or Markdown where I can.  I feel like I have much greater control over the styling if it's all in text.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NeoOffice&lt;/b&gt; -- Mac side word processor of choice, although I rarely use it for the reasons given above.  I've gone through all the free or free-to-try alternative word processors on the Mac, and NeoOffice is the one I keep coming back to (especially since the newest version, which fixed some performance issues).  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Outlook&lt;/b&gt; -- Windows email program.  Possibly the worst styled text email editor around.  I think it's the only one that, if you insert a paragraph in the middle of a quote from a previous email, keeps the quote formatting on your new text.  This is, shall we say, not helpful.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PowerPoint&lt;/b&gt; -- I guess it's a text editor, of sorts.  This is here mostly for a mini-rant... I know that everybody says that effective presentations should have minimal text on each slide.  I even agree.  But... in many environments, including lectures and a lot of corporate situations, the slides become a &lt;i&gt;de facto&lt;/i&gt; deliverable to people who are unable to make the original meeting.  If you don't have enough text for those people to follow along, they will get angry...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TextMate&lt;/b&gt; -- Mac side programmer editor of choice.  I tried a number of different editors when I switched to Mac and realized that jEdit didn't really play nicely with OS X.  I find the TextMate UI to be unusually clean, and it's the most powerful and extensible text editor not written in Lisp.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;VoodooPad Lite&lt;/b&gt; -- Mac desktop Wiki application.  I'd probably use this more if my daily work were Mac side.  It's very nicely done.&lt;br /&gt;&lt;br /&gt;That's a lot of applications.  I'm pretty sure I missed some, at that.  I think my point is that specialization is the way to solve the text UI dilemma.  Still, needing 13+ apps to solve my basic text entry needs.... seems less than optimal somehow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3334096589920904045?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3334096589920904045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3334096589920904045'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/05/text-auditor.html' title='Text Auditor'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4162315703060088138</id><published>2007-05-28T08:54:00.001-05:00</published><updated>2007-05-28T08:55:20.793-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>A Program Note</title><content type='html'>This is for the two or three of you that are subscribed to this blog via RSS feed -- I've just added a FeedBurner feed, and if it's not too much trouble, it'd be great if you could switch over to it at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://feeds.feedburner.com/10Printhello"&gt;http://feeds.feedburner.com/10Printhello&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The "Subscribe" link in the sidebar will also work.&lt;br /&gt;&lt;br /&gt;Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4162315703060088138?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4162315703060088138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4162315703060088138'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/05/program-note.html' title='A Program Note'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-602770465028019785</id><published>2007-05-25T00:06:00.001-05:00</published><updated>2007-05-25T00:06:16.342-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>An Agile Musing</title><content type='html'>Of course, since I muse in an agile way, I reserve the right to change my mind based on future developments...&lt;br /&gt;&lt;br /&gt;Software development usually takes place in a complex environment where your goal can change quickly.  In general, there are two ways to deal with a complex environment.  One is to try to anticipate, in advance, every possible permutation you might need to deal with, and the other is to manage your environment with the flexibility to respond to new challenges with minimum effort.  Software is just a specific case where that challenge plays out.&lt;br /&gt;&lt;br /&gt;Of course, being software engineers, we've given these approaches names.  They are &lt;a href="http://www.satisfice.com/blog/archives/45"&gt;nicely defined by James Bach&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;agile methodology&lt;/b&gt;: a system of methods designed to minimize the cost of change, especially in a context where important facts emerge late in a project, or where we are obliged to adapt to important uncontrolled factors.&lt;br /&gt;&lt;br /&gt;A &lt;b&gt;non-agile methodology&lt;/b&gt;, by comparison, is one that seeks to achieve efficiency by anticipating, controlling, or eliminating variables so as to eliminate the need for changes and associated costs of changing.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It seems worth pointing out that, at least in theory, there's no reason why you can't both make a reasonable effort to find potential changes up front, and still make your working environment as flexible as possible.  &lt;br /&gt;&lt;br /&gt;In practice, of course, this is kind of difficult to do well.  There's a logistics problem -- the kinds of things you do when you're trying to control change up front generally involve creating a lot of models and documentation and the like.  This is exactly the kind of thing that works against minimizing the cost of change.  But it seems to me that a group determined to do some up front analysis of what will largely be an agile process could manage to work around that.&lt;br /&gt;&lt;br /&gt;The bigger problem is an issue of mindset -- if you think that you can solve all your design problems up front, then you start to look at any change to the design or implementation with suspicion.  At that point, any change is, by definition, a mistake of some kind.  Which leads to suspicion of all changes and can mean all kinds of tracking and procedural overhead that pushes up the cost of change.  The sort of organic, bottom-up design that you get from test-first and tight iterations doesn't fit in this model at all.&lt;br /&gt;&lt;br /&gt;Although I should say that in my experience trying to get groups to adopt XP or agile practices over several different companies is that nearly all programmers and managers agree that automated tests are a good thing.  Most programmers are at least willing to consider the idea of test-first, although getting somebody to do it consistently is tough (hey, it's tough even for somebody who's totally bought into it).  &lt;br /&gt;&lt;br /&gt;The resistance I do get tends to be around the idea that you can start programming with an incomplete design without it leading to disaster.    &lt;br /&gt;&lt;br /&gt;Waterfall-style up front design can be incredibly seductive.  You're brainstorming with other smart people, you're solving all your problems before they even come up.  It certainly feels like you are doing something vitally important to the success of your project.  Even if you know that many of the decisions will later be revised in implementation, it still feels good to have that crisp UML diagram.  You can't have bugs in a UML diagram.  The issues that do get solved in design are assumed to justify the time cost of the design, because the assumption is that the time cost of later improvements will be much larger (which is true, in part, because of the amount of design work). &lt;br /&gt;&lt;br /&gt;In contrast, starting coding with incomplete information can feel risky, especially the further you get from the actual implementation team.  Any issue that gets changed later can be blamed on the relative lack of design, true or not, and the time savings from not doing as much design can be invisible.  It's very hard to let go of the idea that all your design problems can be solved up front.  But once you are willing to allow that some problems can only be solved in the moment, you're much better equipped to deal with the inevitability of change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-602770465028019785?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/602770465028019785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/602770465028019785'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/05/agile-musing.html' title='An Agile Musing'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1590781527761870551</id><published>2007-05-16T23:03:00.001-05:00</published><updated>2007-05-16T23:03:22.391-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>State of the Art</title><content type='html'>O'Reilly Radar has been &lt;a href="http://radar.oreilly.com/archives/2007/05/state_of_the_co_10.html"&gt; analyzing the state of the computer book market&lt;/a&gt; on a quarterly basis for a couple of years now.  &lt;br /&gt;&lt;br /&gt;This link is to a drill-down into the Q1 2007 results for programming languages.  The information is of some passing interest to me, both as an author and as language geek.  &lt;br /&gt;&lt;br /&gt;Things that jumped out at me.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ruby is up a ton, and is now selling more than Perl and Python combined.  There are now as many Ruby books in print as there are Python books.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Two of the top five books are Rails, with number one being PragProg's &lt;i&gt;Agile Web Development with Rails&lt;/i&gt;.  Two of the remaining five are Head First books.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;But Javascript sells almost twice as many books as Ruby, and is also growing quite a bit.  I still see the occasional thought that Javascript will escape the browser and become the language of the future.  It certainly seems to be gathering the base.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The numbers have just under 10,000 Python books sold in Q1 2007.  I don't have the wxPython book numbers for that quarter yet -- results to authors are delayed a quarter, but that means that the wx book was roughly 10% of the overall Python market.  I can't decide if that surprises me or not.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;It's funny how your personal perspective skews expectations.  In the abstract, I know there have to be a lot of Microsoft shops out there, but I've never worked at one, so it's surprising to see C# and .NET so high on the list.  I'm currently surrounded by a lot of IT Perl experts, so it surprises me a little to see Perl so low, even though it probably shouldn't.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1590781527761870551?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1590781527761870551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1590781527761870551'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/05/state-of-art.html' title='State of the Art'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7078826990991791781</id><published>2007-05-13T23:04:00.001-05:00</published><updated>2007-05-13T23:05:22.530-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>from internet import *</title><content type='html'>Three posts that caught my eye today.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Ruby School&lt;/h4&gt;&lt;br /&gt;Gregory Brown over on O'Reilly net &lt;a href="http://www.oreillynet.com/ruby/blog/2007/05/ruby_academically_viable.html"&gt;has an article about using Ruby in Computer Science courses&lt;/a&gt;, at least in later algorithm classes.  It's not a bad argument, but I think it'd be more convincing if the Ruby example was a little cleaner and easier to read compared to the pseudo-code.&lt;br /&gt;&lt;br /&gt;Let's see... The last time I had to care about this issue was about eight years ago when my grad institution was going through a somewhat controversial revamp of the CS curriculum.  The fight, as always, is between the theorists and the pragmatists.  The theorists want to teach a lot of "pure" CS up front -- Turing machines, big "O" analysis, computational theory, that kind of thing.  The pragmatists want the students to be able to get jobs.&lt;br /&gt;&lt;br /&gt;You should know that I spent the better part of three years as part of a group working with an object-oriented class that we taught in Squeak Smalltalk.  Lovely language, to be sure, but we had to spend part of every course explaining to some nervous students why we weren't teaching them C++ or Java...&lt;br /&gt;&lt;br /&gt;At the time, the initial CS classes were moving to Java, with some relief.  This is because a) nobody wanted to inflict C or C++ on unsuspecting new CS majors, and b) the previous most common language, Pascal, was woefully obsolete.  Java is reasonably straightforward to teach and is actually used in real programs, both high points. &lt;br /&gt;&lt;br /&gt;Personally, I think you can make a pretty nice case for a scripting language like Python or Ruby in the initial CS class.  They are both pretty easy to get started with, the syntax is clean enough that algorithms are easy to visualize (which was Brown's original point).  In Python you can do it without introducing objects (which most CS1 classes didn't do eight years ago, don't know if that's changed).  In Ruby it's easy to teach meta-programming.  &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Cha-Ching&lt;/h4&gt;&lt;br /&gt;Paul Julius of ThoughtWorks about &lt;a href="http://studios.thoughtworks.com/2007/5/10/continuous-integration-in-the-enterprise-with-cruisecontrol"&gt;how CruiseControl can save you $12,535 per broken test&lt;/a&gt;.  The money coming from the difference between the cost of fixing a bug immediately versus not catching the bug until integration testing.&lt;br /&gt;&lt;br /&gt;I dunno.  I love continuous integration, and would shout about it from the rooftops if they'd let me on the roof, and that number still sounds a bit more "look what I can do with numbers" than "look what I can do with Continuous Integration".  But then I'm skeptical of nearly every numerical analysis of programming productivity.  &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Plus, Marshmallows&lt;/h4&gt;&lt;br /&gt;Over at Roughly Drafted, Daniel Eran &lt;a href="http://www.roughlydrafted.com/RD/RDM.Tech.Q2.07/0ADA49EA-93A2-4960-BAAC-2257C9DBD32F.html"&gt;goes on about the smooth, harmonious relationship between Apple and Sun.&lt;/a&gt; Naturally, I want to talk about one of his sidebars...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The name of Apple's Mac OS X frameworks was even named Cocoa in part to associate it with Sun's Java. The other reason was that Apple already owned the Cocoa trademark, having using it earlier for a children's programing environment. &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You know, I've always wondered about that.  The original Cocoa was a project that was being worked on in Apple's Advanced Technology Group the summer I interned there, plus it some buzz in Educational Technology circles for a while.  Internally, it was called KidSim, but the name was changed to Cocoa when it was being prepared for release.  Java was programming for grown-ups, so Cocoa was programming for kids.  It seems like Apple isn't really using that connotation of the name anymore.&lt;br /&gt;&lt;br /&gt;The project (now called &lt;a href="http://www.stagecast.com"&gt; Stagecast Creator&lt;/a&gt;) is a graphical rule-based programming language, something like a cellular automata program.  The user specifies an initial arraignment of sprites on the screen, then specifies how that arrangement should change in the new time slice.  Complex programs could be created with almost no typing (although, like all such programs, you still had to use drawing tools to create your own sprites -- that was still hard).  Stagecast still seems to be around, although it's been ages since I tried the software.  It was pretty cool, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7078826990991791781?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7078826990991791781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7078826990991791781'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/05/from-internet-import.html' title='from internet import *'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6801825681461443478</id><published>2007-05-03T23:39:00.001-05:00</published><updated>2007-05-03T23:41:13.353-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Comment On This</title><content type='html'>So the other day I'm looking over some code, and I see this... (slightly paraphrased to protect the innocent -- in the original, the declaration and the getter were, of course, separated.)&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt; * The name of the user&lt;br /&gt; */&lt;br /&gt;private String m_userName;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @return The name of the user&lt;br /&gt; */&lt;br /&gt;public String getUserName() {&lt;br /&gt;    return m_userName;&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And I thought, "I really hope some of that was generated by the editor"&lt;br /&gt;&lt;br /&gt;And then I thought, "This is why other languages make fun of Java"&lt;br /&gt;&lt;br /&gt;And I finally ended up with, "Most of what beginning programmers are taught about comments is useless".  At least that was true when I was in school.&lt;br /&gt;&lt;br /&gt;For the moment, I'll put aside the Java issue, to talk more generally about comments.&lt;br /&gt;&lt;br /&gt;First though -- we're agreed the example is absurd, right?  In that it repeats that the user name is, in fact, the user name five times.  Which is at least four more than strictly necessary (I realize that Java more or less forces some of this duplication).  &lt;br /&gt;&lt;br /&gt;I realize that this is hardly the worst coding sin you can commit, but when I look at code like that I do think that either the programmer isn't quite sure which parts of his code are most important or that the person is rigidly following an overly formal standard.  Neither of which is all that flattering.   &lt;br /&gt;&lt;br /&gt;About 95% of the time, it seems like you either get no comments, or the kind of useless comments in the example.  Given the choice, I'd rather have no comments -- it's less distracting, and you can see more code at once.&lt;br /&gt;&lt;br /&gt;However, you can do comments effectively.  Here's what I think, which should not ever be confused with what I actually do.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The best commenting is clear and accurate names for your variables, functions, and classes.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The "No Duplication" rule applies to comments at least as much as it does to code.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Possibly more, since no compiler is ever going to catch if your comments fall out of sync with your code.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Therefore, under normal circumstances, comments should avoid repeating what the code does.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;However, limitations on input or output values that are not apparent from the code should be included in comments.  If the user name was guaranteed to be under ten characters because of the underlying database, that would be a useful comment.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Rationales for choosing a particular implementation are often good comments, as is the code's place within the larger program.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;If you find yourself commenting inline within a long method to explain what the next section does, odds are you'd be better of extracting that to a well-named method and skipping the comment.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;There is a cost to commenting -- it takes time to do well, and it can be distracting.  It also limits the amount of code you can read at once.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The most obvious exception to all of the above is when you are in a situation where people will read your comments without ready access to the source code.  Writing an API or a framework, for example.  In that case, most of the issue about duplication doesn't apply and you need to be descriptive for the benefit of users who will only see your JavaDoc or RDoc.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;However, none of that excuses writing a one line comment for &lt;code&gt;getUserName()&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6801825681461443478?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6801825681461443478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6801825681461443478'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/05/comment-on-this.html' title='Comment On This'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1486848426778783755</id><published>2007-04-23T17:03:00.001-05:00</published><updated>2007-10-30T07:06:45.305-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Fame and Fortune 2</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;To continue on the fame and fortune theme, I just got the first part of the statement wrapping up the first year of the wxPython book.  (Since the book came out at the end of March, we got a first quarter statement which covered the first 10 days of the release).  Anyway, I'm pleased.  The fourth quarter statement was only about 5% down from the third quarter (I don't have the exact numbers).  This is rather amazing to me, since the Jython book dropped about 50% from quarter to quarter over its first year.  I think, but am not 100% sure, that the wx book has now outsold the Jython book.  If it hasn't now, it will next quarter.&lt;br /&gt;&lt;br /&gt;Which makes this a good place to again thank all the people who have bought the book, read the book, and said nice things about the book.  It's all appreciated.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1486848426778783755?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1486848426778783755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1486848426778783755'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/04/fame-and-fortune-2.html' title='Fame and Fortune 2'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4949508636988085328</id><published>2007-04-10T20:58:00.001-05:00</published><updated>2007-04-10T20:58:29.939-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Fame And Fortune</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Well, the Jython Book celebrated it's fifth anniversary with a royalty statement showing that it had sold the grand total of two copies over the previous quarter.&lt;br /&gt;&lt;br /&gt;I think it might be played out.  O'Reilly's statements don't give total accumulated sales count, just total accumulated royalties.  I think it sold just on the low side of 6,000 copies, and is something like 500 short of earning out.&lt;br /&gt;&lt;br /&gt;Meantime the wxPython book still seems to be holding it's Amazon rank, so I'm very curious what the next sales total is going to be.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4949508636988085328?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4949508636988085328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4949508636988085328'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/04/fame-and-fortune.html' title='Fame And Fortune'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8688838616485274903</id><published>2007-03-28T21:15:00.001-05:00</published><updated>2007-03-28T21:16:13.325-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='examples'/><title type='text'>Posting to Blogger via Ruby</title><content type='html'>TextMate has what seems to be a very nice blogging bundle for programmatically sending posts to your blogging engine of choice. Except that it doesn't work for the new Blogger API. Or at least it didn't the last time I checked. Mostly I just wanted to see if I could write my own script to send to Blogger.&lt;br /&gt;&lt;br /&gt;This is a Ruby script based on the Python script located at &lt;a href="http://djcraven.blogspot.com/2006/10/success-posting-to-blogger-beta-using.html"&gt; http://djcraven.blogspot.com/2006/10/success-posting-to-blogger-beta-using.html &lt;/a&gt; -- the author of that script did the heavy lifting in terms of the GData API calls, what I did was translate it into Ruby in a somewhat more flexible structure. At least I hope so. I also hope this will look like decent, idiomatic Ruby and not like a horrific hack. And I'd like a pony. If you're asking.&lt;br /&gt;&lt;br /&gt;Let's do this in pieces. The first piece of the puzzle is using the Google ClientLogin API to get an authentication token. The token is then passed as a parameter to later calls when we actually want to post something. Google says that the lifespan of the token is dependent on the application being used, but I don't see where they specify how long Blogger keeps them.&lt;br /&gt;&lt;br /&gt;Here's the start of our class. We're in a module called &lt;code&gt;Blogger&lt;/code&gt; and a class called &lt;code&gt;Blog&lt;/code&gt;. I've got an external dependency here on &lt;code&gt;BlueCloth&lt;/code&gt; because I'm also going to automatically translate Markdown later, but that's not something you need to do...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  module Blogger&lt;br /&gt;&lt;br /&gt;    require &amp;apos;net/https&amp;apos;&lt;br /&gt;    require &amp;apos;net/http&amp;apos;&lt;br /&gt;    require &amp;quot;uri&amp;quot;&lt;br /&gt;    require &amp;quot;bluecloth&amp;quot;&lt;br /&gt;&lt;br /&gt;    class Blog&lt;br /&gt;&lt;br /&gt;      attr_accessor :account, :password, :blogid&lt;br /&gt;&lt;br /&gt;      @@auth_url = &amp;quot;www.google.com&amp;quot;&lt;br /&gt;      @@auth_path = URI.parse(&amp;apos;/accounts/ClientLogin&amp;apos;)&lt;br /&gt;&lt;br /&gt;      def http&lt;br /&gt;        http = Net::HTTP.new(@@auth_url, 443)&lt;br /&gt;        http.use_ssl = true&lt;br /&gt;        http&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      def request_data&lt;br /&gt;        [&amp;quot;Email=#{account}&amp;quot;, &lt;br /&gt;         &amp;quot;Passwd=#{password}&amp;quot;, &lt;br /&gt;         &amp;quot;service=blogger&amp;quot;, &lt;br /&gt;         &amp;quot;service=TestCompany-TestApp-0.0&amp;quot;].join(&amp;quot;&amp;amp;amp&amp;quot;)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      def auth_headers&lt;br /&gt;        {&amp;apos;Content-Type&amp;apos; =&amp;gt; &lt;br /&gt;            &amp;apos;application/x-www-form-urlencoded&amp;apos;}&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      def auth_token&lt;br /&gt;        response, data = http.post(@@auth_path, &lt;br /&gt;            request_data, auth_headers)&lt;br /&gt;        return nil unless response.code == &amp;apos;200&amp;apos;&lt;br /&gt;        data.match(/Auth=(\S*)/)[1]&lt;br /&gt;      end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After the setup lines, we've got three methods here. The first two define the data objects. The first one creates a Ruby HTTP object, set up for an HTTPS connection to the Google ClientLogin URL. The second builds the request data string, tying together the four pieces of data into a single string. They are both used in the auth_token method -- I'm taking advantage of one of my favorite features of Ruby, which is the lack of distinction between local variables, no-argument methods, and data field getters.&lt;br /&gt;&lt;br /&gt;So, &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;request_data&lt;/code&gt;, and &lt;code&gt;auth_headers&lt;/code&gt; are just dropped into the &lt;code&gt;auth_token&lt;/code&gt; code as if they were local, even though they are separate methods. To me, that makes the code read cleanly, and encourages moving small bits out to separate methods where they can be separately tested and documented.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;auth_token&lt;/code&gt; itself takes the path, the request_data, and the headers, and uses the HTTP object to make a secure post call. Request data, by the way, has account and password information that I'm assuming would be defined in an abstract subclass of this Blog class. If the response code is 200, we're good to go, and we do a little regular expression magic to extract and return the authentication token.&lt;br /&gt;&lt;br /&gt;We use the authentication token in our actual post call, the one that contains the blog post itself.  We need to build up the XML Atom document to send to the Blogger server.  Step one is to get the data.  Since I'm going to be doing this from TextMate, I'm going to assume we're going to start with the file name that will eventually be provided by the TextMate command.  First, we'll convert it to an array of lines.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def read_data(filename)&lt;br /&gt;      text = open(filename) { |f| f.readlines }&lt;br /&gt;    end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In case it's not already clear, this method and the ones that follow are all parts of the &lt;pre&gt;Blog&lt;/pre&gt; class.  We're splitting this into lines to facilitate some processing of the text.  I'm assuming that the first line of my file will be the title of the post, the second line will be a comma-delimted list of category labels, and the remainder of the file will be the body, written in Markdown.  Obviously, that specific format is a weird quirk of the particular blog I'm posting to, which is set up to take XML and not to preserve blank lines.  In your case, do whatever you need to do.  Building that data structure&lt;br /&gt;is quite simple in Ruby.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def build_data(lines)&lt;br /&gt;      categories = lines[1].split(&amp;quot;,&amp;quot;).map {|c| c.strip}&lt;br /&gt;      body = BlueCloth.new(lines[2..-1].join(&amp;quot; &amp;quot;)).to_html&lt;br /&gt;      data_xml(lines[0], categories, body)&lt;br /&gt;    end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The last line of &lt;code&gt;build_data&lt;/code&gt; calls the &lt;code&gt;data_xml&lt;/code&gt; method that builds up the XML document:  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def data_xml(title, categories, body)&lt;br /&gt;      result = []&lt;br /&gt;      result &amp;lt;&amp;lt; &amp;quot;&amp;lt;entry xmlns=&amp;apos;http://www.w3.org/2005/Atom&amp;apos;&amp;gt;&amp;quot;&lt;br /&gt;      result &amp;lt;&amp;lt; &amp;quot;  &amp;lt;title type=&amp;apos;text&amp;apos;&amp;gt;#{title}&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;      for cat in categories&lt;br /&gt;        result &amp;lt;&amp;lt; &amp;quot;  &amp;lt;category scheme=&amp;apos;http://www.blogger.com/atom/ns#&amp;apos; &amp;quot;&lt;br /&gt;        result &amp;lt;&amp;lt; &amp;quot;            term=&amp;apos;#{cat.strip}&amp;apos;/&amp;gt;&amp;quot;   &lt;br /&gt;      end&lt;br /&gt;      result &amp;lt;&amp;lt; &amp;quot;  &amp;lt;content type=&amp;apos;xhtml&amp;apos;&amp;gt;&amp;quot;&lt;br /&gt;      result &amp;lt;&amp;lt; body.to_s&lt;br /&gt;      result &amp;lt;&amp;lt; &amp;quot;  &amp;lt;/content&amp;gt;&amp;quot;&lt;br /&gt;      result &amp;lt;&amp;lt; &amp;quot;&amp;lt;/entry&amp;gt;&amp;quot;&lt;br /&gt;      result.join(&amp;quot;\n&amp;quot;)&lt;br /&gt;    end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I was going to use the REXML library for this -- normally I'm a big fan of building XML programatically.  However, REXML really, really didn't like it when the included content contained HTML tags.  So I decided it'd be much less aggravating to build the XML from scratch.  Details on the syndication format can be found in the GData and Atom online docs.  &lt;br /&gt;&lt;br /&gt;Once we can create the data, we can finally make our post:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    def post_headers&lt;br /&gt;      {'Content-Type' =&gt; 'application/atom+xml', &lt;br /&gt;          'Authorization' =&gt;"GoogleLogin auth=#{auth_token}"}&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def uri&lt;br /&gt;      "http://www.blogger.com/feeds/#{blogid}/posts/full"&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def post(lines)&lt;br /&gt;      response, content = http.post(uri, build_data(lines), post_headers)&lt;br /&gt;      while response.code == '302'&lt;br /&gt;        response, content = http.request(response.location, entry.headers)&lt;br /&gt;      end&lt;br /&gt;      return response.code == '201'&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def post_file(filename)&lt;br /&gt;      post(read_data(filename))&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end # of module&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Couple things to point out here.  First, we call &lt;code&gt;auth_token&lt;/code&gt; directly when we're building up our header in preparation for the call -- so that's when we perform the HTTPS login shown above.  The while loop takes care of following along if Blogger decides to redirect the post.  Finally, we return true if Blogger sends us an OK response code 201, meaning the post has been successfully added.  &lt;br /&gt;&lt;br /&gt;To use this, you need to set up your own subclass of Blog with the expected information, for example.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; class MyBlog &amp;lt; Blog&lt;br /&gt;   def initialize&lt;br /&gt;     @account = "YOUR_GMAIL_HERE"&lt;br /&gt;     @password = "YOUR_PASSWORD_HERE"&lt;br /&gt;     @blogid = "YOUR_BLOG_ID"&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As written, that would be included in the &lt;code&gt;Blogger&lt;/code&gt; module, otherwise, you'd need to qualify the name &lt;code&gt;Blog&lt;/code&gt;.  The invocation of the whole thing looks like this.  This assumes that the filename with the post is in &lt;code&gt;ARGV[0]&lt;/code&gt;, placed there by TextMate.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;p Blogger::MyBlog.new.post_file(ARGV[0])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One problem, though.  We're making an HTTPS connection for authentication to keep our password secure, but including the password in plain text in the script file.  Good point.  There's a cool way around that in TextMate, and probably&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8688838616485274903?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8688838616485274903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8688838616485274903'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/03/posting-to-blogger-via-ruby.html' title='Posting to Blogger via Ruby'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8196007065242542424</id><published>2007-03-21T00:28:00.001-05:00</published><updated>2007-03-21T14:15:45.336-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='editors'/><title type='text'>Rubies in My Coffee</title><content type='html'>Now two of the big Java IDE's are promoting Ruby language tools as a big thing.  IntelliJ has a plugin in early beta, and NetBeans is also making a big deal of their new early beta support.  Eclipse has had a Ruby/Rails plugin for about a year or so.  &lt;br /&gt;&lt;br /&gt;This is weird, weird, weird, that suddenly all the Java tools would feel the need to grow into somewhat ill-fitting Ruby IDE's (Eclipse has always styled itself as more of a meta-IDE, so that's a little less strange).  But do we really need all these Windows Ruby IDE's to be attached to big, memory hogging, Java tools.  (And in IntelliJ's case, I say that with love...)&lt;br /&gt;&lt;br /&gt;I've played with all three now -- I've used Eclipse for Windows-side Ruby editing for a while, and for the last few days I've been going back and forth between IntelliJ and NetBeans checking them out on an existing Rails project.  None of the three are going to make me ditch TextMate yet (although I'd say the big tools all have somewhat more developed project support that TextMate).&lt;br /&gt;&lt;br /&gt;IntelliJ's plugin really strikes me as Not Ready Yet.  For one thing, there's no syntax checking on .rhtml files, which is a big problem.  Also, there's a cool Rails project view, that associates the .rhtml files with the appropriate controller method, but there didn't seem to be an obvious way to get to partial .rhtml files.  Another minor frustration is that the Ruby syntax layout is not customizable yet, the way the Java one is.  It's even hard to keep a separate setup so that Ruby files only have a two character indent.  (And there's a good sociology of programmers paper, on why Ruby is canonically a two character indent, not four).  &lt;br /&gt;&lt;br /&gt;This seems like a good place to point out that I still haven't spent all that much time with any of the new tools, so it's entirely possible I just missed something.  For instance, even though the IntelliJ docs say there are Live Templates for Ruby, my installation didn't seem to have them.&lt;br /&gt;&lt;br /&gt;There's some nice stuff in the IntelliJ tool -- all the ctrl-N navigation works on Ruby classes and methods.  It's very easy to run arbitrary Rake tasks from the UI (although they seem to run kind of slowly) I don't think syntax completion is there yet, but it does syntax check .rb files on the fly  I'd like to see this one a few revs down the line.&lt;br /&gt;&lt;br /&gt;The NetBeans tool is in their beta for version 6 (you have to download the tool, then grab Ruby support via the update center).  I was kind of amazed to be liking this because I fled NetBeans in a huff around version 3 and haven't had any success in trying it since.  The syntax coloring and layout seems to be a bit stronger.  It appears to be using JRuby not just for internal parsing, but also as the default external engine for running, say, WEBrick.  Which makes everything feel a little slow.  There is some syntax-completion -- I found it a little hit-and-miss in terms of getting useful alternatives.  The project view is nice -- it flattens out all the /app subdirectories, but I couldn't see an obvious way to run arbitrary rake tasks or the test suite.  Although there is a keyboard shortcut to run an individual file, and if you try it in a view page, it attempts to open that action in a browser.  My app has a slightly nonstandard route configuration, though, so it didn't quite work for me.&lt;br /&gt;&lt;br /&gt;I also had some stability problems, mostly with trying to run the server from NetBeans, it either hung or took a really long time to load.  Development on this seems to be progressing rapidly -- they are releasing new versions much more quickly than IntelliJ, so all these things could be fixed by Thursday.&lt;br /&gt;&lt;br /&gt;Right now, NetBeans would be my pick of the three if I couldn't use TextMate.  I'm as surprised as anybody by that conclusion, but it felt pretty good as I was using it.  Adding easy test hooks would help.  All three tools are still under development (RDT for Eclipse just released a new version, and RadRails just passed to a new owner with new development promised).  So, watch this space, I guess.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update:&lt;/span&gt; Looks like NetBeans has a bug in reformatting code -- it kind of messed up some of my source files.  Nothing permanent, just kept indenting and not noting the end to outdent so the file kept creeping to the right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8196007065242542424?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8196007065242542424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8196007065242542424'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/03/rubies-in-my-coffee.html' title='Rubies in My Coffee'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6260463759868344730</id><published>2007-03-18T22:17:00.001-05:00</published><updated>2007-03-18T22:18:45.627-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Wow, There Are Comments</title><content type='html'>It's true -- the way to get comments on your blog is to mention Apple...  I do something like one substantive post in three months, and then two apple posts in 48 hours, and bang!  Four comments within a day.  I'm surprised, not least because I really wasn't sure anybody was out there.&lt;br /&gt;&lt;br /&gt;Anyway, interesting points have been made, and I thought I'd pull them up to either agree, or whine defensively.&lt;br /&gt;&lt;br /&gt;On the Win 95 post, Massive writes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;My observation at the time was that the 'competitve analysis' of the OS features and capabiltiies was basically bogus and totally irrelevant. I felt that Apple wasn't whistling past the graveyard so much as completely lying to itself.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You say "tomato", I say "tomahtoe".  There was a lot of denial in the air, that's for sure.&lt;br /&gt;&lt;br /&gt;Still Massive, about the impact of Win95 on end users:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;You could already, with Windows 3.1, show demos rigged to look identical between Mac and the Windows apps. And people were sufficiently ignorant about computers at the time that they would actually buy Windows 3.1 and tell people that it was 'just like the Mac'.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I can't really disagree with that, but I still think the general point that Windows 95 brought the two platforms much, much closer together holds.  I certainly remember that to be the theme of much of the Win95 press coverage.  I also remember Apple's slogan "Windows 95 = Macintosh 89".  Y'know, Apple's marketing also kind of stunk in that period...  &lt;br /&gt;&lt;br /&gt;Massive also mentions that Apple had a poor relation with the dealer channel and that didn't help.  Also true.  As far as I can tell, still kind of true.&lt;br /&gt;&lt;br /&gt;On to the internet posting, a couple of people comment on some other facets of how Microsoft eventually took over after they decided to start competing in browsers.  Right, but there was a time when it was not yet clear that they were going to be willing and able to do that.&lt;br /&gt;&lt;br /&gt;One anonymous poster did bring up a long-buried memory:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Nonesense. Apple's initial 'internet strategy' was CyberDog, which was a fantastic set of tools (web browser, mail client, etc ) unfortunately chained to the technological boat anchor that was OpenDoc.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Mike, is that you?  Mike Pinkerton, who went on to create Camino, was the only person I knew who used CyberDog.  I remember him as being very enthusiastic about it, but it was about 10 years ago, so I could easily be wrong.  It did indeed look cool, but I recall the setup as being kind of daunting, and OpenDoc was kind of a pain in the neck.  Also, CyberDog came out in 1996, and by then Microsoft had already moved in.&lt;br /&gt;&lt;br /&gt;Thanks to the commenters -- I like responding, and it's a good way to get a post, so by all means, keep writing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6260463759868344730?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6260463759868344730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6260463759868344730'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/03/its-true-way-to-get-comments-on-your.html' title='Wow, There Are Comments'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3623370607393217639</id><published>2007-03-17T21:58:00.001-05:00</published><updated>2007-03-17T21:58:37.064-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple Dot Net</title><content type='html'>What is it about us tech fanboys and Apple...  I've always found them interesting, even when I wasn't a regular Mac user.  Infuriating, sometimes.  But interesting.&lt;br /&gt;&lt;br /&gt;So here's another thing about Apple, circa 1995...  That was right about the end of something like a two-year period where Apple was way ahead on internet integration and didn't really make anything out of it.  By the time the internet really started to escape out of academia, the Windows world was well on it's way to catching up, and by the time it all really went mainstream, Macs would be a fading memory.  (I remember as late as 1995 impressing non-techy visitors to my grad school office with demos of a web browser.  But a year later, the cat was largely out of the bag.)&lt;br /&gt;&lt;br /&gt;But in 1994/1995 it was all Macish.  Just accessing the internet was much easier (although it was a separate software purchase initially).  And all the best software was on Macs (well, some of it was Unix, too)  Eudora was the standard email client, and it was still Mac-only, for some reason the Windows version remained ugly forever.  The Mac version of Netscape (and before that Mosaic) were much prettier than the Windows versions.  (In my memory, the Mac versions came out sooner, particularly for early Netscape, but I can't find a source that backs that up).  &lt;br /&gt;&lt;br /&gt;On top of which, Microsoft was in the middle of a totally clueless stage.  Win 95 did not, by default, ship with a web browser, and the big Microsoft internet initiative of 1995 was something called Blackbird, which was going to be a proprietary replacement for HTML.  That worked out about as well as you'd expect, evidenced by the fact that Blackbird doesn't even have a Wikipedia article.  Making it less important than even the most minor anime character...&lt;br /&gt;&lt;br /&gt;Putting that all together, in the months before the Win95 launch, Mac had about a 12-18 month lead in Internet apps and Microsoft was distracted by an attempt to privatize the nascent WWW.  There's clearly some room there for Apple to have maneuvered themselves into a better position than they wound up in.  Being the best internet platform around would have been an interesting counterweight to the Win 95 launch, and while I doubt they could have stopped the upcoming onslaught, they probably could have mitigated it somewhat.&lt;br /&gt;&lt;br /&gt;Instead, Apple didn't really do anything in the space, except release an email client (Claris Emailer -- which does have a Wikipedia article, which charitably refers to it as "popular").  Microsoft, on the other hand, turned on a dime, and gave up the futile attempt to take over the internet by co-opting the authoring tools.  They switched instead to the more lucrative method of taking over the internet by co-opting the client tools.  Apple wandered around in a fog for a few years, until they attacked the opportunity to go after digital media.  But you probably know that part...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3623370607393217639?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3623370607393217639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3623370607393217639'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/03/apple-dot-net.html' title='Apple Dot Net'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-5338257825081165648</id><published>2007-03-17T00:14:00.001-05:00</published><updated>2007-03-17T00:14:28.679-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple Summer of 95</title><content type='html'>As I may have mentioned here, back in 1995 I spent three months as a summer intern at Apple HQ in Cupertino.&lt;br /&gt;&lt;br /&gt;I was buried deep in the educational technology research group so, trust me, I didn't work on anything you've heard of.  It was a fun summer, though.  They stuffed about 15 of us, a mix of grad students and contractors, in a room that was really long and narrow.  They tried to make up for the cramped office space by supplying us with Nerf toys (the admin assistant for our group would sometimes come in and announce a Toys R' Us run, and did anybody want anything).  I got about a dozen free T-shirts in three months.  I also experienced my first earthquake, which went like this:&lt;br /&gt;&lt;br /&gt;A slow rumble, like a truck going down a slowdown strip&lt;br /&gt;&lt;br /&gt;All the non-California people: What was that?&lt;br /&gt;&lt;br /&gt;All the California people: What was what?&lt;br /&gt;&lt;br /&gt;None of which is why I brought this up.  1995 was near a low point for Apple, but even at that there were three or four good-sized company parties during the few months I was there.  I'm talking about food, music, drinks, some entertainment, all in the inner courtyard of the Infinite Loop campus.  I may be slightly exaggerating in memory, and I was assured that it was small-scale by later Valley standards, but it sure seemed elaborate to me.&lt;br /&gt;&lt;br /&gt;In August 1995, Apple held what you'd have to describe as an anti-Windows 95 launch party.  More of a morale booster, I guess.  The thing I remember most is a screen projecting Windows 95, while some Apple guy pointed out it's flaws.  As in, "Windows 95 will only let you have 256 characters in a path name, but if you have more than 15 directory levels, you can cause it to give you a really weird error message."  Thin stuff, but enthusiastically received by a lot of people who wanted to whistle in the dark together.&lt;br /&gt;&lt;br /&gt;Everybody there, I think, knew that Apple lost something big that day.  Prior to Win95, the visual differences between Mac and PC were so clear that you could see the difference in a store just by looking at the two.  Afterwards, you actually had to use them both for a while to learn the difference.  This was a big change in the Mac/PC dynamic, and it took Apple about five years of flailing before they would come up with a decent response.  &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-5338257825081165648?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5338257825081165648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5338257825081165648'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/03/apple-summer-of-95.html' title='Apple Summer of 95'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-5429049945137559755</id><published>2007-02-25T13:20:00.000-06:00</published><updated>2007-02-25T13:24:53.740-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>GWT part 3 and 4</title><content type='html'>Sorry for not mentioning this earlier, but part three of the GWT series is now up on the IBM site at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/opensource/library/os-ad-gwt3/"&gt;http://www-128.ibm.com/developerworks/opensource/library/os-ad-gwt3/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;This one is about remote procedure calls, and I'm pleased with how it turned out.  &lt;br /&gt;&lt;br /&gt;I just got the proofs for the fourth and final article in this series, about deployment.  I expect it to be online Tuesday, Feb 27th at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/opensource/library/os-ad-gwt4/"&gt;http://www-128.ibm.com/developerworks/opensource/library/os-ad-gwt4/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-5429049945137559755?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5429049945137559755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5429049945137559755'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/02/gwt-part-3-and-4.html' title='GWT part 3 and 4'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2739360841690025510</id><published>2007-02-02T22:39:00.000-06:00</published><updated>2007-02-03T09:46:39.865-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Clearing The Decks</title><content type='html'>A collection of small things, half-finished posts, and pure whatnot that hopefully will lead to more posts in the future:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Got my first Amazon affiliate statement with no less than $1.55 heading my way.  Thanks to the person who clicked through...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There's a new sidebar, for small links, via del.icio.us.  The sidebar has it's own RSS feed, on the off chance somebody is interested.  UPDATE: It doesn't appear to work on Safari, which is a problem...  Weird, because I did the preview using Safari, and it showed up fine, but not in the actual blog.  Until I figure that out, Safari users can still click on the RSS icon and see the items.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I had a half-finished post on the iPhone that got buried by the trillions of electrons poured on this story.  So, I'll distill it to this: that was one cool demo.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I also had a half-finished post on using XML as a scripting language, as in Ant scripts.  Distilled: Don't do it.  It's hard to read and nigh impossible to maintain.  The thing I most like about Groovy is that it lets you actually script an Ant target.  Although I think the JRuby/Rake combo is going to be pretty powerful here.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hey, another half-finished post.  This one was about the lack of list or hash literals in Java.  Which bothers me just about every day that I work with Java.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Decks now cleared.  Hoping to get some new content here soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2739360841690025510?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2739360841690025510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2739360841690025510'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/02/clearing-decks.html' title='Clearing The Decks'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7777336494958549084</id><published>2007-01-25T22:17:00.000-06:00</published><updated>2007-01-25T22:22:38.839-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>GWT Article Now Online, Part Two</title><content type='html'>The second part of my IBM Developerworks series on Google Web Toolkit is now online at &lt;a href="http://www-128.ibm.com/developerworks/library/os-ad-gwt2/"&gt;http://www-128.ibm.com/developerworks/library/os-ad-gwt2/&lt;/a&gt;.  This one focuses mostly on the Derby database, and features a really quick and dirty database-to-Java conversion tool.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7777336494958549084?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7777336494958549084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7777336494958549084'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2007/01/gwt-article-now-online-part-two.html' title='GWT Article Now Online, Part Two'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6826394274452572136</id><published>2006-12-13T22:24:00.001-06:00</published><updated>2006-12-13T22:24:59.662-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Playing in the Sandbox</title><content type='html'>&lt;a href="http://www.manning-sandbox.com/thread.jspa?messageID=55639&amp;amp;tstart=0#55639"&gt;This message&lt;/a&gt; showed up in the Manning Sandbox forum for wxPython In Action.&amp;nbsp; After saying some nice things about the book, the poster has some suggestions:&lt;br /&gt;&lt;blockquote&gt;I would love to see an advanced volume covering topics such as XRC, using XML to define a screen layout; creating custom widgets...&amp;nbsp; internationalization, and a full chapter or more expanding on chapter 5 "Creating your blueprint." I find that... program organization is most important yet little seems to be written about it, for any programming language.... A book that illustrates solutions to design problems using patterns, Python, and wxPython will help many people...&lt;br /&gt;&lt;/blockquote&gt;Thanks for the kind words.&amp;nbsp; I'm thrilled that you found the book helpful.&lt;br /&gt;&lt;br /&gt;There are about three or four things that I regret not being able to include in the book.&amp;nbsp; XRC is definitely on that list -- I think that XML or other GUI description languages are going to be increasingly important.&amp;nbsp; (Also on the list: multimedia and how to distribute your finished program).&lt;br /&gt;&lt;br /&gt;These all got pushed out of the book over space considerations.&amp;nbsp; We were something like 75 pages over budget as it was.&amp;nbsp; Owing to some communication issues, nobody realized that we were that far over our page count until the pages were already written, and while it wasn't a problem to get them approved, it did mean that we didn't push forward into other topics.&lt;br /&gt;&lt;br /&gt;There are no current plans for a second book, although it's not out of the question that we'd fill a gap or two with an article on line somewhere.&amp;nbsp; (To be clear, there are no current plans for that, either).&amp;nbsp; Frankly, sales are not high enough for a publisher to seek us out for a second book at this point, especially since an advanced book would, almost by definition, sell fewer copies than the original.&amp;nbsp; That's not a knock on the sales, which seem to be roughly in line with publisher expectations, just a comment on the size of the potential market.&lt;br /&gt;&lt;br /&gt;As for a patterns/program organization book for Python, I'd love to write one.&amp;nbsp; For one thing, it'd give me a chance to rant at length about the finer points of architecture and class structure.&amp;nbsp; I've been known to have an opinion or two on the topic.&amp;nbsp; The main problem would be selling it.&amp;nbsp; My sense is that it's rather hard to sell a general-topic programming book compared to one that's tied to a specific tool or product.&amp;nbsp; This would especially be true for a relatively small market like Python.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Still, that's what blogs are for, so hopefully I'll be able to get some interesting thoughts on those lines here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6826394274452572136?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6826394274452572136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6826394274452572136'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/12/playing-in-sandbox.html' title='Playing in the Sandbox'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6084720533808777758</id><published>2006-12-08T08:19:00.001-06:00</published><updated>2006-12-08T09:41:03.855-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>GWT Article Now Online</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I'm happy to announce that Part One of my four part series on using Google Web Toolkit is now available at: &lt;a href='http://www-128.ibm.com/developerworks/opensource/library/os-ad-gwt1/'&gt;http://www-128.ibm.com/developerworks/opensource/library/os-ad-gwt1/&lt;/a&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This part focuses on creating a GUI front-end using GWT. In case you wonder about the lead time on these things, it was originally written in August, and slightly updated right before it was published.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I think that the future part of the series will appear monthly. The next one is about using the Derby database as your back-end.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I'm pleased with how the article turned out, although I sort of wish I had taken the time to polish the look of the sample a bit -- that's one ugly Web 2.0 application. On the other hand, there's only a limited number of space available in this article (2000 words, and I was already over), and any graphical enhancement needs to be put in code and explained. So it's a tradeoff.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Hope you like it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6084720533808777758?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6084720533808777758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6084720533808777758'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/12/gwt-article-now-online.html' title='GWT Article Now Online'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6453529383262916920</id><published>2006-12-02T21:09:00.001-06:00</published><updated>2006-12-02T21:09:59.047-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editors'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Don't Ask Questions, It Only Encourages Him</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Let me promote this from the comment section -- it's not hard to find, it's the only comment on the previous post.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;What is your favorite Python IDE? Your editor choices are interesting and valid but I wondered if you have a preffered IDE for Python and wxPython work?&lt;br&gt;&lt;/br&gt;&lt;/blockquote&gt;I may have covered this somewhere, either on this site, or in the Python 411 podcast interview. If so, I'm sorry. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;When I'm on a Windows machine, my Python editor of choice is &lt;a href='http://www.jedit.org'&gt;JEdit&lt;/a&gt;, and has been for quite a while. I should say that I only rarely use the Python debugger and Jython interpreter add-ons that are available for it. I do have a couple of custom scripts that execute the script I'm working on and so on, but it's not a very elaborate set-up. What I like about JEdit is that it has a clean interface, had familiar Windows keyboard shortcuts and menus, and had a lot of plugin and macro power. The main downside is that it's kind of a memory hog for a text editor. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;When I jumped Mac-side for my personal stuff, I tried just about every free programmer's editor I could find (JEdit, like a lot of Java/Swing programs, behaves a bit oddly on a Mac). Finally, I somewhat reluctantly decided to pay for TextMate. Although Python-mode on TextMate hasn't quite gotten the love and attention that Ruby has, there's still a lot of power there. It's really easy to script and customize, and it's about the only editor I've seen that has dynamic mode. So that if you are writing, say, a Django template, TextMate knows the the HTML portion gets colored and edited under HTML scope, and inside the Django tags, you use Django/Python mode.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;My main issue with the various IDE's is that I haven't seen a Python one where the gain in the IDE functionality makes up for the editor itself not being as powerful as my normal editor. Some of this is my personal workflow -- using Python and test-first programming, it's very rare for me to feel that I need a step-through debugger. I'm also not very fond of code-generating GUI builders, for reasons that are probably worth another post.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;That said, one thing I do like when I'm in and IDE for whatever reason is the ability to specify a project and do useful things across project scope. (Both JEdit and TextMate have this ability, but not fully formed.) I've done some Ruby work using Eclipse with Ruby plugins, and it's nice to, say, have one-button access to running all your unit tests. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;That's what works for me, but I'm always looking for new tools and finding out how other people work.&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6453529383262916920?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6453529383262916920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6453529383262916920'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/12/don-ask-questions-it-only-encourages.html' title='Don&amp;#39;t Ask Questions, It Only Encourages Him'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-263655517273688541</id><published>2006-11-24T22:57:00.000-06:00</published><updated>2006-11-24T23:01:19.515-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editors'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Editors I Like</title><content type='html'>Two tools I use all the time.  Neither is free, and since my strong bias is to use free tools where possible, these are some really impressive editors.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.jetbrains.com/idea" target="_blank"&gt;IntelliJ IDEA&lt;/a&gt;&lt;/span&gt; For all my Java needs.  It's got more features and is more usable than any other Java IDE out there.  The only downsides are that it's not free, and there are about a half-dozen keyboard shortcuts you have to get down before you achieve anything like full Zen mastery (well, and it could be nicer about the way it arranges tabs in the editor).  I converted one of my teams to IntelliJ largely by just using it in team programming session.  (Sample comment: "You don't seem to be typing very much").  IntelliJ is so good at using the class and type information that it single-handedly makes it useful to have static typing.&lt;br /&gt;&lt;br /&gt;There are a couple of killer features that I miss horribly when using another tool, like the control-n series of shortcuts to browse classes, files, or symbols in the project.  Even better, in the search box, the search is camel-case aware.  So if you type MBGC, it'll match the class MyBigGoofyClass, or the symbol makeBeveragesGreeenCoffee.  It's brilliant, completely intuitive and makes searches through the code very quick.  Ten seconds after you try it once, you're hooked.&lt;br /&gt;&lt;br /&gt;Another cool feature -- a help menu item that lists cool features along with a count of how often you use them, so you can see what neat stuff you are missing out on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.macromates.com/" target="_blank"&gt;TextMate&lt;/a&gt; &lt;/span&gt;My Mac-based editor of choice for everything other than Java.  The Mac editor wars (BBEdit vs. Everybody Else) do sometimes reach a fever pitch normally associated only with critical topics like Emacs vs Vi.  So I don't want this to be a bash on other Mac editors -- if I want to do that, I'll do another post.  Besides, if what you are doing works for you, more power to you.  What I like about TextMate is that it really was built from the bottom up to be scriptable, which gives it a tremendous amount of flexibility and power to handle different file modes, integrate shortcuts, run scripts from TextMate, just easy as could be to use that stuff, and even pretty easy to create new commands.  Biggest quibbles are the single-keystroke only Undo, which I understand as a design choice even as I find it kind of frustrating, and the project mode, which is useless to me, at least partially because it will only display like five tabs across before going to the overflow menu, and that's just not enough.&lt;br /&gt;&lt;br /&gt;Killer feature: select a chunk of text, type the left half of an enclosing pair, like a left paren or bracket.  Rather than replace the selected text with the keypress, which is almost never what you want to do, TextMate will surround the selected text with the enclosing pair, which is so useful that I try and fail to use this in all my other editors now.  And yes, the list of enclosing pairs is adjustable for each file mode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-263655517273688541?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/263655517273688541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/263655517273688541'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/11/two-tools-i-use-all-time.html' title='Editors I Like'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-5094532911093610351</id><published>2006-11-19T00:13:00.000-06:00</published><updated>2006-11-19T00:14:00.453-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Less Frequently Asked Questions</title><content type='html'>Hi.  Miss me?  Thought not.  Well, I've been feeling increasingly guilty about not posting something here, especially as the comments continue to trickle in -- we're up to eight now that I've cleared off some comment spam!&lt;br /&gt;&lt;br /&gt;I'm going to boldly ignore the three partially written posts and do another round of publishing questions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How's the wxPython book selling?&lt;/span&gt;  Not bad.  Got my first-ever royalty check a couple of weeks ago (actually, a royalty direct deposit).  Went well into the low three figures, which is relevant to the older question about how much money you can make at this thing.  (To be fair, that's artificially lowered a little bit because some of the royalties still were going to finish paying off the advance.  I was hoping that the book would substantially outsell the Jython book, which hasn't happened yet.  A little surprising given both the relative health of the mailing lists for the two tools and also the fact that the wx book had a substantially better rating on Amazon.  And oh yes, I know what the Amazon rank is.  Also the current total of reviews -- thanks to all ten people who have gone to Amazon and side nice things.&lt;br /&gt;&lt;br /&gt;The implication of the Amazon numbers would seem to be that either a) Amazon is selling fewer books than four years ago or b) Manning doesn't have the distribution within bookstores that O'Reilly did.  I suspect the latter, especially since the Jython book seems to have had more foreign sales.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What tools do you use to write the books?&lt;/span&gt;  I'm actually pretty interested in this one with respect to how other authors do it.  It seems to me that there isn't a fully satisfying tool for authoring technical books.  In both cases, the main tool decisions were made before I came on board.  For the Jython book, we used Word.  There was exactly one positive of this -- it was nice to use the change-tracking system to do comments back and forth.  Word, though, seems to be optimized for a two page office memo, and is really a pain for anything more complex.  Especially when you are changing font styles frequently for things like code literals, or inserting code blocks, or numbered lists (which can be nightmarish).  Most of my demo code was written in jEdit.  O'Reilly provided a Word template with predefined paragraph and character styles for things like lists, headers, and literals, and they then automatically converted that for production.&lt;br /&gt;&lt;br /&gt;Manning had something similar, but we only used it directly.  For the wx book, we used ReStructured Text and a CVS server to do change tracking.  This enabled us to do the writing in an ordinary text editor -- I used jEdit again (Robin used Emacs, I think).  The CVS server was a great idea.  Using ReST had some benefits -- for one thing, it was much easier to integrate figures and code snippets with include statements.  The biggest downside from just a typing standpoint was tables, which were a pain.  However, Manning would only accept submissions in Word at that time, so we had a kind of convoluted system where we would auto-convert the ReST to OpenOffice, then hand save it as a Word file.  Once we turned the books in, we were stuck doing final proofreading and edits in Word.  (Although Robin and I used Writely, now Google Docs, to do our change lists from the proofreading -- that worked really nicely).  One significant difference between the publishers was that O'Reilly did the indexing in-house, whereas Manning asked us to do it.  It's actually more difficult than it looks to do well -- I'm under no illusion that we did the index as well as somebody with more experience would have.&lt;br /&gt;&lt;br /&gt;One more question along these lines upcoming, but it's longer and it's late.  I'll try not to wait six weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-5094532911093610351?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5094532911093610351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/5094532911093610351'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/11/hi.html' title='Less Frequently Asked Questions'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-8889834918177472616</id><published>2006-10-01T07:45:00.000-05:00</published><updated>2006-10-01T07:49:15.380-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Now with sound</title><content type='html'>Robin Dunn and I were interviewed for Ron Stevens' excellent &lt;a href="http://www.awaretek.com/python/index.html"&gt;Python 411&lt;/a&gt; podcast -- you can download and listen to the .mp3 file &lt;a href="http://media.libsyn.com/media/awaretek/Python411_061001_WxPythonInAction.mp3"&gt;here&lt;/a&gt;.  It's about 45 minutes long, which should mean that Ron used nearly all of the interview.  Hope you like it.  It was a lot of fun to do.  Thanks again to Ron for having us on, and also for the very nice review of the book he wrote on Slashdot.  Haven't listened to the podcast myself yet, so I hope I don't sound like a gibbering idiot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-8889834918177472616?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8889834918177472616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/8889834918177472616'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/10/now-with-sound.html' title='Now with sound'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3603220164042836382</id><published>2006-09-30T15:58:00.000-05:00</published><updated>2006-09-30T16:00:07.967-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>wxWorld</title><content type='html'>I'm pleased to be able to link to a new article: &lt;a  target="blank" href="http://www-128.ibm.com/developerworks/linux/library/l-wxwidgets/"&gt;Build cross-platform GUIs using wxWidgets&lt;/a&gt; available on the IBM developerWorks site.  The original title was "wxWorld", and it's a quick look at wxPython, the wxWidgets toolkit, and some of the other wxWidgets language bindings.  I had some fun digging through the different language tools trying to create short wx programs in each.  Hope you like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3603220164042836382?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3603220164042836382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3603220164042836382'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/wxworld.html' title='wxWorld'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4933696319442366549</id><published>2006-09-22T13:15:00.000-05:00</published><updated>2006-09-21T07:11:45.714-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Tips-First for Test-First</title><content type='html'>Of all the exciting ideas and revelations that came from Kent Beck's original XP book, Test-First Programming has been the one that most significantly affected the way I work on a day-to-day basis.&lt;br /&gt;&lt;br /&gt;I love programming test-first.  It's a great way to take a large, amorphous task and solve it piece by piece.  It's also a nice morale boost -- "Hey, I know that my code does nine things.  Let's go for ten..."&lt;br /&gt;&lt;br /&gt;Here are a bunch of things I wish somebody had told me about test-first programming.&lt;br /&gt;&lt;h4&gt;Unit Testing is not All Testing&lt;/h4&gt;So, after I started doing test-first, I walked around for about six months all, "my code is perfect because I wrote tests".  My smugness came crashing down when testers found some bugs.  My code was &lt;i&gt;better&lt;/i&gt; because I wrote tests, but turns out I had made some dicey assumptions about the inputs, and so my tests passed, but were still incorrect.  Test-first is not a complete test suite.  You still need to do acceptance testing, you still need to do GUI testing where appropriate.&lt;br /&gt;&lt;br /&gt;However, you can still automate a very large percentage of acceptance tests.  The more you can automate the tests, the more they'll be run, and the happier you'll be.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Test-First is a structure for writing good code at least as much as it's a means for verifying code&lt;/h4&gt; Code that has been written in a test-first style tends to have certain qualities.  Small methods, loosely coupled.  Small objects, loosely coupled.  Code that causes side effects (such as output) tends to be separated from code that doesn't.  These are all side effects of what's easy to test -- it's easy to write small methods in a tight test-first loop.  And dependencies between methods or objects make tests harder to write.&lt;br /&gt;&lt;br /&gt;As it happens, those exact qualities -- tight cohesion and loose coupling -- are exactly what characterizes the best software architectures.  My test-first experience is that I wind up with much better code architectures from test-first then I do when I try to guess the design before I start.  (Which is not to say that a little bit of pre-design can't be helpful, just that it can be overdone).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Test-first is better suited for some things than others&lt;br /&gt;&lt;/h4&gt;That doesn't mean that you shouldn't try, of course.  Test-first is vital in cases where you know the input and output, but not the process.  It's also critical in cases where your program can be incorrect in subtle ways.  It's somewhat less important for things that will visibly or loudly break.  GUI's are a challenge because GUI layouts tend to change in ways that can break unit tests.  GUI behaviors are more stable and easier to test.  Again, though, you should try and have automated coverage of even those areas that weren't developed test-first.&lt;br /&gt;&lt;h4&gt;Trust the process.  Look ahead on tests, not implementation.&lt;br /&gt;&lt;/h4&gt; It works.  The tight process is: Write a test.  Run the test so that it fails.  Make the simplest fix that will pass the test.  Run the test so that it passes.  Refactor.  Keep to that tight loop.  Resist the temptation to guess about what you'll need to pass the next test.  What I usually do is put a list of the tests I'm going to write in comments in my test class -- that's my lookahead plan, and keeps me from forgetting something.  But the design I do in my actual code comes during the refactor step, which is where I see duplication and abstraction.&lt;br /&gt;&lt;h4&gt;The earlier you start the better off you are.&lt;/h4&gt; It gets increasingly hard to convert a code base to test-first the longer you wait.  I've even had 20 line classes that needed significant refactoring to unit test (mostly because output was intertwined with functionality -- the code was better after the refactoring).  Test-first is a good place to start, anyway -- pick something to test, and go.&lt;br /&gt;&lt;h4&gt;Treat your tests like code and refactor them&lt;br /&gt;&lt;/h4&gt;Pretty much every test-first guide gives sort of a perfunctory nod to, "oh yeah, keep your test code clean."  But I think this could stand a little more attention.  For one thing, your unit tests are critically important to your ability to deliver quality code -- &lt;span style="font-weight: bold;"&gt;and they have no tests of their own&lt;/span&gt;.  The cleaner your tests are, the better you'll be able to see issues with the tests themselves.&lt;br /&gt;&lt;br /&gt;One thing that has worked nicely for me is extracting sets of assertions into custom assert methods.  If you are continually making the same five assertions to check validity of your objects, throw them into an &lt;span style="font-family:courier new;"&gt;assert_instance&lt;/span&gt; method of some kind.  Another common case is making the same assertion over a range of values -- move the for loop to your custom assertion and pass the range endpoints in.&lt;br /&gt;&lt;br /&gt;There are two big advantages to doing this consistently.  The first is that it's easier to see what's going on from one line of &lt;span style="font-family:courier new;"&gt;assert_person(expected_name, expected_addr)&lt;/span&gt; then from five lines of &lt;span style="font-family:courier new;"&gt;assert_equals&lt;/span&gt;.   The second is that it ensures that you actually do make all the assertions every time.  Hey, everybody slacks, and test-first is about making the test setups as quickly as possible.  If you can trigger all umpteen tests on your class with one method call, you're more likely to do the whole set every time, rather than just picking one or two at random each time.&lt;br /&gt;&lt;h4&gt;Don't reuse instance variables&lt;/h4&gt; This is another refactoring issue.  It's tempting as you add new unit test cases to do something like this:&lt;br /&gt;&lt;pre&gt;Person p = new Person("noel", "david", "rappin");&lt;br /&gt;assertEquals(15, p.nameLength());&lt;br /&gt;p.setLastName("flintstone");&lt;br /&gt;assertEquals(19, p.nameLength());&lt;br /&gt;p.setFirstName("pebbles")&lt;br /&gt;assertEquals(22, p.nameLength());&lt;br /&gt;p.setFirstName("betty");&lt;br /&gt;assertEquals(22, p.nameLength());&lt;/pre&gt;&lt;br /&gt;The last test fails -- quick, what's it testing?  Okay, now we have to trace the life of that instance variable all the way back up.  It's hard to read, and prone to dangerous errors.  You should never reuse an instance variable like this in a unit test -- every assertion should, where its at all feasible, be completely distinct:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;assertNameLength(int expected, String first, String middle, String last) {&lt;br /&gt;  Person p = new Person(first, middle, last);&lt;br /&gt;  assertEquals(expected, p.nameLength())&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;testNameLength() {&lt;br /&gt;  assertNameLength(15, "noel", "david", "rappin");&lt;br /&gt;  assertNameLength(19, "noel", "david", "flintstone);&lt;br /&gt;  assertNameLength(22, "pebbles", "david", "flintstone");&lt;br /&gt;  assertNameLength(22, "betty", "david", "flintstone");&lt;br /&gt;}&lt;/pre&gt;Now when the last test fails, you can actually see what's going on.&lt;br /&gt;&lt;h4&gt;Avoid tautologies&lt;/h4&gt; The scariest issue you can have with tests is a test that passes when it should fail, allowing you to continue blithely along, ignorant of a bug you should have already caught.  There will come a day, for instance, when you will forget to put any assertions in a test.  There are a couple of things you can do to make tautologies less likely.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Follow the process.  The process says each test has to fail before you add code.  Adding tests that you already know will pass can easily lead to writing a test that will never fail.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you have constants for text or numerical values in your code, don't reuse those in the tests -- use the literal or create a separate constant in the test.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Be careful with Mock Objects.  Try not to test the things that you are explicitly inserting in the Mock when it's created.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Mock Objects Rule&lt;/h4&gt; Mock Objects are the missing link in helping you test all the things that are traditionally hard to unit test, like databases, GUI, web server... anything where your code is dependent on an external system or person, the Mock can get in the way and pretend to be that third-party and allow you to send and receive data in a testable way.  Mock Object packages exist for a variety of languages, and using a package will save you time and effort on your tests.&lt;br /&gt;&lt;br /&gt;Hope that helps -- go out and test something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4933696319442366549?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4933696319442366549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4933696319442366549'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/tips-first-for-test-first.html' title='Tips-First for Test-First'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3412089637569912665</id><published>2006-09-15T12:31:00.000-05:00</published><updated>2006-09-15T12:35:22.585-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Why, Johnny, Why?</title><content type='html'>We interrupt Python week to bring you the following alternative programming rant.  I know, Python week has sort of gone up in smoke.  But one of our mottoes here is "Whenever a Hugo Award winning SF novelist writes a hyperbolic screed about BASIC in the public schools, 10 Print Hello will be there".  As a motto, it's not very catchy.  We're working on it.&lt;br /&gt;&lt;br /&gt;As soon as I mentioned "Hugo Award winner", "BASIC" and "hyperbolic screed" many of you were probably able to quickly deduce that the author is David Brin, &lt;a href="http://www.salon.com/tech/feature/2006/09/14/basic/index1.html"&gt;here on Salon wondering what happened to BASIC&lt;/a&gt; (you'll have to watch an ad to view the article):&lt;br /&gt;&lt;blockquote&gt;Only, quietly and without fanfare, or even any comment or notice by software pundits, we have drifted into a situation where almost none of the millions of personal computers in America offers a line-programming language simple enough for kids to pick up fast. Not even the one that was a software &lt;i&gt;lingua franca&lt;/i&gt; on nearly all machines, only a decade or so ago. And that is not only a problem for Ben and me; it is a problem for our nation and civilization.&lt;br /&gt;&lt;/blockquote&gt;Does he have your attention yet?  He'll equate the loss of BASIC to an act of war later in the essay.  Brin seems to be making three separate points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BASIC used to be available on all computers that kids touch, and that is no longer the case. &lt;/li&gt;&lt;/ul&gt;This is obviously true, but a bit less dramatic than Brin implies.&lt;br /&gt;&lt;br /&gt;Brin implies that BASIC was available for kids for a long time, and only recently disappeared. Actually, that's close to backwards. BASIC was generally available for less than a decade, and has been fading ever since. Even though Brin says a couple of times that "20 years ago" millions of kids could have used BASIC, the fact is that by 1986 BASIC was on its way out as a standard part of home computers.&lt;br /&gt;&lt;br /&gt;Although it was invented in the early 60's, BASIC is associated most strongly with the late '70s and early 80s generation of computers. This market would eventually be dominated by the Apple ][ line, but earlier included things like the TRS/80, and Texas Instruments. (I even remember the Bally TV based game system having a BASIC module circa 1981 or so.). In any case, neither the Mac (introduced in 1984) or the IBM PC and clones featured BASIC to that same degree.  By 1985, the idea that all computers would have BASIC was much less strong, although Apple ][ and BASIC instruction lingered in schools for a few years after that Which is why Brin's son is still seeing it in math textbooks, although that says more about the textbook industry than anything else.  Data point -- my middle school had an Apple ][ computer lab in 1984 or 5.  In my high school, a couple of years later, the computers were already Mac &amp;amp; PC's without basic -- we learned Pascal.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There is much less of an sense that kids should be taught programming (particularly in BASIC) than there may have been in the mid 80's.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Largely true.  Another data point -- my younger relatives about ten years later were no longer taught BASIC, nor were the kids at elementary schools I studied about the same time.  By now, computers had migrated into the actual classroom and were being used as reference and also for what I guess you'd have to call multimedia authoring.  I do think this is a loss.  But at the same time, I've always kind of suspected that the reason why elementary school kids were taught BASIC in the early 80s was because the schools were kind of floundering around for what to do with the shiny new computers.  My read of the educational literature during the time I was studying educational technology was that eventually this petered out because it was not clear that teaching programming was helping students become better general learners.  To be fair, that's not exactly the point Brin is arguing, but it does suggest that, perhaps, losing BASIC is not the end of civilization.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BASIC has some magical set of properties (Brin calls it "line-programming") that makes it uniquely suitable for introducing programming concepts.  Because of this, we're losing an entire generation of tinkerers.  This, I don't get at all.&lt;/li&gt;&lt;/ul&gt;So, Brin goes on at some length about how the computer people he's talked to don't seem to feel that it's a problem that BASIC isn't around anymore, while he, Brin, knows better.  (Anybody familiar with Brin's essay entitled "The Dogma of Otherness" should catch at least a hint of irony.)  Anyway, while Brin does acknowledge that BASIC has a lot of limitations, he goes on at length about line-programming and how important it is.&lt;br /&gt;&lt;br /&gt;I'm not completely sure what Brin means by line-programming.  Google didn't give me a relevant link.  I'm going to assume that it has something to do with the fact that BASIC circa the Applesoft years was coded on a line-by-line basis.  Brin suggests that this was an experience that modern languages can't give:&lt;br /&gt;&lt;blockquote&gt;The "scripting" languages that serve as entry-level tools for today's aspiring programmers -- like Perl and Python -- don't make this experience accessible to students in the same way. BASIC was close enough to the algorithm that you could actually follow the reasoning of the machine as it made choices and followed logical pathways. Repeating this point for emphasis: You could even do it all yourself, following along on paper, for a few iterations, verifying that the dot on the screen was moving by the sheer power of mathematics, alone. Wow! (Indeed, I would love to sit with my son and write "Pong" from scratch. The rule set -- the math -- is so simple. And he would never see the world the same, no matter how many higher-level languages he then moves on to.)&lt;br /&gt;&lt;/blockquote&gt;I confess, I have no idea what he's saying here, though I do like the scare-quotes around "scripting".  I'm kind of trying to get my head around the idea that you can't program a mathematical algorithm in Python and follow the reasoning of the machine.  I mean, there are higher level constructs, but if we're talking about loops and conditionals for 5th grade math problems... I think Python would be pretty easy to follow and would look a lot like the logical structure of the algorithm.  Python even has an interactive interpreter so you could type the code in line-by-line if you wanted.  That actually could be pretty cool in a learning-math setting.  And you could even track it with pencil and paper.&lt;br /&gt;&lt;br /&gt;It is true, though, that it was much more conceptually simple to do simple graphics in Applesoft BASIC than in Pascal.  That's not the language's fault, and it's not because you write Python in a full text editor.  It's because modern programming languages sit on an operating system that mediates access to the drawing controls, and Applesoft BASIC didn't.  It wouldn't be hard to come up with a Python package that emulated the draw controls of Applesoft basic (which were on the order of "Make that pixel blue.  Now make that one red").&lt;br /&gt;&lt;br /&gt;I think what I object to is the implication that this is somehow a difficult time to be learning to program, that it's harder now to get into programming.  That's totally wrong -- it's a fabulous time to be learning to program.  Brin says his son is now learning C++, so I'll assume he's interested and motivated.  Twenty years ago, yeah, he would have had BASIC.  And that's it.  Unless you wanted to pay some money.  As for seeing any examples of what a real program looked like, forget it.&lt;br /&gt;&lt;br /&gt;These days... Well, a Mac OS X box ships with what, a half-dozen or so programming languages right out of the box, with who knows how many all available for free.  Want to see basic algorithm code for free?  It's there.  All kind of code, complex and simple, is available online.  There's a whole industry of programming books, something I would have devoured as a kid.  We've traded The One True Teaching Language for many different languages.  An elementary school teacher explaining "20 goto 10" is now a publishing empire, plus the internet.  Coloring individual dots on a screen is now building a web page, or a web application, or a sprite animation.  Even an elementary school child who is motivated can do more and understand more about computers than I would have dreamed in 1985.  Have we lost something?  Maybe.  Have we gained something?  Oh yes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3412089637569912665?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3412089637569912665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3412089637569912665'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/why-johnny-why.html' title='Why, Johnny, Why?'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-9078964636058689109</id><published>2006-09-13T22:09:00.000-05:00</published><updated>2006-09-13T22:41:44.266-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Obligatory Apple Post</title><content type='html'>Since what every tech blog reader needs is &lt;span style="font-style: italic;"&gt;another&lt;/span&gt; round up of Apple's Showtime event...&lt;br /&gt;&lt;br /&gt;Overall, nice incremental stuff, perhaps a little disappointing to those who were expecting a radical new mainline iPod.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;New Shuffle&lt;/span&gt;: This is getting close to being jewelry, actually is starting to look like a cufflink to me.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;New Nano&lt;/span&gt;: Smaller, bigger drive, better battery life, colors.  Solid incremental upgrade.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;New iPod: &lt;/span&gt;A very small incremental upgrade.  It's very irritating that the new search function is not being backported to existing video iPods.&lt;br /&gt;&lt;br /&gt;Here's my bold prediction -- the widescreen, touch panel iPod will never be released as it is currently rumored.  My guess is that there will be practical troubles either keeping the screen clean and scratch free when people are putting their grubby mitts right on it and/or having a touch screen wheel UI that is actually usable.  More likely the former, but I think the latter might be a problem too.  Just wait for me to be wrong!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;iTunes UI Enhancements&lt;/span&gt;:  Mostly quite nice.  The album art view and the cover flow view are both very pretty.  They don't really mesh with how I use iTunes, but I can see where they will be useful.  Points to Apple for actually buying CoverFlow rather than just ripping it off.  The library enhancements and the iPod view are nice (although the iPod prefs aren't that much nicer than they were in the Preferences screen).  As usual, the UI is in a state of flux, it's a bit more subdued, but some elements (like the tabs in the iPod screen just look weird.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;iTunes Movies:  &lt;/span&gt;Best seen as the beginning of a long term strategy than a goal in itself.  Although if I were the manufacturer of a portable DVD player, I'd start getting a little worried.  Still, I can't imaging genuinely sitting through a full-length widescreen movie on an iPod screen unless I was trapped on an airplane.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;iTunes Games: &lt;/span&gt;Kind of underplayed, but in some ways the most interesting potential.  If, that is, Apple releases an SDK such that the open source hackers of the world can get their hand on it.  That could be very, very interesting...  &lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;:  Looks like Apple has "&lt;a href="http://www.bensinclair.com/article/whats-inside-an-ipod-game"&gt;no plans to offer an SDK&lt;/a&gt;".  Bummer.  Developers should be agitating for this.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;iTV: &lt;/span&gt;I get where they are going with this, and I really want to like it, but absent DVR capability (even if it was on the networked Mac) I really can't see this being a major player.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Python tie-in (what with it being Python Week and all...): nothing really.  I do have a pretty cool and obsessive Python script that creates fancy random playlists for iTunes/iPod, including things like, randomly pick albums, randomly play multiple songs in a row from the same artist, play songs in specific genres more often, etc., etc.  I'll post it here someday, but the code really needs a good sweep first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-9078964636058689109?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/9078964636058689109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/9078964636058689109'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/obligatory-apple-post.html' title='Obligatory Apple Post'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6858413581290828313</id><published>2006-09-12T23:59:00.000-05:00</published><updated>2006-09-13T00:20:42.708-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>Re-refactoring</title><content type='html'>Here's a little riff inspired by one of the examples in Martin Fowler's book &lt;a href="http://www.amazon.com/gp/redirect.html?link_code=ur2&amp;tag=10prinhell-20&amp;amp;amp;amp;amp;amp;amp;amp;amp;camp=1789&amp;creative=9325&amp;amp;location=%2FRefactoring-Improving-Design-Existing-Code%2Fdp%2F0201485672%2Fsr%3D8-1%2Fqid%3D1158123700%2Fref%3Dpd_bbs_1%3Fie%3DUTF8%26s%3Dbooks"&gt;&lt;span style="font-style: italic;"&gt;Refactoring&lt;/span&gt;&lt;/a&gt;, which is another great programming book that deserves an appreciation post one of these days.  This was actually also spawned by code that I've read, and later realized that Fowler did a similar example.  Thing is, I don't think Fowler went far enough in this case.&lt;br /&gt;&lt;br /&gt;Here's the example.  (page 243 for those of you playing the home game).  But, since it's Python Week here, I'll translate to Python.&lt;br /&gt;&lt;pre&gt;if isSpecialDeal():&lt;br /&gt;   total = price * 0.95&lt;br /&gt;   send()&lt;br /&gt;else:&lt;br /&gt;   total = price * 0.98&lt;br /&gt;   send()&lt;br /&gt;&lt;/pre&gt;Fowler correctly notices the duplicate call to &lt;span style="font-family:courier new;"&gt;send()&lt;/span&gt;, and refactors to:&lt;br /&gt;&lt;pre&gt;if isSpecialDeal():&lt;br /&gt;   total = price * 0.95&lt;br /&gt;else:&lt;br /&gt;   total = price * 0.98&lt;br /&gt;send()&lt;br /&gt;&lt;/pre&gt;This is fine as far as it goes, but as I see it, there's a second duplication in this snippet -- the formula for calculating the total.  I'd rather see something like this (using the new Python 2.5 ternary syntax:&lt;br /&gt;&lt;pre&gt;multiplier = (0.95 if isSpecialDeal() else 0.98)&lt;br /&gt;total = price * multipiler&lt;br /&gt;send()&lt;/pre&gt;There are a couple of advantages to this last snippet.  We've separated the calculation of  the total from the act of gathering the data for that calculation.  This makes the actual formula for the total clearer, and allows you to easily spawn the multiplier getter off to it's own method if it gets more complicated.  Plus we've removed more duplication, and I think made the code structure match the logical structure of the calculation a little bit better.&lt;br /&gt;&lt;br /&gt;This is a simple example, and you could quibble with it.  The general idea of separating conditional logic from calculations is a solid way to clean up code and make it easier to maintain in the long run.&lt;br /&gt;&lt;br /&gt;Before I leave... I'm not sold on the syntax for the Python ternary yet.  I'm told that the syntax was chosen over the perhaps more consistent &lt;span style="font-family:courier new;"&gt;if cond then x else y end&lt;/span&gt; because it was felt that in most use cases you'd have a clear preferred choice and a clear alternate choice, and putting the preferred choice before the conditional emphasized that.  I don't know if that matches how I'd use a ternary.   Although I guess it's reminiscent of  listcomp syntax.  I need to use it in real programs to know for sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6858413581290828313?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6858413581290828313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6858413581290828313'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/re-refactoring.html' title='Re-refactoring'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-910402267711288758</id><published>2006-09-11T20:24:00.000-05:00</published><updated>2006-09-11T20:57:09.465-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Some 411 of my own</title><content type='html'>Saturday, Robin and I had the pleasure of being interviewed by Ron Stephens for the excellent &lt;a href="http://awaretek.com/python/index.html"&gt;Python 411 podcast&lt;/a&gt;.  I think this was the first time I've ever been interviewed for anything, and while it's always fun to talk about Python, the book, and me (not necessarily in that order), it does take some getting used to.&lt;br /&gt;&lt;br /&gt;Anyway, I do mention this here blog during the interview, and while I don't want to talk about the actual interview in detail until I hear the edited version, it did occur to me that I might want to have some actual Python content on board in case anybody comes by to check the place out.&lt;br /&gt;&lt;br /&gt;Python content all week, then, starting with today's Things I Love About Python:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Whitespace.  &lt;/span&gt;I know that I said just a few short days ago that I wasn't going to redefend Python's whitespace blocks.  That was then, this is now.  Now, I'm just going to gush over them.  I love using whitespace to mark blocks.  It enforces what I'd be doing anyway.  It encourages consistent style, with the result that other people's Python code is actually intelligible.  It encourages short methods and shallow nesting, both good habits, and it lets you get about 10-25% more code on a page.  Nobody is ever going to have an Obfuscated Python contest (okay, I looked it up... somebody has, but they realize it's a joke.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;List Comprehensions.&lt;/span&gt;  One of my favorite syntax features in any language.  So concise and yet so clear...  Try to describe the following any more clearly in any language, programming or not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[x.name for x in students if x.grade &gt; 90]&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Okay, they do sometimes blow up if you make them too complicated.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;First Class Functions.&lt;/span&gt;  It's easier to pass around named function objects in Python than in just about any language not named Lisp.  This is a very good thing.  It enables all kinds of elegant abstractions (especially since classes and instances can all be made callable).  Over time, using Python has made all my coding move to a more functional style that's easier to test, verify, and maintain. &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Of course, not everything in Python needs to be elegant and abstracted.  Last night I had a problem.  I wanted to download all episodes of a popular podcast that does not have an easily accessible archive page.  Rather that walk through months of postings, I decided to write a script that would take advantage of the pages naming conventions, loop to find the shows for given days, find the downloadable URL and download, then add to iTunes.  Final code, just under 60 lines.   Elapsed time,  under 45 minutes start to first download, including downloading, installing, and using a new library (&lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;Beautiful Soup&lt;/a&gt;, which is a nice HTML parser).  The point is not that I'm particularly good at this (the script is a little sloppy and doesn't handle error conditions well), but that Python is particularly good at this.  Plus, it was fun -- no fighting with compilers and interpreters, able to find support for the libraries when I needed it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-910402267711288758?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/910402267711288758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/910402267711288758'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/some-411-of-my-own.html' title='Some 411 of my own'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-3876621786483412095</id><published>2006-09-09T21:11:00.000-05:00</published><updated>2006-09-08T17:24:11.471-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><title type='text'>Hybrids In Bloom</title><content type='html'>A couple of big stories in the wide world of scripting languages running on virtual machine platforms.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython"&gt;IronPython&lt;/a&gt;, the .NET implementation of Python created by Jython creator Jim Hugunin, released version 1.0.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The two primary developers of the &lt;a href="ttp://jruby.codehaus.org/Home"&gt;JRuby&lt;/a&gt; project, implementing a Java-based Ruby interpreter, were &lt;a href="http://headius.blogspot.com/2006/09/jruby-steps-into-sun.html"&gt;hired by Sun&lt;/a&gt; with the mandate to bring JRuby to 1.0.&lt;/li&gt;&lt;/ul&gt;Unsurprisingly, I think this is all great.  Programming hybrids are a beautiful thing.  The more tools the merrier, and the more ways to combine the best parts of different tools, the merrier squared.&lt;br /&gt;&lt;br /&gt;The amazing thing about IronPython is that it benchmarks as being faster than traditional CPython, which seems sort of counter-intuitive.  (I'm assuming, based on nothing at all, that there's a higher memory load, but if I'm wrong, I'm sure somebody will point that out).&lt;br /&gt;&lt;br /&gt;One of the interesting things about JRuby is a certain shift in momentum.  When Jim Hugunin created JPython, the primary goal was to be able to use existing Java libraries with Python syntax.  The JRuby team (and by extension, Sun), in contrast, seem to be comparatively more interested in using existing Ruby libraries (like Campfire and Rails) on a JVM backdrop than in using existing Java classes.&lt;br /&gt;&lt;br /&gt;For instance, JRuby does not seem to have an analogue to the Jython shortcut of using converting attribute assignment in Jython (&lt;span style="font-family:courier new;"&gt;foo.bar = 3&lt;/span&gt;) to a Java bean setter (&lt;span style="font-family:courier new;"&gt;foo.setbar(3)&lt;/span&gt;), which makes Java classes feel more Pythonic.  (Again, correct me if wrong, the existing tutorials don't touch on this  point, and I'm basing this on a possibly out-of-date article).   (&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;:  Somebody did correct me -- JRuby does have this style.  I wonder if it also works on constructors the way Jython does.  So the point below is somewhat invalidated.)&lt;br /&gt;&lt;br /&gt;And I don't mean this as a good/bad thing, either -- it's perfectly all right for the different tools to have different priorities.  It's fascinating that Ruby is now seen as bringing a host of useful tools to the Java platform, in a way that I think we would have been laughed at a few years ago for suggesting that strongly about Jython.&lt;br /&gt;&lt;br /&gt;Good luck and more power to everyone, I can't wait for Java on Rails...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-3876621786483412095?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3876621786483412095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/3876621786483412095'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/couple-of-big-stories-in-wide-world-of.html' title='Hybrids In Bloom'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-124239235802192335</id><published>2006-09-07T20:31:00.000-05:00</published><updated>2006-09-07T20:57:19.552-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>I/O, I/O, It's Off To Work I Go</title><content type='html'>Welcome to our program, &lt;span style="font-style: italic;"&gt;Things I Agree With Totally And Wish I Had Said First&lt;/span&gt;.  Our hero tonight is Tim Ottinger with his hit, "&lt;a href="http://www.butunclebob.com/ArticleS.TimOttinger.FrameworkImpatience"&gt;Frameworks are for the Impatient&lt;/a&gt;".  It seems Ottinger is puzzled by a library he's trying to use..&lt;br /&gt;&lt;blockquote&gt;Look, this framework is not the game &lt;i&gt;Myst&lt;/i&gt;. I did not install this thing so that I could amuse myself for days by running around the file system trying to figure out what it is about...&lt;br /&gt;&lt;br /&gt;In the Java world... [E]ven opening and reading a file is cause to go google the library one more time. Heaven forbid you have to manipulate dates or the like. These are small things, and should be very easy.... You shouldn't have to crack open a half-dozen US$50.00 books.&lt;br /&gt;&lt;br /&gt;One point of "obvious" is probably worth one hundred points of "clever". &lt;/blockquote&gt;In the immortal words of Arnold Horshack, "Right you are, Mr. Kotter".  Hmm.  That sounds better if you imagine it in a Horshack voice.  Doesn't look like much in print...&lt;br /&gt;&lt;br /&gt;The Java &lt;span style="font-family:courier new;"&gt;io&lt;/span&gt; library is a particular nemesis of mine.  I've been using it for what, just under a decade now, and the only way I was able to stop looking up the API every other week was to write a utility class that had an API that was actually useful (you know, obscure methods like &lt;span style="font-family:courier new;"&gt;copyFile&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;readlines&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;writeToFile&lt;/span&gt;...).&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family:courier new;"&gt;io&lt;/span&gt; library may actually be the purest example of the Java school of OO design, marked by the principles like:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use an abstraction (streams) that looks interesting on paper, but that nobody ever uses.  Ignore the abstraction (files) that is already established.  When that doesn't work, add a completely new abstraction (readers/writers) that's completely non-interoperable with the first one.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make sure the user has to type a lot of words to get anything done.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make it just as easy to do obscure, complicated things as it is to do typical things, even if this means making it harder to do normal tasks.  Doesn't everybody want to randomly access binary files just as often as write some text?  (Actually, there are obscure things in the API that are much easier than say, iterating over the lines in a text file).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Don't even get me started on the &lt;span style="font-family:courier new;"&gt;nio&lt;/span&gt; package.  Really, don't.  I couldn't explain it on a bet.&lt;br /&gt;&lt;br /&gt;Sigh.  Java is too easy a target sometimes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-124239235802192335?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/124239235802192335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/124239235802192335'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/welcome-to-our-program-things-i-agree.html' title='I/O, I/O, It&apos;s Off To Work I Go'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-7405499796743949323</id><published>2006-09-06T21:33:00.000-05:00</published><updated>2006-09-06T22:34:12.675-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Fonts</title><content type='html'>I'm curious -- how do you set up your screen in your text editor when you are programming?&lt;br /&gt;&lt;br /&gt;Based on people I've worked with, I seem to do two things in my setup that are unusual.  I use fairly large fonts (16-18 point, if I can) and I'm aggressive about cutting off lines at 80 characters.   The upshot is that I'm showing less text on the screen at a time than most programmers I know. &lt;br /&gt;&lt;br /&gt;Good?  Bad?  Not sure.  The 80 character habit came from I think a combination of &lt;i&gt;Code Complete&lt;/i&gt; where it's recommended on the (outdated now) premise that that's as many characters as you could print on a line, plus doing the books, where you generally do have to cut the examples off at 72 or 80 characters, plus some nasty HTML bugs where somebody tried to do a whole table in one line, and there was a missing &amp;lt;/td&amp;gt; in column 436 or something.  I'll stretch beyond 80 characters, but I really don't like having code hang that I&lt;br /&gt;have to scroll right to see. &lt;br /&gt;&lt;br /&gt;The bigger font I think is more of a aesthetic choice (and not, say, a vision issue).  I do like that it tends to focus me on one method at a time, and encourages me to keep methods shorter to stay on one screen.&lt;br /&gt;&lt;br /&gt;A couple of years ago, I did a little internet search on fonts for programming.  Among other things, I found there are people who really like programming with a 7 or 9 point font.  Anyway, I picked &lt;a href="http://ftp.gnome.org/pub/GNOME/sources/ttf-bitstream-vera/1.10/"&gt;Bitstream Vera Sans Mono&lt;/a&gt; (and also the open source twin &lt;a href="http://dejavu.sourceforge.net/wiki/index.php/Main_Page"&gt;Deja Vu Sans Mono&lt;/a&gt;) because it is a bit heavier weight than Courier, a lot prettier to look at, and it's specifically designed to differentiate between similar characters.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-7405499796743949323?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7405499796743949323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/7405499796743949323'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/fonts.html' title='Fonts'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2158019624188656281</id><published>2006-09-04T23:45:00.000-05:00</published><updated>2006-09-01T07:26:01.137-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='webapp'/><title type='text'>Web Apps and Language Wars</title><content type='html'>I wasn't planning on posting about either web apps or linking to Joel Spolsky again, but &lt;a href="http://www.joelonsoftware.com/items/2006/09/01.html"&gt;this language wars post&lt;/a&gt; is just too interesting to pass up.  Besides, a jillion people have already commented on this, so what's a jillion and one?&lt;br /&gt;&lt;br /&gt;Spolsky is riffing on what language or platform you should use for an enterprise web project.  He makes a few points (note, I'm paraphrasing him here -- these are his points, not mine):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There are 3 1/2 platforms that are proven to work in the enterprise web app space (Java, C#, PHP, and maybe Python.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Within that group, there's no difference large enough to offset expertise, so pick the one that you know the best.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rails is not part of that group.  Even though it's fun.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I suspect you know which one of those three points has gotten the most attention.  Obviously the Rails people are ticked off, which I think is a combination of Spolsky taking his point too far, and Rails partisans taking his point even farther.&lt;br /&gt;&lt;br /&gt;Look, I love Rails as much as a person can love a framework.  I wish I had been smart enough to put all the pieces together myself (another post for another time...).  My Rails experience has been uniformly positive.  Nevertheless, if I wanted to pitch Rails for a mission-critical enterprise application, I would expect to have to justify the choice.  Using Rails is still a risk, relative to the others, it's still newer, people are still trying to work out optimal deployment, it still doesn't have the library support the others have.   Where I would differ from what Spolsky is saying is that I think it might be a justifiable risk even in a mission-critical enterprise application.&lt;br /&gt;&lt;br /&gt;Scaling and library support is not the only source of risk.  There's also the risk that your code will get bogged down in a huge ball of intertangled display and logic code (PHP).  Or the risk that your developer time will be slowed down enough that it delays deployment (Java).  Or the risk of deploying in a system that is owned by Microsoft (guess...).   Choosing one of the "nobody ever got fired for choosing X" languages is a safer choice.  Which doesn't always make it the best choice.&lt;br /&gt;&lt;br /&gt;(And yes, I know that Spolsky ends his essay by mentioning that one of his apps is written in a custom in-house version of VBScript.  Red herring.  He's not saying that Java, C#, and PHP are the only languages to use ever, just that they are the only languages that currently have the ecological support to be guaranteed safe in a "death before failure" scenario.)&lt;br /&gt;&lt;br /&gt;I'd argue the following corollary:   I agree that, all else being equal, expertise trumps any difference between these platforms.  That's a little circular, of course, because how will you get experience without using a tool? (I know about apprenticeship as a junior member on a larger project, but it's not always feasible.)  Almost every project or team spins off low-level applications -- bug trackers, vacation trackers, internal chat rooms.  Things that are not high-priority, but are still useful.  So, when putting those together, I think it's a good idea to range far and wide and try new things that might pay off in a future project (I almost wrote that you "have the right, no, the duty" to do that, but I thought that might be a little over the top).  Me, I'm going to try out Python/Django next chance I get...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2158019624188656281?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2158019624188656281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2158019624188656281'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/web-apps-and-language-wars.html' title='Web Apps and Language Wars'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-6427164799645305870</id><published>2006-09-01T08:01:00.000-05:00</published><updated>2006-08-31T09:01:49.924-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Java Closures</title><content type='html'>Here's a nice item being proposed for Java 1.7: &lt;a href="http://gafter.blogspot.com/2006/08/closures-for-java.html"&gt;closures in Java&lt;/a&gt;.  On behalf of all those people who actually do create entire classes just to be able to use map and other functional styles in Java, may I say, please, please, please put this in Java.  (This seems a good place to link to Joel Spolsky's wonderful programming fable "&lt;a href="http://www.joelonsoftware.com/items/2006/08/01.html"&gt;Can Your Programming Language Do This&lt;/a&gt;").&lt;br /&gt;&lt;br /&gt;The proposed syntax looks like this:&lt;br /&gt;&lt;pre&gt;public static void main(String[] args) {&lt;br /&gt;  int plus2(int x) { return x+2; }&lt;br /&gt;  int(int) plus2b = plus2;&lt;br /&gt;  System.out.println(plus2b(2));&lt;br /&gt;}&lt;/pre&gt;Line one of that syntax creates a closure object that takes and returns an &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt; using what is basically Java method syntax.  Line two assigns that closure to another variable using the syntax &lt;span style="font-family:courier new;"&gt;int(int)&lt;/span&gt; to specify the types of the signature.  Line three shows that you can call the closure object as you'd expect, although notice that, unlike most Java calls, there's no receiver object specified, and it's not using an implicit &lt;span style="font-family:courier new;"&gt;this&lt;/span&gt; -- it's purely a function.&lt;br /&gt;&lt;br /&gt;The proposal also specifies an alternate syntax for creating short closure objects -- I don't like this one as much:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int(int) plus2b = (int x) : x+2;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is all nice, and I know I'd use it pretty much daily.   Unfortunately, though, I wonder if the strict typing will wind up making the closures less useful than, say, Ruby blocks.  I assume there'd be some way to tie this into the generics system so that methods that might take blocks with different type signatures would be able to convince the compiler that everything is okay.   Let's see... if I wanted to do a new method of List collect, it would be something like this.&lt;br /&gt;&lt;pre&gt;public List&lt;v&gt;&amp;lt;V&amp;gt; collect(V(T) closure) {&lt;br /&gt;    List&lt;v&gt;&lt;/v&gt;&lt;/v&gt;&amp;lt;V&amp;gt;&lt;v&gt;&lt;v&gt; result = new ArrayList&lt;/v&gt;&lt;/v&gt;&amp;lt;V&amp;gt;&lt;v&gt;&lt;v&gt;&lt;v&gt;();&lt;br /&gt;    for (T obj : iterator()) {&lt;br /&gt;        result.add(closure(obj))&lt;br /&gt;    }&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int plus2(int x) { return x+2 };&lt;br /&gt;List&lt;int&gt; fred = list.collect(plus2);&lt;br /&gt;&lt;/int&gt;&lt;/v&gt;&lt;/v&gt;&lt;/v&gt;&lt;/pre&gt;Is that right?  If so, that's certainly a lot better than we have now.&lt;br /&gt;&lt;br /&gt;I have three quibbles and an enhancement.&lt;br /&gt;&lt;br /&gt;Quibble 1: Like generics, what looks nice for &lt;span style="font-family:courier new;"&gt;int(int)&lt;/span&gt; is going to look a lot less pleasant when the signature is, say, &lt;span style="font-family:courier new;"&gt;OrderLineItem(Order, Product)&lt;/span&gt; or even better &lt;span style="font-family:courier new;"&gt;List&amp;lt;List&amp;lt;OrderLineItem&amp;gt;&amp;gt;(List&amp;lt;Order&amp;gt;, List&amp;lt;Customer&amp;gt;, List&amp;lt;Product&amp;gt;)&lt;/span&gt;, which I could easily see as a real world case.&lt;br /&gt;&lt;br /&gt;Quibble 2: Do do this right would require including support for closures up and down the standard library -- all through the &lt;span style="font-family:courier new;"&gt;util&lt;/span&gt; classes, all through SWING, JDBC -- there's all sorts of places in the library that would be cleaned up by being able to take closures.  I suspect that's unlikely to happen quickly.&lt;br /&gt;&lt;br /&gt;Quibble 3: The proposal says "We are also experimenting with generalizing this to support an invocation syntax that interleaves parts of the method name and its arguments, which would allow more general user-defined control structures that look like if, if-else, do-while, and so on."  I'm thinking this is more of a Smalltalk or Objective-C style?  That would look odd within Java.&lt;br /&gt;&lt;br /&gt;What I really want, though is a &lt;span style="font-family:courier new;"&gt;method&lt;/span&gt; literal analogous to a  &lt;span style="font-family:courier new;"&gt;class&lt;/span&gt; literal.  Something like...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Integer(MyClass) closure = MyClass.someSillyThing.method;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;MyClass obj = new MyClass();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Integer x = obj.closure(3);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or even better:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;MyClass obj = new MyClass();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Integer(MyClass) closure = obj.someSillyThing.method;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Integer x = closure(3);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And yes, I realize that's basically Python bound and unbound methods.  The tricky part in Java is that there might be more than one overloaded method called &lt;span style="font-family:courier new;"&gt;someSillyThing&lt;/span&gt;, and so I'm assuming that whatever closure object I'm creating would be able to get the right one based on the declared type (or, alternately, I suppose, dispatch properly when called).  That should be doable, though.  And then my Java code can look even more like Python...&lt;br /&gt;&lt;br /&gt;Good stuff.  I hope something like this gets in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-6427164799645305870?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6427164799645305870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/6427164799645305870'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/09/java-closures.html' title='Java Closures'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-4598774615744688900</id><published>2006-08-31T07:00:00.000-05:00</published><updated>2006-08-30T12:09:07.460-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Languages I Use</title><content type='html'>Continuing in the getting to know you kind of vein, I thought I'd ground some of what I say by talking about the three programming languages that have made up the bulk of my professional and hobby work for the past five years or so -- Java, Python, and Ruby.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt;:  I've been programming Java since either just before or just after the 1.0 release... can't quite remember at this point.  I think I've covered most of the major Java libraries (although I've done very little EJB work).  Basically, Java is the station wagon of programming languages.  It's not elegant or efficient, but it gets you where your going and you won't offend anybody along the way.&lt;br /&gt;&lt;br /&gt;Far and away the best feature of working in Java is the tool support, especially the IDE support.  If you're doing something in Java, odds are somebody has done it before and there's an open source .jar file somewhere that will help.  Plus, IntellJ IDEA makes working in Java almost as productive on a time-basis as working in a scripting language.&lt;br /&gt;&lt;br /&gt;Java is, of course, famously verbose, and there's the constant sense of telling the compiler things that the compiler should already know.  (The 1.5 language features improve this somewhat, at the cost of moving some of the verbosity elsewhere).  Java's original design goal was basically to get C programmers to do object-oriented stuff without scaring them away, and at that it's a success, but that does lead to oddities like having both basic types and object wrappers for them, and keeping the ridiculous C-style &lt;span style="font-family:courier new;"&gt;switch&lt;/span&gt; statement.&lt;br /&gt;&lt;br /&gt;There's also the "Java style" of OO design, enshrined early on by Sun, and followed by many third-party libraries.  To oversimplify, there's a lot of design made complicated by the desire to make less common tasks as privileged in the API as more common ones.  For example, the need to spell out what are basically boilerplate properties in a &lt;span style="font-family:courier new;"&gt;web.xml&lt;/span&gt; file or a Struts config file.  Swing has several features like this, including the event system and say, supporting multiple listeners for a button click.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Python&lt;/span&gt;:  With Python I suppose you have to start with the whitespace thing, although I know that anybody who actually works in Python is sick of hearing about it.  I wrote what I hope was a spirited defense of it in the Jython book, and I'm not going to repeat myself.  What I like most about working in Python is the conceptual consistency -- objects are like classes are like modules are like dictionaries.  I find that to be a very powerful equation, and it makes Python code more predictable to me.  I also think the syntax is very clear and readable.  (I particularly like the list comprehension syntax.)&lt;br /&gt;&lt;br /&gt;On the down side, although there probably is more Python libraries than Ruby ones floating around (although I'm not as sure of that as I was even a year ago), there's no central repository so they are harder to find.  It is true, though, that Python style quirks are more likely to bleed into my programming in other languages than vice-versa -- I write a lot of Java code that really looks like it wants to be written in Python.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ruby&lt;/span&gt;: I actually got into Python, Ruby, and XP at about the same time.  I started on Ruby because a number of the early XP gurus were excited about it.  And while I know I'm supposed to pick a side or something, I actually like Python and Ruby both quite a bit.  There are some particular bits of Ruby syntax that I think are particularly well done, for example the way that accessors are handled.  I even like that you can leave parentheses off method calls if the line is unambiguous, although a little of that can go a long way.  Blocks make the language very flexible, and very easy to build non-redundant code in.&lt;br /&gt;&lt;br /&gt;There are a couple of pieces of Ruby syntax that make me nervous, like the syntactic sugar for hashes as the last argument of a method or the way you don't have to specify that a block is needed in the signature of a method.  To be fair, I haven't experienced practical problems with these features yet.  Ruby has a lot of syntax sweetener compared to Python, which is sometimes good (elegant Ruby code is very elegant) and sometimes bad (I've had some trouble following Ruby examples if they are very magical).  Because Ruby has been the focus of a lot of XP/Agile writers, the testing tools and general XPish support is very good.  For a long time, I thought that general library support lagged Python, but that's becoming less true daily.  And of course there is also Rails, about which more at another time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-4598774615744688900?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4598774615744688900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/4598774615744688900'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/08/speaking-in-tongues.html' title='Languages I Use'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-1632184787539260930</id><published>2006-08-27T16:22:00.000-05:00</published><updated>2006-08-27T16:39:40.292-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Code Complete: An Appreciation</title><content type='html'>It's been about 25 years since I first typed &lt;span style="font-family:courier new;"&gt;10 PRINT "HELLO"&lt;/span&gt;, and in that time I've read dozens of books aimed at making me better at creating software.  There are several things I want to do with this site, but certainly one of them is to recognize those books that had a particularly strong impact on my professional career.&lt;br /&gt;&lt;br /&gt;The first one is &lt;span style="font-style: italic;"&gt;Code Complete&lt;/span&gt;, by Steve McConnell.  It stands out on the shelf because it's not about learning a new language, tool, or discipline, and it's not a big picture rethinking of software engineering itself.  Instead, it's a series of presentations of empirical data about specific features of the coding process, as well as very specific examples of how to generate elegant, readable code.&lt;br /&gt;&lt;br /&gt;I read this book the summer before I entered a graduate program in Computer Science, in a defensive panic that I didn't know enough actual programming.  As soon as I finished it, I started rewriting my existing programs to align with McConnell's suggestions, and I've never really stopped.  In particular, the sections on control structures and layout paint a clear picture of what maintainable software looks like in practice, simply be setting out the principles and demonstrating them example by example.&lt;br /&gt;&lt;br /&gt;The book's influence is all the more amazing because its examples are in langauges (C, Basic, and Pascal) that have not been useful to me professionally.  (I had stopped using Pascal by the time I read it, wrote a little Visual Basic since, and probably an even smaller amount of C).  The basic ideas, though, are adaptable to any declarative language.  There's a second edition, dated to 2004, that I haven't read, but which I understand updates the data and examples in the book (the examples now include Java and C#).  (Come to think of it, I probably should check it out...).&lt;br /&gt;&lt;br /&gt;It's rather amazing to me that so many of the Amazon reviews of this book still, nearly fifteen years after its original publication, say that there's no other book that covers this kind of ground.. the kind of pinhole cleanup of code that is so much of the difference between a great program and a mess.  I actually think there are one or two other books that cover similar ground, but it's clear to me that this is a gap in the kind of knowledge about programming that is shared.  This book will make you a better programmer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-1632184787539260930?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1632184787539260930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/1632184787539260930'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/08/code-complete-appreciation.html' title='&lt;i&gt;Code Complete&lt;/i&gt;: An Appreciation'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9077350032409035843.post-2743529922687648506</id><published>2006-08-26T21:55:00.000-05:00</published><updated>2006-08-25T22:05:28.336-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wxpython'/><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='publishing'/><title type='text'>Occasionally Asked Questions</title><content type='html'>I wouldn't say it happens often, but I do sometimes get asked some questions about being a technical author.  Seemed like a good place to start.&lt;br /&gt;&lt;br /&gt;For a long time, the most common question was &lt;span style="font-weight: bold;"&gt;Did you pick the animal on the cover of the Jython book?&lt;/span&gt;  The answer is no.  The cover animals are picked by the O'Reilly production team, and the mechanism they use for assigning animals to books is somewhat mystical.  I think we could have rejected it had we had a really strong reason (I know of at least one other book that has).  For the wxPython book, Manning offered us a selection of a few different art figures, and we also picked the color of the spine.&lt;br /&gt;&lt;br /&gt;The other most common question is something like &lt;span style="font-weight: bold;"&gt;Can you make a living at this?&lt;/span&gt; or more generally, how publishing finances work.  I'm not a complete expert, but I suspect my experiences generalize.  Tech books are generally sold on the basis of a proposal (in contrast to fiction novels from new authors, which are usually not sold until the book is complete).  Publishers generally describe their proposal formats on their websites -- I can't talk as much about that part of the process because I came in after the proposal phase in both cases. &lt;br /&gt;&lt;br /&gt;The contract specifies payment as an advance and a royalty rate.  The advance is paid up front in stages as the book is completed.  There's room for negotiation on this, but it's typically something like 1/3 on signing, 1/3 at the halfway point, and 1/3 when the final manuscript is approved.  My sense is that newbie authors can expect an advance in the mid to high four digit range.  The royalty rate the amount of each books sale that goes to the author (the amount is based on what the publisher is paid by the store, not on the cover price of the book).  However, the amount of the advance is subtracted from the royalties -- the author does not see additional payment until the total royalty amount exceeds the initial advance.  At this point, the book is said to have "earned out".  In case you are wondering, the author does not have to return the advance if the book never earns out -- the advance is a gamble by the publisher.  A typical royalty rate is about 10%, but some publishers (notably Pragmatic) offer more.  If there is more than one author, than the authors decide how the money will be split among them, and that split is also enshrined in the contract.&lt;br /&gt;&lt;br /&gt;Oh, and if you have an agent, then the agent typically takes %15 percent off the top.  Typically, they earn it, too, either by getting the contract in the first place, or by dealing with the publisher when you don't want to.&lt;br /&gt;&lt;br /&gt;Tim O'Reilly said on his blog some time ago that the typical O'Reilly book earns about $15,000 for it's author.  In my case, however, we earned less than that, since the Jython book has yet to earn out. In fact, it will probably never earn out -- in fact, based on the figures O'Reilly gave in his post, it's probably among the lowest selling O'Reilly books ever (at around 6000 copies or so), so I've got that going for me.  I haven't gotten sales figures on the wxPython book yet, but it's Amazon ranking has been pretty good, so I'm hopeful.&lt;br /&gt;&lt;br /&gt;I've just started writing some articles for sites like IBM developer works, which is more lucrative on a per-word basis, but I'm not planning on quitting my day job anytime soon.&lt;br /&gt;&lt;br /&gt;That'll do for now.  As I think of some other questions of interest, I'll post them here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9077350032409035843-2743529922687648506?l=10printhello.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2743529922687648506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9077350032409035843/posts/default/2743529922687648506'/><link rel='alternate' type='text/html' href='http://10printhello.blogspot.com/2006/08/occasionally-asked-questions.html' title='Occasionally Asked Questions'/><author><name>Noel Rappin</name><uri>http://www.blogger.com/profile/07196693221217343089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
