<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><description>reborg[at]reborg.net
@twitter | @delicious | @flickr | @vimeo | @trailguru | @reborgtrio | @lastfm | @linkedin


var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

var pageTracker = _gat._getTracker("UA-616987-2");
pageTracker._initData();
pageTracker._trackPageview();
</description><title>Reblog</title><generator>Tumblr (3.0; @reborg)</generator><link>http://reborg.tumblr.com/</link><item><title>Programming Languages</title><description>&lt;p&gt;This time I want to dedicate the opening of the last 2 weeks’ highlights to programming languages in general. Why? Because I had a chance to attend the &lt;a href="http://olabini.com/blog/2009/06/videos-from-the-chicago-acm-ioke-talk/" target="_blank"&gt;Chicago Chapter of the ACM presentation&lt;/a&gt; with Ola Bini on Ioke. Programming languages are a business domain exactly like banking or insurance with the difference that the “business analysts” is a programmer by definition. For some reason I didn’t pay too much attention in the past to this business domain and I was wrong. Shame on me. I came to the conclusion that learning about compilers, optimizations, expressivity, AST, interpretation and so on is vital to the life of a programmer. Of course you don’t need to be able to create your own language, but you should know what we are talking about. Back to the presentation: I think Ola was giving his best. Of course Ioke is Ola’s little kid, who wouldn’t be thrilled to talk about it? Sure enough the talk is about the language, but there are interesting cross-language considerations. I realized how specific is the domain of languages, it really requires you to be into it to understand everything. For this reason, Ioke is a good teaching language because it’s all about language theory than for example, performances or concurrency. Final note: stating that all other languages are crap is not fair, even from the point of view of expressiveness which is subjective matter. If expressiveness of a language is the deviation from the idea you have in mind and what actually can be coded, then also Ioke is crap to someone who of doesn’t think the same as Ola.
&lt;/p&gt;

&lt;p&gt;Other interesting topics includes:&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://javaposse.com/index.php?post_id=493300" target="_blank"&gt;The Java Posse - Staffing Agile Teams&lt;/a&gt;…
Interesting panel. I think Barry Hawkins is the chair master (&lt;a href="http://www.yepthatsme.com/" target="_blank"&gt;http://www.yepthatsme.com/&lt;/a&gt;) and he’s the one  saying the most interesting things. Overall the talk illustrates different personality types for agile programmers and what to search for to staff agile teams. Sometimes is necessary to turn down awesome skilled people if they don’t fit into the team. For example ability to cooperate must be just the right level: humility is important as well as not over-cooperate (questioning too much about team choices instead of having things done). Prefer people you need to bring up to speed in 3/4 weeks instead of skilled people that you can’t unlearn if they are assholes. Inefficiencies of the interviewing process can be exploited by contracting to hire. Problems are a certain kind of super-stars: they give the illusion f productivity creating unnecessary complexity that they only can understand. Sometimes you just need some more courage to let go people that are not a good fit.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.javaworld.com/podcasts/jtech/2009/060209jtech-zilker-terracotta.html" target="_blank"&gt;Ari Zilka on Terracotta’s VMware integration&lt;/a&gt;…
Again on Terracotta. In this episode there are again interesting solutions to remember. Terracotta partnered with VMWare to distribute enterprise Java applications in VMs. The side effect is the one click provisioning model, where instead of the tarball you install an image that freezes completely the environment so you don’t need to fight with compatibilities issues. It also turns out that multiple instances of the same app running on the same big server is a better hardware optimization than having the same instances running on different physical hardware. So instead of 100 servers, maybe you have only 20 running 5 VMs each with the same image. Now this has nothing to do with Terracotta in specific, it’s just their actual selling pitch. The Ruby hosting world has indeed moved to the same model, calling them slices, dynos, nodes and so on.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://web20show.com/episodes/episode-19-david-heinemeier-hansson" target="_blank"&gt;The Web 2.0 Show - Episode 19 - David Heinemeier Hansson&lt;/a&gt;…
Once again I enjoyed listening to the story of DHH and 37Signals flagship products. This time I heard a little more about the personal history starting from the 2000 or around. It’s inspiring and motivational. The idea I got about the success of Rails is that is based on pure execution, that is, given a technology that doesn’t get in your way and an idea on how to improve a bit the quality of life, a pragmatic approach makes it a success no matter what. Doh, sure that is a known fact, but VCs and the Valley style pushes to another direction. DHH gives a good reason why it’s time to start a software business: it requires just your time, the hardware is cheap, an office is less important when the network enables distributed collaboration easily. In other word, you don’t need a huge investment to start with, just 3 months of your nights and weekend. Of course is not easy, but at least you know that depends just on you.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/130722978</link><guid>http://reborg.tumblr.com/post/130722978</guid><pubDate>Fri, 26 Jun 2009 12:27:17 -0500</pubDate><category>thisweekhighlights</category><category>languages</category><category>programming</category><category>ola</category></item><item><title>Everyman Report</title><description>&lt;p&gt;For the past two weeks I tried one of the &lt;a href="http://en.wikipedia.org/wiki/Polyphasic" target="_blank"&gt;polyphasic schedules&lt;/a&gt; called &lt;a href="http://everything2.com/index.pl?node=Everyman%20Sleep%20Schedule" target="_blank"&gt;Everyman&lt;/a&gt;. I enjoyed the experiment, especially the first 10 days but I had gave up at the end. Here’s how things went.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I first did a preparation period where I tried to consistently stay up late at night but without constraining the core sleep to 3 hours, i.e. without waking up at 5am.
&lt;/li&gt;
&lt;li&gt;I then moved to the following schedule: core (2am-5am), nap-1 (10am), nap-2 (4pm), nap-3 (9pm)
&lt;/li&gt;
&lt;li&gt;I initially decided to compensate for the decreased sleeping time adding deep relaxation &lt;a href="http://reborg.tumblr.com/post/102158578/how-to-take-a-5-minutes-nap" target="_blank"&gt;5 minutes micro-naps&lt;/a&gt; between pomodoros. I thought that throwing this into the mix was a good integration strategy.
&lt;/li&gt;
&lt;li&gt;Micro-naps turned out to be a bad move. You don’t want to interfere with the 20’ naps where you want to enter REM as soon as possible. In other words, you have to feel really tired to achieve that kind of intense sleep and micro-napping was preventing this.
&lt;/li&gt;
&lt;li&gt;The adaptation phase end was on day 6: I fell asleep immediately and dream vividly during the nap while before I was mostly awake. The day before I was not able to follow the schedule and that I think triggered the sleep compression during the 20’ nap the next day.
&lt;/li&gt;
&lt;li&gt;On the second week I started having problems waking up after the core sleep. Yes I was awake but unable to anything than mechanical things until 7-8am. I started questioning the benefits after 3 mornings in that condition.
&lt;/li&gt;
&lt;li&gt;I decided to add an additional nap to the mix changing the schedule to: core (2am-5am), nap-1 (10am), nap-2 (2pm), nap-3 (8pm), nap-4 (10pm) but the problem after the core was still there and I also experienced sleepiness after 1 hour from the 20’ nap
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last move didn’t help and maybe worsened the situation. I browsed the &lt;a href="http://groups.google.com/group/Polyphasic?lnk=srg" target="_blank"&gt;polyphasic forum&lt;/a&gt; in search for help to see if I was doing something wrong. It turns out that is not enough to just follow the schedule and pretend that everything is ok. The next step after the adaptation is to search for the optimal core positioning during the night and the other naps during the day so that they are more consistent with the new body sleep requests. Since it was already demanding for me the fact to follow a sleep schedule, I finally gave up.&lt;/p&gt;

&lt;p&gt;Wow, what an experience! I enjoyed having a couple of 8-days weeks and the boost of productivity especially at the beginning. But the initial boost went back to normal for the above problems at the end of the second week. So I had to make a decision: if I’m not going to use those additional 4 hours a day for things that I like to do because I’m too sleepy to do them well, what’s the point? If I have to spend time reading forums and experimenting on tweaking the schedule, what’s the point? I will definitely give polyphasic a second try as soon as my life allows me again to experiment a little more, but for now I have to concentrate on other things.&lt;/p&gt;

&lt;p&gt;The strategy that worked really well for me until now that I’m going to resume is to have relatively short nights of around 6 hours sleep and micro-napping between pomodoros.&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/125990297</link><guid>http://reborg.tumblr.com/post/125990297</guid><pubDate>Thu, 18 Jun 2009 14:24:00 -0500</pubDate><category>polyphasic</category><category>everyman</category><category>sleep</category></item><item><title>Pomodori 0.3</title><description>&lt;img src="http://reborg.github.com/pomodori/resources/pomologo-shade.png" style="width: 97%;"/&gt;&lt;p&gt;I’m happy to announce &lt;a href="http://reborg.github.com/pomodori/" target="_blank"&gt;Pomodori&lt;/a&gt; release 0.3. Just follow the link and the installation instructions on the page. For those who don’t know, Pomodori is the pomodoro management application I’m using every day since February. “819 pomodoros and counting!” is what I see right now. Pomodori isn’t just a timer, it’s a tool implementing the &lt;a href="http://www.pomodorotechnique.com/" target="_blank"&gt;Pomodoro Technique&lt;/a&gt;. At this point Pomodori is missing several important features and that’s the reason to call it a zero something release.&lt;/p&gt;

&lt;p&gt;Pomodori improved my day by day implementation of the PT featuring essential aspects without my assistance: start a 25’ countdown, ring, ask me for a description, give me a 5’ break, ring again, start another pomodoro. Recently Pomodori can also answer questions like “what did I learned yesterday?” or “how many pomodoros can I plan for today?” and so on. Clearly this is just scratching the surface of the technique. For example, right now the inventory and the day by day todo list are external plain text files that one day I want to see integrated in the tool.&lt;/p&gt;

&lt;p&gt;Technically Pomodori isn’t just built for time to market, quite the opposite actually. The project is my playground for MacRuby, something the typical user of the PT sure cares about! The fact that it’s targeting only the Mac is also a barrier for mass adoption. So dear customer, be patient if you don’t see the standard behavior expected from a mac app right away, I’m learning all about Cocoa right now.&lt;/p&gt;

&lt;p&gt;In this release, 0.3, you can finally access partions of the Pomodori database. This is limited to yesterday’s and today’s pomodoros but the plan is to extend the search to any ranges so you’re free to dig deep into the past. Announce: with 0.4 you should see an exciting new feature coming up, which is just the beginning of the social part of Pomodori.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Developers!&lt;/b&gt; If you like Ruby and the Mac please join me on github you won’t be disappointed. Pomodori implements an interesting MVC architecture and it’s fully built TDD from the ground up, view logic included, no XCode required. Especially if you know Cocoa/Objective-C, that’s my weakest point. Enjoy!&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/124548767</link><guid>http://reborg.tumblr.com/post/124548767</guid><pubDate>Tue, 16 Jun 2009 07:28:24 -0500</pubDate><category>pomodoro</category><category>pomodori</category><category>pt</category><category>timer</category></item><item><title>Intentional and DSLs</title><description>In what now seems to be a biweekly installment, I’ve read and listen around quite a bit lately. Since the beginning of my &lt;a href="http://reborg.tumblr.com/post/114867960/going-information-diet" target="_blank"&gt;information diet&lt;/a&gt;, I have way less processing to do and my sources are only a couple of conference videos online and a few other things. The item that generated the biggest train of thoughts was the release of the Intentional software workbench that I heard of while reading Martin’s&lt;a href="http://www.martinfowler.com/bliki/IntentionalSoftware.html" target="_blank"&gt;MF Bliki&lt;/a&gt;. DSL workbenches are a fascinating topic these days and there is sure potential in our industry. The typical use case for DSLs is medium to high complexity business logic that usually is described by business analysts in a non-executable formats. The workbench can be used to maintain the sync between the generated DSL and the business view of rules. Why not using user stories like the rest of the application? Because the business logic is so complicated that it requires a detailed description and verbal communication is not enough. With a DSL workbench duplication between the Word documents and the actual code is eliminated by using an abstract language that describes the domain. Just be careful: the presentation talks generically about “creating software” without specifying that we are talking about the DSL portion of it. Don’t use these products to generate the whole application!


&lt;p&gt;Other notables include in no specific order:&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://www.vimeo.com/4335944" target="_blank"&gt;Compass: A Real Stylesheet Framework&lt;/a&gt;…
Here’s a very nicely done screencast on how to jump start quickly on a web page design based on sass, blueprint and compass. Chris is kind enough to explain basic concepts, when to use id or classes, sass basics, how to organize your project and so on. The power of mix-ins in sass is great and makes thing quick and easy. As Chris says at some point, you can write your self most of these stuff, but why? Sass generation is unobtrusive and sass template are very readable. The grid system is a breeze once you understand how to attach the column width information to divs. All pretty easy stuff. Thanks for the great screencast.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://railsconf.blip.tv/file/2081411/" target="_blank"&gt;RailsConf 09 DHH Rails 3&lt;/a&gt;…
I think it’s the second time I heard about custom attributes in HTML 5. Rails 3 is going to use custom attributes to signaling the framework how to build the javascript actions connected to events, like onclick(). Remains to understand when the transition will actually happen for legacy browsers. Another interesting thing is the rewriting of generators so that scaffolding can be tailored for the particular choice of javascript library, ORM mapping strategy and so on. Rails is still opinionated with defaults but it should be easier to coexist with different opinions.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;printTitle=Industry_Misinterpretations_138:_Who_Killed_What&amp;entry=3421246603" target="_blank"&gt;Industry Misinterpretations 138: Who Killed What&lt;/a&gt;…
Interesting response here to Uncle Bob “who killed SmallTalk” keynote. If you skip the discussion about the definition of “dead” which is useless in my opinion, I like the “renaissance” model in which a powerful language which is no more fashionable at some point, becomes mainstream again for some unexpected conjunction of facts. At least this is the hope of the SmallTalk community. I don’t know if that could happen though, considering that SmallTalk evokes old technologies that didn’t work (being that true or not). What maybe is possible is the re-incarnation of SmallTalk with a different name, exactly like old good marketing rules tell us all the time.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.engineyard.com/blog/community/scotland-on-rails/page-2/" target="_blank"&gt;Scotland on Rails 2009 - The Ruby Object Model - Dave Thomas&lt;/a&gt;…
This is basically the screencast no.1 from the pragcasts made up as a presentation. I viewed that again with pleasure because Dave is a great speaker and the topic is always hot. Ruby is strictly object based as it should be for an OO language. The strange thing is that passing the time the pure OO heritage has been lost starting from C++, Java and the rest that came after. In those languages a Class is not an object but only something that the compiler knows what to do about it. In Ruby class are just “simulated” as interaction between objects that contain methods and a pointer to the “parent”. This is the reason of the great flexibility of Ruby, everything is an object model and can be accessed anytime.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.se-radio.net/podcast/2009-05/episode-136-past-present-and-future-mda-david-frankel" target="_blank"&gt;Episode 136: Past Present and Future of MDA with David Frankel | Software Engineering Radio&lt;/a&gt;…
MDA is presented in this podcast as the evolution of UML which with after the introduction of OCL was trying to be more specific and semantic. Sorry, I just don’t get it and what I hear is pure fluff. As far as I can understand, MDA is trying to be a visual language for languages. Components can be specified using MDA and the code generated accordingly. In the opinion of David Frankel abstractions are emerging from different industries and similar tools are created to model the application. From what I can remember, this was going on for decades, but we never had the power of building the big unifying abstraction to describe all business components.  And by the way, what is wrong in choosing a language and evolve reusable components and stick with it for, say, 5 years? Then I throw everything away and switch to the next language, so what? I understand using DSLs to describe portions of an application, but I don’t understand why I should create the whole application as a DSL or MDA.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast163SoftwareMetricsWithPatrickSmacchia.aspx" target="_blank"&gt;Hanselminutes Podcast 163 - Software Metrics with Patrick Smacchia&lt;/a&gt;…
Interesting talk on metrics here. It’s always good to remember the there are good and simple metrics that cover most of the cases without the need of an exotic mathematic formula. For example lines of code by feature can reveal unwanted complexity for comparable features. Another interesting one is loc covered by test ratio. Loc is not enough to guarantee quality of code. Cyclomatic complexity can be used to spot difficult-to-maintain code. While too high afferent (incoming) coupling (Ac) means probable SRP violation and it’s time to extract one/many interfaces to create dependency on abstractions. There are also composed metrics: CRAP is one or the maintainability index. But these are numbers without dimensions and it’s is easy to expose false positives because of their complexity. A new one I learned here is the MethodRank, the rank algorithm applied to the method dependencies tree. At the top there are methods which should be tested more carefully because of their high dependency.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/122845277</link><guid>http://reborg.tumblr.com/post/122845277</guid><pubDate>Sat, 13 Jun 2009 05:59:00 -0500</pubDate><category>thisweekhighlights</category><category>dsl</category><category>intentional</category><category>metrics</category></item><item><title>Pomodoro-GTD Interview</title><description>I had the pleasure to attend the recording of the last episode of the &lt;a href="http://gtd-vsg.blogspot.com/2009/06/perspective-and-control.html" target="_blank"&gt;Virtual GTD Study Group&lt;/a&gt;. The topic was &lt;a href="http://lifehacker.com/5109653/david-allens-making-it-all-work-a-new-look-at-gtd" target="_blank"&gt;“Perspective and Control”&lt;/a&gt;, a matrix chart that describes different states of focus but I’ve got a chance to introduce the technique and give also some advices for beginners. I talked about how the &lt;a href="http://www.pomodorotechnique.com/" target="_blank"&gt;Pomodoro Technique&lt;/a&gt; helps staying in the “Captain &amp; Commander” quadrant and other more general discussions. I also had the opportunity to explain why in my opinion the Pomodoro Technique and GTD integrates so well together. Overall I enjoyed the questions and the discussion and I had a very pleasant time. For the impatient, the Pomodoro chatting starts around 32:00 but don’t miss the previous part that explains what Perspective and Control is and how to use it. Also, consider to subscribe the podcast if you are interested in GTD and self productivity in general. &lt;a href="http://zugunruhecoaching.typepad.com/zugunruhe_coaching_llc/" target="_blank"&gt;Tara&lt;/a&gt; and the other guys are very supportive and you don’t want to miss their help!</description><link>http://reborg.tumblr.com/post/117579873</link><guid>http://reborg.tumblr.com/post/117579873</guid><pubDate>Wed, 03 Jun 2009 18:28:00 -0500</pubDate><category>pomodoro</category><category>podcast</category><category>interview</category><category>gtd</category></item><item><title>Pomodoro VS GTD</title><description>&lt;p&gt;Here’s my reading notes for the last two weeks. I definitely had a lot of thinking on how to integrate GTD with the Pomodoro technique and that’s my main topic this time.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.43folders.com/node/47756/323765" target="_blank"&gt;Productive Talk Compilation: 8-episode podcast with GTD’s David Allen | 43 Folders&lt;/a&gt;…
I’ve listened to this series back in time and I was curious to re-listen this conversation between Merlin Mann and David Allen about GTD to compare with the Pomodoro Technique. There are definitely lot of similarities. Basic principles are the same: avoid procrastination, focus on what is important and ultimately getting things done. But I see clear differences also: GTD focuses more on the collection phase while the Pomodoro Technique is more about execution and tracking. Thus the two technique mix together very nicely. Pomodoro doesn’t say anything about how to empty your brain out or give a name on what is in your head or the organization into folders and context. On the other end GTD doesn’t talk about prioritization processes or tracking to collect metrics. Also in the PT interruption handling is much more specific and reviews are daily. Last: GTD does way a better job at marketing the technique than pomodoros. That will change in the future, I think.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://lifehacker.com/5109653/david-allens-making-it-all-work-a-new-look-at-gtd" target="_blank"&gt;Lifehacker - David Allen’s  Making It All Work  a New Look at GTD - David Allen&lt;/a&gt;…
Interesting chart here. On the axis, perspective and control. The 4 resulting quadrants are very typical situations for everyone of us. High perspective means knowing at a glance everything that we want to have done and knowing that nothing is outside that list. Control means that we decide the priority of execution and how to manage that list. Low perspective, low control, means poor slave. High perspective high control means “captain &amp; commander” of you life. You go crazy when even if you maintain your high perspective you don’t follow your plans. I’m 80-90% in commander state but sometimes I fail and go “crazy” state. The main reason for that remaining 10-20% achievement is lack of sustainable pace because it happens almost only when I’m tired.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Gpgpu" target="_blank"&gt;GPGPU - General Programming GPU&lt;/a&gt;…
There’s a lot of interest in what GPU can do other than processing vertexes these days. It is pretty much the case that your actual computer is already equipped with a &gt; 200 cores underutilized GPU (unless you play a lot of 3D games). NVidia and ATI already produces SDK to exploit this computing power other than games for highly parallel stream processing. So instead of off-loading high load computations to some external form of parallel processing you can think of just run them on the GPU with surprising results. GPUs are much more powerful than normal multi-core CPUs for parallel processing so it make sense to use them instead of conventional parallel architectures.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.hanselminutes.com/default.aspx?showID=179" target="_blank"&gt;Hanselminutes - BBS era&lt;/a&gt;…
I’m really enjoying IT history lately and here’s another interesting piece of the story. I was too young at the time of BBSs to remember, too bad. BBS are similar to our IM of nowadays but as said in the podcast there are big differences. At the beginning, the computer of the SYSOP had to be completely dedicated to maintain the connection and the SYSOP could see user actions, like painting screens and drawing text. As such it allowed a complete control over the communication channel, with the option of jumping right into the user screen to ask questions or offer for help. It remembers me of the difference between modern cars, all electronics and pre-assembled pieces and old cars that could be potentially torn apart with a screwdriver to be inspected easily.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mobileorchard.com/interview-with-joe-hewitt-creator-of-facebook%E2%80%99s-iphone-app-the-three20-project-and-facebook-connect-for-iphone/" target="_blank"&gt;Joe Hewitt - Mobile Orchard&lt;/a&gt;…
Joe Hewitt, author of Firebug, moved to iPhone development lately with one of the most downloaded app from the AppStore, Facebook. Several core components from the Facebook app have been extracted and cleaned-up to become an open source collection of components called Three20. In this podcast Joe talks about the development details in Three20, html table cells without UIWebview, a Quartz based rich text editor for text field, an auto-resizeable text field and the popular photo chooser. I enjoyed the very technical conversation even if I’m not proficient with iPhone development. I immediately linked the Three20 project hoping to play with it soon. A good listening.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/115381956</link><guid>http://reborg.tumblr.com/post/115381956</guid><pubDate>Sat, 30 May 2009 12:35:53 -0500</pubDate><category>thisweekhighlights</category><category>pomodoro</category><category>gtd</category></item><item><title>Going Information Diet</title><description>&lt;p&gt;I’ve got the idea not a long time ago. Main reasons behind the decision are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I have a long queue of books I bought waiting to be read and I can’t find the time to read them.
&lt;/li&gt;
&lt;li&gt;I want to test the theory about consuming well digested and consistent information (such as books or essays) over partial and half-baked ideas (Twitter and also the majority of blog entries, plus mailing lists)
&lt;/li&gt;
&lt;li&gt;I feel the need to consolidate many years of open loops in my profession, scratching the surface of a topic and quickly jump away to ride the wave of the next cool thing.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To be clear: I want to test in practice the assumption that partial information is also partially useful. I think there is a not negligible effort to filter out the garbage and often the ‘cool thing’ of the moment is not directly applicable to solve the issue at hand without heavy manual intervention and related context switch. I understand that this is the way you do research on new ideas and contribute back with your support. But this is just a diet and it’s supposed to end after a while :)&lt;/p&gt;

&lt;p&gt;I don’t feel overwhelmed by current feeds, email, tweets or reading queues, especially after the recent pruning I did. But still, I can’t ignore that list of books waiting for me and the need to remove those distracting jumps I often experience from half-baked information. I also know I’m going to remove some very valuable source if I don’t follow blogs and tweets. That’s too bad, but I want to be proven wrong first.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The recipe&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Twitter: I’ll just stop following and updating. I removed my twitter iPhone app. I’d like to update, but If I do I know I’m tempted to see replies. Direct messages are ok.
&lt;/li&gt;
&lt;li&gt;Facebook: only personal stuff, pictures, keep in touch with old friends, no work related.
&lt;/li&gt;
&lt;li&gt;Feeds: uninstalled NetNewsWire. I won’t read feeds anymore.
&lt;/li&gt;
&lt;li&gt;Mailing lists: set up filter to move messages and mark as read. Unsubscribing is too long to do and by the way, what if I change my mind? :)
&lt;/li&gt;
&lt;li&gt;Podcasts: I’ll keep them because I only listen while running. Plus, it’s digested information most of the time.
&lt;/li&gt;
&lt;li&gt;Current reading queue/video: I’ll just save to read later some blog entries because related to my projects.
&lt;/li&gt;
&lt;li&gt;Google: of course! Whatever is related to the task I’m doing found on Google is good to read, blogs and tweets included. But the dependency is inverted. I just don’t want to search the net for generic ‘news’.
&lt;/li&gt;
&lt;li&gt;Mail and IM: no changes here.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As for my weekly highlights section: it won’t be updated often as before, but since I keep reading and listening around I’m pretty sure I’ll keep posting. For sure I have my thoughts on the book I’m reading. I’ll be happy to hear your reaction on this. Ah, the good old blog comments…&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/114867960</link><guid>http://reborg.tumblr.com/post/114867960</guid><pubDate>Fri, 29 May 2009 10:13:48 -0500</pubDate><category>diet</category><category>information</category><category>productivity</category><category>books</category><category>reading</category><category>twitter</category></item><item><title>Ruby VS Smalltalk</title><description>&lt;p&gt;A little better on my reading queue for this week’s highlights. I think the most interesting post (of course from my absolutely opinionated view) was the &lt;a href="http://railsconf.blip.tv/file/2089545/" target="_blank"&gt;Uncle Bob’s keynote talk&lt;/a&gt; at this RailsConf 2009. I always enjoy to hear interesting pieces of computing history and Uncle Bob is clearly a skilled storyteller. It must be fun (and also sad when you realize how old you are :) to write talks adding pieces of your personal history. 

What killed Smalltalk? It was too easy to make a mess. But also: image without source files, not free, competing implementations. Also a wrong attitude: Smalltalkers thought their language and tools were so good that they don’t need to be compliant with the typical corporate IT infrastructure.

The presentation is a concentrate of great thoughts. What is clean code? Is code that reveals what it does by reading it. If the WTF/min is != 0 is not clean. Ruby risks the same because it’s powerful. What can we do? Craftsmanship. Leave the campfire cleaner than you found it. A collective effort to maintain the code clean should save also the most powerful and risky language. Good start tdd: has infiltrated the ruby culture much more than it did with smalltalk.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.threeriversinstitute.org/blog/?p=187" target="_blank"&gt;Kent Beck - To Test or Not to Test? That’s a Good Question.&lt;/a&gt;…
I also don’t test for specific cases. When I don’t it’s because I’m missing the skills to test effectively, that is, in an easy and consolidated way. Let’s take Rails view specs with rspec. I know how to spec them out very quickly, mocks, render directives and so on. Almost a no brainer. But there are other cases where it takes me a long time to figure out how to mock certain APIs, what methods should I call and how to organize the spec suite. So my rule became: if it’s taking too long or it’s too complicated fork a new task to spike and learn about it. But now ship it! It’s brutal I know but usually that’s the correct thing to do. Of course the meaning of “too long” is strictly project dependent. Then I put shame on me because I was missing a “tool” in my tool set so that next time I can’t be taken by surprise. I know I need practice.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.wolframalpha.com/screencast/introducingwolframalpha.html" target="_blank"&gt;Introduction to Wolfram|Alpha by Stephen Wolfram&lt;/a&gt;…
This is the screencast that introduced me to the work of Stephen Wolfram. Wolfram Alpha is an incredible piece of software, capable of correlations and interpretation beyond what I’ve seen so far. I’m wondering what kind of semantic engine is behind the web interface. This engine is capable of attaching meaning to the human knowledge and serve it at the speed of light. Google killer app? Nah, I don’t think so. What you see on Wolfram Alpha is opinionated, a mash-up of related information that the engine thinks you may like. Wonderful if you want to infer knowledge from data you don’t know about, less useful if you know what you’re searching for. That’s what Google is about when you input some words in the search box. Will it change the way we use the web? Again, I’m skeptic.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Cellular_automata" target="_blank"&gt;Cellular automaton - Wikipedia, the free encyclopedia&lt;/a&gt;…
Looking at the WolframAlpha phenomenon I ended up wandering wikipedia reading about cellular automaton. I’m amazed by how complicated a model with simple rules can be. Very simple CAs like the monodimensional rule-110 are even turing complete. I also realized that the Langton’s ant and Conway’s Game of Life are to popular implementation of CAs. Some of these models are often seen in nature (predators, chaotic systems, population models etc.) and therefore is tempting to think that a basic combination of simple rules is responsible for biological life. What are those rules is the subject of Wolfram’s book “A New Kind Of Science” which is already in my Amazon basket.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.se-radio.net/podcast/2009-05/episode-134-release-it-michael-nygard" target="_blank"&gt;Episode 134: Release It with Michael Nygard&lt;/a&gt;…
Sad: the book is standing on my bookshelf and I never managed to read it. Good: this episode remembers me what I’m missing. First: my knowledge of production systems just scratch the surface. For some reason in my career I always move when the system starts its life and that’s not good. The podcast follows the book structure which is a nice to read patterns collection. Here’s some interesting bite of the conversation. A system that self-adjusts or shuts down a specific feature when a functionality doesn’t behave as from the SLA is better than timeout. Timeout usually creates more dangers. Ajax completion on key strokes is of low value and high server impact. I don’t agree with this one, it depends on the application if this is low value. Caching can be good, but too much caching or caching done wrong can be dangerous. SLA inversion anti-patter: forgetting that SLA of dependent systems are correlated to the SLA of the main system. And much more. Recommended listening.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/108432086</link><guid>http://reborg.tumblr.com/post/108432086</guid><pubDate>Fri, 15 May 2009 21:14:25 -0500</pubDate><category>thisweekhighlights</category><category>ruby</category><category>smalltalk</category><category>shipit</category><category>wolframalpha</category><category>automata</category></item><item><title>Story Mapping</title><description>&lt;p&gt;Again not so much time this week to look around into the web-sphere. My reading queue is growing, the video one is worse. Not to mention podcasts, since I couldn’t run this week for a severe back pain. I decided to report on the few things I was able to collect a summary about.
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The most interesting of the week&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;I realized I was using this organizational pattern for user stories already. &lt;a href="http://agileproductdesign.com/blog/the_new_backlog.html" target="_blank"&gt;The new user story backlog is a map&lt;/a&gt; collect stories, epics and tasks on a permanent board. Instead of having only the current iteration (or sprint) board, all stories are organized permanently on another huge board where relationships and context can be maintained. I’ve seen this in practice working as a consultant for a project managed by ThoughtWorkers. As the article clearly stated this is nothing new but just a pattern emerging from multiple places. After I heard about minimum marketable features from naked planning this is the time of “minimum viable product”. They mirror the same thing. Epic is another synonym. The important point in this approach is that stories belonging to different epics are worked together to release a product which is “epic-complete” but maybe not story-complete. Stories are prioritized, epics really aren’t.
&lt;/p&gt;

&lt;p&gt;&lt;b&gt;This Week’s Highlights&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://blog.stackoverflow.com/2009/04/podcast-50/" target="_blank"&gt;Podcast #50 - Blog - Stack Overflow - Steve Yegge&lt;/a&gt;…
It sounds like at Google are creating an standardized support layer which adds language specific features to IDEs. If you take for example IntelliJ and Eclipse they provide the same quality Java support features like autocompletion, inline help or compile as you write kind of stuff. The same happens for other IDEs and languages: they are implementing the same functionalities over and over again. As a developer for example I’d like to have autocompletion in TextMate but that’s not enough for me to move to Aptana. My understanding is that they started from JavaScript support to create the framework, supporting their internal type system for the most important IDEs. Of course they have to support also other languages to go public with the framework. Maybe one day we’ll be able to command+space in vi and have autocompletion :)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.betaversion.org/~stefano/linotype/news/247/" target="_blank"&gt;Stefano’s Linotype - On Twitter&lt;/a&gt;…
Mmmh. Stefano thinks that when information is just so not-digested is difficult to understand the ROI of the effort required to follow. It’s like reading reddit, infoq, tuaw etc. every day. All wonderful sources of information but those news are so “new” that they can turn completely useless in just minutes. It’s like gambling: in this case the risk is to waste time. He talks about Twitter specifically. But for me Twitter is not the place for news. What I’m mostly interested in is what are other people habits, what they do during the day, how they can so productive, what extra-job activities they have and when. For me it’s a source of completely new information, nothing to do with IRC or blogs where personal habits are completely out of scope. Before Twitter I couldn’t really know what software geniuses were up to or in which way they tackle a problem during their everyday life at work. Twitter is for me inspiring 90% of the time. No gambling.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;printTitle=Industry_Misinterpretations_133:_Smalltalk_and_FPGAs&amp;entry=3418153027" target="_blank"&gt;Industry Misinterpretations 133: Smalltalk and FPGAs&lt;/a&gt;…
Enjoyed some history of the Squeak community. Squeak users somehow self-organized to avoid a community split when squeakers with different ideas wanted to create their on branch. Sad fact: SmallTalk was too young to be used in the early eighties when memory consumption was an issue and people were choosing C++ for that. SmallTalk is now considered too old  without having spent a period as a mainstream language. It looks like there is a lot of interested about hardware implementation of languages for specific business on FPGA and GPU. The first reason is of course the always decreasing price of such a devices. In this podcast an FPGA implementing smalltalk instructions is only running as a simulation but soon to be “printed” in hardware. There is a one-to-ten ratio for a transistor implemented as FPGA over the actual number of transistors actually used. Still a good ratio considering ad-hoc hardware design on one side and generic CPU like Intel’s on the other.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/106078001</link><guid>http://reborg.tumblr.com/post/106078001</guid><pubDate>Sun, 10 May 2009 21:53:53 -0500</pubDate><category>thisweekhighlights</category><category>fpga</category><category>planning</category><category>agile</category><category>twitter</category></item><item><title>SmallTalk in SmallPlaces</title><description>&lt;p&gt;I had less time to read/listen/watch in the last two weeks. So I skipped the summary of the most interesting reading for the last week. Ok, let’s talk about SmallTalk then. I’m very disappointed I never found the time to learn about what can be considered the father of all the modern languages you hear about. Unfortunately I need to keep this desire low priority in my task list for some more. Even if I’m not actively following, I noticed that the SmallTalk community is alive and kicking, producing software, &lt;a href="http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=podcasts" target="_blank"&gt;podcasts&lt;/a&gt; and tons of &lt;a href="http://www.vimeo.com/jarober/videos" target="_blank"&gt;screencasts&lt;/a&gt;. Anyway, &lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;printTitle=Industry_Misinterpretations_129:_Smalltalk_in_Small_Places&amp;entry=3415738780" target="_blank"&gt;Industry Misinterpretations 129: Smalltalk in Small Places&lt;/a&gt; is about running Squeak on the iPhone. The process is a bit complicated: you need to strip useless classes from the VM and compile all down to C and use an Objective-C to SmallTalk bridge to connect the two world. The micro-VM was used to run Pier (CMS) which runs on top of &lt;a href="http://www.seaside.st/" target="_blank"&gt;SeaSide&lt;/a&gt;. So you’ve got pretty much all the SmallTalk possible goodness on the iPhone. The interview is a fascinating trip inside the internals of the VM, the garbage collector and the Obj-C to SmallTalk bridge. Have a peek at &lt;a href="http://isqueak.org" target="_blank"&gt;http://isqueak.org&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mobileorchard.com/lessons-in-iphone-game-marketing/#comments" target="_blank"&gt;Lessons In iPhone Game Marketing&lt;/a&gt;…
This is an interesting and sad listening. It talks about how important it is to get in those top 100 by iTunes store ranking for whatever good/bad application. The sad part is that 6 months of development for a game can bring to 500$ in revenue if you miss that top 100. It means it has nothing to do with quality, robustness, reliability of software, but with good marketing. The top 100 is reached after a certain number of downloads after the launch or because Apple decides to feature the app. The integration of the number of downloads over the time doesn’t matter even if you have a great average/day. The way you can get into the top 100 are pre-releases to send to online specialized websites for review, advertisement with promos, a light and free version that seduces the user to buy the 5$ version. In one word “buzz” that needs to converge at launch time to reach the tipping point. Just want to remember that in the AppStore quality is not as important as good marketing.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://itc.conversationsnetwork.org/shows/detail3995.html" target="_blank"&gt;O’Reilly Open Source Conference - Robert “r0ml” Lefkowitz on Open Source&lt;/a&gt;…
Here’s a funny and short presentation. Robert Lefkowitz is a skilled orator in the ancient roman sense. And is right from the Quintilian’s Institutes of Oratory one century B.C. that apparently our modern “phases” of software development come from. It’s hilarious how such an old essay is applicable to our modern times and the similarities between the Microsoft development process or RUP. From there Lefkowitz explains his idea for an Open Source development process: exceptional driven development. No requirements, no nothing, just straight deploy waiting for customers who create tickets to request what they need! Of course this is a parody but there is some truth, for example in the description of what a requirement is. A requirement is the expression of our fear, an illusion of power to domesticate the future of the soon to be developed software. Naked planning comes to mind: eliminate the waste required to produce almost useless estimates.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chariottechcast.libsyn.com/index.php?post_id=461474" target="_blank"&gt;Chariot Tech Cast - Grails&lt;/a&gt;…
I was curious to see how Grails was doing after a couple of years away from the Java world. Good to see that now Grails is a solid framework that can be used exactly like Rails. Type Grails app-name from the command line and you’ve got your nice project layout to start with, no hassles. I was thinking that if I need to work on a Java web application again I will definitely start from a Grails app, write tests and pure Java at first (a language I know) to gradually transform and move to pure Groovy. Sounds like a plan.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.asmartbear.com/blog/why-you-have-to-engage-in-social-media-even-if-you-dont-want.html" target="_blank"&gt;Why you have to engage in social media, even if you don’t want to&lt;/a&gt;…
Summary: a web presence is not sufficient to guarantee popularity anymore. This was the case 10 years ago but today for each line of business there are tons of competing companies all with good services and products. Solution: social networks. Web presence today means 2 things: contents (the old blog) and social networking which works like a review system by word of mouth. I work for a software house and I think the same thing applies here. There are tons of good programming firm and the only way you have to enter the “cool kids” status is by word of mouth by social networking. First step: put decent contents (not just for marketing) on the web, produce open source software, speak at conferences and user groups. Second: build trust by publishing opinions and pointers to your content via social networks. If you don’t do this your customer base risks to become stale.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://web20show.com/episodes/episode-9-jason-fried" target="_blank"&gt;The Web 2.0 Show - Jason Fried&lt;/a&gt;…
I enjoyed this interview with Jason Fried which is very actual despite the date of recording, January 2006. I never read “Getting Real” but I suppose what I heard here is more or less what’s on the book. Speaking of which, “Less is More” is one of the 37Signals slogans which refers to everything: less developers, less pages, less features, with the goal of creating something simple but complete in each part. I’m sure you can do everything interface first, but I prefer the approach of front-end back-end at the same time and in the same team. Interesting the approach of asking the customer feedback after the application is rolled-out. Basecamp was created in 10 hours/week for 3.5 months: it takes that long to create a great product if you stay really focused. The perpetual beta of some products is just bullshit because it looks more a way to apologize in advance for the crappiness of the product. Better focus on something 100% done from the start instead.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://web20show.com/episodes/episode-18-eric-meyer#commentform" target="_blank"&gt;The Web 2.0 Show - Eric Meyer&lt;/a&gt;…
Here’s an old (2006) interview with Eric Mayer. Eric talks about the future of paper-based publishing especially in the computer science field. Today is more profitable to self-publish your work considering how easy it is to create a following with just your web presence. If book publishing companies want to survive they have to adapt to some form of electronic process, offering authors editing or marketing services disconnected from the physical creation of a book. That’s exactly what happened thinking at the Pragmatic BookShelf or the O’Reilly online book format. There is also some room in the interview to talk about Eric’s experience. He became the CSS guru publishing tons of content about CSS for free and only after he was offered to write the popular book. He talks also about the UI design process, starting from photoshop comps, merging all layers, slicing and starting creating the box layout.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/102474709</link><guid>http://reborg.tumblr.com/post/102474709</guid><pubDate>Fri, 01 May 2009 21:05:55 -0500</pubDate><category>thisweekhighlights</category><category>smalltalk</category><category>iphone</category></item><item><title>How to take a 5 minutes nap</title><description>&lt;p&gt;Read this… Read this… Read this… Read this… Read this… Read this… Read this… Read this… Read this… Read this… Joking :) Your attention please.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.pomodorotechnique.com/" target="_blank"&gt;Pomodoro Technique&lt;/a&gt; advocates a 25 minutes of quality, focused work followed by a 5 minutes break. There are so many ways to spend the break time, but the main goal is to recharge the brain and allow for background processing of previously assimilated information. The consequence is that you shouldn’t be tempted to spend the break reading emails, news, making phone calls, or anything that generates additional pressure to the following pomodoro.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20090501-qbaregenpjqqbb7si676nq9j9s.gif"/&gt;&lt;/p&gt;

&lt;p&gt;So for example looking at the above picture, I can say that looking out the window requires less effort than talking or reading emails. At the extremes there are: “sleeping” and “working”. Focused and quality work is the goal of the pomodoro, a focused and quality relax is the goal of the break. I made the mistake of thinking that just looking at email subjects or news titles was enough relaxing for a break but after comparing it with 5 minutes of deep relax I changed my mind.&lt;/p&gt;

&lt;p&gt;Ideally, the goal of the break should be light sleep for 5 minutes. I don’t know if it’s possible to sleep, but for sure you can train yourself to do better. After a couple of weeks of self-inspection during the break and relaxing techniques I can say I’m very happy with the results. I always had bad days and those were drastically reduced by the Pomodoro Technique. But I still have bad days or half-days sometimes. I discovered that  a good quality 5 mins break can give me immediately back the energy to start the next pomodoro with unexpected ease.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20090501-pat91iran7u9ci1dqdsqjstf72.gif"/&gt;&lt;/p&gt;

&lt;p&gt;The problem is now how to quickly fall into deep relax. I had success with the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find a comfy chair or if you happen to have one at work, a couch
&lt;/li&gt;
&lt;li&gt;As soon as the break starts, close your eyes and find the best relaxing position. You neck, arms and legs should be perfectly relaxed.
&lt;/li&gt;
&lt;li&gt;Think about a light scanner (!!): a horizontal line of light starting from your head going down to your feet, very slowly. While the line of light touches all your muscles concentrate on that single area and further relax whatever is there. Especially important are the eyes: careful remove tenseness.
&lt;/li&gt;
&lt;li&gt;Think about a white giant rectangle gently floating around. If that disappears no big deal. It’s just a starter thought to get you distracted from thinking about the goal of the previous pomodoro.
&lt;/li&gt;
&lt;li&gt;When the break is done, gently open your eyes, start the pomodoro (or have that started automatically because you’re using &lt;a href="http://reborg.github.com/pomodori/" target="_blank"&gt;my tool&lt;/a&gt;), focus and go.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You know that you’re doing it correctly if those 5 minutes feel like 10. All the time I failed to properly relax, I payed the consequences after 5/6 pomodoros. Something I also tried was to sleep during the 20 minutes longer breaks. That was real sleep, but never too deep to be counter-productive. Needless to say that also the long break is important as the shorter ones for a good day of pomodoros. The technique works very good in environments with low noise and familiar (where people don’t pay too much attention at you). I borrowed the idea to train the body to deeply sleep in short period of times from the &lt;a href="http://en.wikipedia.org/wiki/Polyphasic" target="_blank"&gt;polyphasic sleep model&lt;/a&gt;, a fascinating (and scary) way to sleep less.&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/102158578</link><guid>http://reborg.tumblr.com/post/102158578</guid><pubDate>Fri, 01 May 2009 00:32:00 -0500</pubDate><category>pomodoro</category><category>break</category><category>productivity</category></item><item><title>Webrat with RSpec, no Cucumber</title><description>&lt;p&gt;For the impatient: install webrat as from installation instructions and then add this section to your spec_helper.rb that lets you create webrat specs in spec/integration folder:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_ruby"&gt;&lt;span class="meta meta_module meta_module_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_module keyword_control_module_ruby"&gt;module&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_module entity_name_type_module_ruby"&gt;&lt;span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_module entity_other_inherited-class_module_first entity_other_inherited-class_module_first_ruby"&gt;Spec&lt;span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby"&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_module entity_other_inherited-class_module_second entity_other_inherited-class_module_second_ruby"&gt;Rails&lt;span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby"&gt;::&lt;/span&gt;&lt;/span&gt;Example&lt;/span&gt;&lt;/span&gt;
&lt;span class="meta meta_class meta_class_ruby"&gt;  &lt;span class="keyword keyword_control keyword_control_class keyword_control_class_ruby"&gt;class&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby"&gt;IntegrationExampleGroup&lt;span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_ruby"&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby"&gt;&lt;&lt;/span&gt; ActionController::IntegrationTest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

   &lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;initialize&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt;defined_description&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; options&lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;{}&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;&amp;&lt;/span&gt;implementation&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
     defined_description&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;instance_eval &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;       &lt;span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;to_s&lt;/span&gt;&lt;/span&gt;
         &lt;span class="variable variable_language variable_language_ruby"&gt;self&lt;/span&gt;
       &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
     &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
     
     &lt;span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby"&gt;super&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;defined_description&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
   &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

    &lt;span class="support support_class support_class_ruby"&gt;Spec&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;Example&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;ExampleGroupFactory&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;register&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;integration&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="variable variable_language variable_language_ruby"&gt;self&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;There is plenty of examples of usage of Webrat alone inside test/integration but very few using RSpec. “No big deal” I thought, it must be just as simple as from test/integration. Why I should skip Cucumber? I hope to use Cucumber in the next projects, but I don’t have a real customer for the internal app I’m writing right now and it doesn’t make a lot sense to be so english-like for requirements. So after installing RSpec[Rails] 1.2.4 on Rails 2.3.2 and scaffolded some examples with “./script/generate rspec_scaffold post title:string body:text published:boolean” I created the following webrat-enabled view spec in spec/views/verify_posts_webrat_spec.rb:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_ruby source_ruby_rspec"&gt;&lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;expand_path&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;dirname&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_language variable_language_ruby"&gt;__FILE__&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;/../spec_helper&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class="meta meta_rspec meta_rspec_behaviour"&gt;&lt;span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_behaviour"&gt;describe&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;Creating blog posts&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block"&gt;do&lt;/span&gt;&lt;/span&gt;
  
&lt;span class="meta meta_rspec meta_rspec_example"&gt;  &lt;span class="keyword keyword_other keyword_other_rspec keyword_other_rspec_example"&gt;it&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;should display the list of posts&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block"&gt;do&lt;/span&gt;&lt;/span&gt;
    visit posts_url
    assert_contain &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;Listing posts&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;and with the following spec_helper setup:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="linenum"&gt;    1&lt;/span&gt; &lt;span class="source source_ruby source_ruby_rspec"&gt;&lt;span class="meta meta_environment-variable meta_environment-variable_ruby"&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;ENV&lt;/span&gt;[&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;RAILS_ENV&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby"&gt;||=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;test&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;    2&lt;/span&gt; &lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;dirname&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_language variable_language_ruby"&gt;__FILE__&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; &lt;/span&gt;
&lt;span class="linenum"&gt;    3&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;/../config/environment&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;unless&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby"&gt;defined?&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
&lt;span class="linenum"&gt;    4&lt;/span&gt; &lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;spec/autorun&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;    5&lt;/span&gt; &lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;spec/rails&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;    6&lt;/span&gt; 
&lt;span class="linenum"&gt;    7&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;Webrat&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;configure &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;config&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
&lt;span class="linenum"&gt;    8&lt;/span&gt;     config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;mode &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;rails&lt;/span&gt;
&lt;span class="linenum"&gt;    9&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="linenum"&gt;   10&lt;/span&gt; 
&lt;span class="linenum"&gt;   11&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;Spec&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;Runner&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;configure &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;config&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
&lt;span class="linenum"&gt;   12&lt;/span&gt;   config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;use_transactional_fixtures &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;true&lt;/span&gt;
&lt;span class="linenum"&gt;   13&lt;/span&gt;   config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;use_instantiated_fixtures  &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;false&lt;/span&gt;
&lt;span class="linenum"&gt;   14&lt;/span&gt;   config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;fixture_path &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;RAILS_ROOT&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;/spec/fixtures/&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;   15&lt;/span&gt;   &lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;include&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;Webrat&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;Methods&lt;/span&gt;
&lt;span class="linenum"&gt;   16&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class="linenum"&gt;   17&lt;/span&gt; &lt;/pre&gt;

&lt;p&gt;which gives a sad “undefined method `https!’ for #Spec::Rails::Example::ViewExampleGroup::Subclass_1:0x237e5f4”. Notice line 7-9 and 15 of the spec_helper, those are the correct settings I think. I couldn’t find any reason why this shouldn’t work and I try to move the spec into the controllers or models folders just to be sure. But nothing. I gave up but the following day I thought that if I had to make a choice about the position of webrat based specs that would be in the spec/integration folder. So I decided to create a new RSpec example group so that whatever happens to be in the integration folder is associated with a specfic class that I can control. So I added the following to spec_helper:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="linenum"&gt;    1&lt;/span&gt; &lt;span class="source source_ruby"&gt;&lt;span class="meta meta_environment-variable meta_environment-variable_ruby"&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;ENV&lt;/span&gt;[&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;RAILS_ENV&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_augmented keyword_operator_assignment_augmented_ruby"&gt;||=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;test&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;    2&lt;/span&gt; &lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;dirname&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_language variable_language_ruby"&gt;__FILE__&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; &lt;/span&gt;
&lt;span class="linenum"&gt;    3&lt;/span&gt;   &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;/../config/environment&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;unless&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby"&gt;defined?&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
&lt;span class="linenum"&gt;    4&lt;/span&gt; &lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;spec/autorun&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;    5&lt;/span&gt; &lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;spec/rails&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;    6&lt;/span&gt; 
&lt;span class="linenum"&gt;    7&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;Webrat&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;configure &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;config&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
&lt;span class="linenum"&gt;    8&lt;/span&gt;     config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;mode &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;rails&lt;/span&gt;
&lt;span class="linenum"&gt;    9&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="linenum"&gt;   10&lt;/span&gt; 
&lt;span class="linenum"&gt;   11&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;Spec&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;Runner&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;configure &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;config&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
&lt;span class="linenum"&gt;   12&lt;/span&gt;   config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;use_transactional_fixtures &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;true&lt;/span&gt;
&lt;span class="linenum"&gt;   13&lt;/span&gt;   config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;use_instantiated_fixtures  &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;false&lt;/span&gt;
&lt;span class="linenum"&gt;   14&lt;/span&gt;   config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;fixture_path &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;RAILS_ROOT&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;/spec/fixtures/&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;   15&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="linenum"&gt;   16&lt;/span&gt; 
&lt;span class="linenum"&gt;   17&lt;/span&gt; &lt;span class="meta meta_module meta_module_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_module keyword_control_module_ruby"&gt;module&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_module entity_name_type_module_ruby"&gt;&lt;span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_module entity_other_inherited-class_module_first entity_other_inherited-class_module_first_ruby"&gt;Spec&lt;span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby"&gt;::&lt;/span&gt;&lt;/span&gt;&lt;span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_module entity_other_inherited-class_module_second entity_other_inherited-class_module_second_ruby"&gt;Rails&lt;span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby"&gt;::&lt;/span&gt;&lt;/span&gt;Example&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;   18&lt;/span&gt; &lt;span class="meta meta_class meta_class_ruby"&gt;  &lt;span class="keyword keyword_control keyword_control_class keyword_control_class_ruby"&gt;class&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby"&gt;IntegrationExampleGroup&lt;span class="entity entity_other entity_other_inherited-class entity_other_inherited-class_ruby"&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_inheritance punctuation_separator_inheritance_ruby"&gt;&lt;&lt;/span&gt; ActionController::IntegrationTest&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;   19&lt;/span&gt; 
&lt;span class="linenum"&gt;   20&lt;/span&gt;    &lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;initialize&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt;defined_description&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; options&lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby"&gt;{}&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;&amp;&lt;/span&gt;implementation&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;   21&lt;/span&gt;      defined_description&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;instance_eval &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;&lt;span class="linenum"&gt;   22&lt;/span&gt;        &lt;span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;to_s&lt;/span&gt;&lt;/span&gt;
&lt;span class="linenum"&gt;   23&lt;/span&gt;          &lt;span class="variable variable_language variable_language_ruby"&gt;self&lt;/span&gt;
&lt;span class="linenum"&gt;   24&lt;/span&gt;        &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="linenum"&gt;   25&lt;/span&gt;      &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="linenum"&gt;   26&lt;/span&gt;      
&lt;span class="linenum"&gt;   27&lt;/span&gt;      &lt;span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby"&gt;super&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;defined_description&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
&lt;span class="linenum"&gt;   28&lt;/span&gt;    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="linenum"&gt;   29&lt;/span&gt; 
&lt;span class="linenum"&gt;   30&lt;/span&gt;     &lt;span class="support support_class support_class_ruby"&gt;Spec&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;Example&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;ExampleGroupFactory&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;register&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;integration&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="variable variable_language variable_language_ruby"&gt;self&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
&lt;span class="linenum"&gt;   31&lt;/span&gt;   &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="linenum"&gt;   32&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;and moved verify_posts_webrat_spec.rb to spec/integration et voila’, green bars. A few things to notice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Line 17: inheriting from ActionController::IntegrationTest brings in all the Rails testing integration goodness
&lt;/li&gt;
&lt;li&gt;Line 20-28: this constructor definition is the trick necessary to intercept the instance of ExampleProxy and inject a “to_s” that returns the object itself. The trick is necessary because in ActionController::IntegrationTest the initializer is calling to_s on the incoming parameter expecting always a symbol (but we are passing an ExampleProxy instead)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you try this solution, I’m pretty sure it won’t work for your combination of Rails/RSpec/Webrat/Environment version. Add a comment below so I can fix and update this post. Happy coding.&lt;/p&gt;
20090603 UPDATE: fixed for rspec 1.2.6.</description><link>http://reborg.tumblr.com/post/99813407</link><guid>http://reborg.tumblr.com/post/99813407</guid><pubDate>Fri, 24 Apr 2009 18:08:00 -0500</pubDate><category>rails</category><category>rspec</category><category>webrat</category><category>integration</category><category>test</category><category>testing</category></item><item><title>Rails gems unpack native</title><description>&lt;p&gt;Suppose you need to work on an already existing Rails project. The ideal situation would be that right after the check-out you should be able to ./script/server and pointing at http://locahost:3000 the app is up and running. Most of the time it’s easy as this adding just the rake db:migrate step for development on sqlite. The next common complication is to setup mysql or another external database adding the rake db:create step. As a dependency you may have to edit config/database.yml with local mysql credentials. Only three steps.&lt;/p&gt;

&lt;p&gt;But there is another common complication which is the Rails version and gems dependencies. You fix the first by freezing Rails with:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_shell"&gt;reborg:&lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;test&lt;/span&gt; reborg$ rake rails:freeze:gems
&lt;span class="meta meta_scope meta_scope_subshell meta_scope_subshell_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;(&lt;/span&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;in&lt;/span&gt; /Users/reborg/tmp/&lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;test&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;)&lt;/span&gt;&lt;/span&gt;
Freezing to the gems &lt;span class="meta meta_scope meta_scope_for-in-loop meta_scope_for-in-loop_shell"&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;for&lt;/span&gt; &lt;span class="variable variable_other variable_other_loop variable_other_loop_shell"&gt;Rails&lt;/span&gt; 2.3.2
rm -rf vendor/rails
mkdir -p vendor/rails
&lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;cd&lt;/span&gt; vendor/rails
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test/vendor/rails/activesupport-2.3.2&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
mv activesupport-2.3.2 activesupport
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test/vendor/rails/activerecord-2.3.2&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
mv activerecord-2.3.2 activerecord
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test/vendor/rails/actionpack-2.3.2&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
mv actionpack-2.3.2 actionpack
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test/vendor/rails/actionmailer-2.3.2&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
mv actionmailer-2.3.2 actionmailer
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test/vendor/rails/activeresource-2.3.2&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
mv activeresource-2.3.2 activeresource
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test/vendor/rails/rails-2.3.2&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;cd&lt;/span&gt; -
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;In the old days and with my basic Rails knowledge I used to resolve gem dependencies by ./script/server manual testing until a stack trace with “missing library blah” was found. A time waster. The solution to this by “sudo gem install blah” is not good. First because of the pollution generated in local Ruby installation second because a new developer will face exactly the same problems over and over again.&lt;/p&gt;

&lt;p&gt;Since Rails 2.x we can finally “rake gems:unpack” and have Rails load dependencies from vendor/gems. Gems are configured in environment.rb:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_ruby source_ruby_mac"&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;RAILS_GEM_VERSION&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;2.3.2&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_ruby"&gt;unless&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby"&gt;defined?&lt;/span&gt; &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;RAILS_GEM_VERSION&lt;/span&gt;
&lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;join&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;dirname&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_language variable_language_ruby"&gt;__FILE__&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;boot&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class="support support_class support_class_ruby"&gt;Rails&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_other punctuation_separator_other_ruby"&gt;::&lt;/span&gt;&lt;span class="support support_class support_class_ruby"&gt;Initializer&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;run &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;config&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
  config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;&lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;gem&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;webrat&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  config&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;time_zone &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;UTC&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;In the example we want webrat. The developer who introduces the dependency in the project needs to local install webrat:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_shell"&gt;reborg:test2 reborg$ sudo rake gems:install
&lt;span class="meta meta_scope meta_scope_subshell meta_scope_subshell_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;(&lt;/span&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;in&lt;/span&gt; /Users/reborg/tmp/test2&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;)&lt;/span&gt;&lt;/span&gt;
gem install webrat
Successfully installed webrat-0.4.4
1 gem installed
Installing ri documentation &lt;span class="meta meta_scope meta_scope_for-in-loop meta_scope_for-in-loop_shell"&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;for&lt;/span&gt; &lt;span class="variable variable_other variable_other_loop variable_other_loop_shell"&gt;webrat-0.4.4&lt;/span&gt;...
Installing RDoc documentation &lt;span class="meta meta_scope meta_scope_for-in-loop meta_scope_for-in-loop_shell"&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;for&lt;/span&gt; &lt;span class="variable variable_other variable_other_loop variable_other_loop_shell"&gt;webrat-0.4.4&lt;/span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;and then she needs to unpack the gem plus the dependencies into the rails vendor/gems directory with:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_shell"&gt;reborg:test2 reborg$ rake gems:unpack:dependencies
&lt;span class="meta meta_scope meta_scope_subshell meta_scope_subshell_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;(&lt;/span&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;in&lt;/span&gt; /Users/reborg/tmp/test2&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;)&lt;/span&gt;&lt;/span&gt;
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test2/vendor/gems/webrat-0.4.4&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
Unpacked gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test2/vendor/gems/nokogiri-1.2.3&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;The next developer who needs the application just need to check-out from source control and only think about migrations and the database without polluting their own local ruby gems installation. But there is a problem with native gems that needs the additional compilation step. The unpack operation doesn’t copy post-build artifacts into vendor/gems but only a clean copy of the gem. Nokogiri needs native build before use and we are in trouble if we just commit this project:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_shell"&gt;reborg:test2 reborg$ ./script/server
=&lt;span class="keyword keyword_operator keyword_operator_redirect keyword_operator_redirect_shell"&gt;&gt;&lt;/span&gt; Booting Mongrel
=&lt;span class="keyword keyword_operator keyword_operator_redirect keyword_operator_redirect_shell"&gt;&gt;&lt;/span&gt; Rails 2.3.2 application starting on &lt;a href="http://0.0.0.0:3000" target="_blank"&gt;http://0.0.0.0:3000&lt;/a&gt;
no such file to load -- nokogiri/native
/usr/&lt;span class="storage storage_modifier storage_modifier_shell"&gt;local&lt;/span&gt;/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:&lt;span class="keyword keyword_control keyword_control_shell"&gt;in&lt;/span&gt; &lt;span class="string string_interpolated string_interpolated_backtick string_interpolated_backtick_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;`&lt;/span&gt;gem_original_require&lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
[...]
/usr/&lt;span class="storage storage_modifier storage_modifier_shell"&gt;local&lt;/span&gt;/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:&lt;span class="keyword keyword_control keyword_control_shell"&gt;in&lt;/span&gt; &lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;`&lt;/span&gt;&lt;/span&gt;gem_original_require&lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
./script/server:3
Missing these required gems:
  webrat  

You&lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;re running:
  ruby 1.8.7.72 at /usr/local/bin/ruby
  rubygems 1.3.2 at /Users/reborg/.gem/ruby/1.8, /usr/local/lib/ruby/gems/1.8

Run `rake gems:install` to install the missing gems.&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;The long stack trace (cut for brevity) asserts that webrat is missing at the end, while the correct message is at the beginning “no such file to load — nokogiri/native” which tells us we need an additional build step:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_shell"&gt;reborg:test2 reborg$ rake gems:build
&lt;span class="meta meta_scope meta_scope_subshell meta_scope_subshell_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;(&lt;/span&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;in&lt;/span&gt; /Users/reborg/tmp/test2&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;)&lt;/span&gt;&lt;/span&gt;
Built gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test2/vendor/gems/webrat-0.4.4&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
Built gem: &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;/Users/reborg/tmp/test2/vendor/gems/nokogiri-1.2.3&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
reborg:test2 reborg$ 
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;and now the server starts up completely. What the build step does is clear if you have the project under SVN or GIT:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_shell"&gt;reborg:test2 reborg$ git status
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; On branch master
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; Untracked files:
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt;   (use "git add &lt;file&gt;..." to include in what will be committed)
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/Makefile
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/conftest.dSYM/
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/html_document.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/html_entity_lookup.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/html_sax_parser.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/mkmf.log
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/native.bundle
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/native.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_attr.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_cdata.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_comment.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_document.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_document_fragment.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_dtd.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_entity_reference.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_io.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_node.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_node_set.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_processing_instruction.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_reader.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_sax_parser.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_sax_push_parser.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_syntax_error.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_text.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_xpath.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xml_xpath_context.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/ext/nokogiri/xslt_stylesheet.o
&lt;/span&gt;&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; vendor/gems/nokogiri-1.2.3/lib/nokogiri/native.bundle
&lt;/span&gt;nothing added to commit but untracked files present &lt;span class="meta meta_scope meta_scope_subshell meta_scope_subshell_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;(&lt;/span&gt;use &lt;span class="string string_quoted string_quoted_double string_quoted_double_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;"&lt;/span&gt;git add&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;"&lt;/span&gt;&lt;/span&gt; to track&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;you shouldn’t be tempted to “git add .” all of the files. The problem is that what is produced is platform dependent and should not be part of someone else’s installation. Essentially you need to svn/git ignore these files and remember to add at the end of “gems:build” an additional step which is not optional at this point. Fortunately is only required once by the developer adding the native gem. You can for example create a template like this one:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_ruby"&gt;rake &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;gems:build&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;sudo&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&gt;&lt;/span&gt; &lt;span class="constant constant_language constant_language_ruby"&gt;true&lt;/span&gt;

&lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;exist?&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;.svn&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  
  run &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;svn propset svn:ignore '*.o' vendor/gems/nokogiri-1.2.3/ext/nokogiri&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  run &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;svn propset svn:ignore 'Makefile' vendor/gems/nokogiri-1.2.3/ext/nokogiri&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  run &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;svn propset svn:ignore '*' vendor/gems/nokogiri-1.2.3/ext/nokogiri/conftest.dSYM&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  run &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;svn propset svn:ignore 'native.bundle' vendor/gems/nokogiri-1.2.3/lib/nokogiri&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  run &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;svn ci -m 'Ignored native files'&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="keyword keyword_control keyword_control_ruby"&gt;elsif&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;exist?&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;.git&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  
  run&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;find . &lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;( -type d -empty &lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;) -and &lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;( -not &lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt;
      &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;-regex ./&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;.git.* &lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;) -exec touch {}/.gitignore &lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  file &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;'&lt;/span&gt;.gitignore&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="string string_unquoted string_unquoted_heredoc string_unquoted_heredoc_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&lt;&lt;-CODE&lt;/span&gt;
  vendor/gems/nokogiri-1.2.3/ext/nokogiri/Makefile
  vendor/gems/nokogiri-1.2.3/ext/nokogiri/conftest.dSYM/**/*
  vendor/gems/nokogiri-1.2.3/ext/nokogiri/*.o
  vendor/gems/nokogiri-1.2.3/lib/nokogiri/native.bundle
&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;  CODE&lt;/span&gt;&lt;/span&gt;
  git &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;add&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&gt;&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;.&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  git &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;commit&lt;/span&gt; &lt;span class="punctuation punctuation_separator punctuation_separator_key-value"&gt;=&gt;&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;"&lt;/span&gt;-a -m 'Ignored native files'&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;"&lt;/span&gt;&lt;/span&gt;
  
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;which produces the expected:&lt;/p&gt;

&lt;pre class="textmate-source railscasts"&gt;&lt;span class="source source_shell"&gt;reborg:test2 reborg$ rake rails:template LOCATION=./on_gems_build.rb 
&lt;span class="meta meta_scope meta_scope_subshell meta_scope_subshell_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;(&lt;/span&gt;&lt;span class="keyword keyword_control keyword_control_shell"&gt;in&lt;/span&gt; /Users/reborg/tmp/test2&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;)&lt;/span&gt;&lt;/span&gt;
    applying  template: ./on_gems_build.rb
        rake  gems:build
Password:
   executing  find &lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;.&lt;/span&gt; &lt;span class="constant constant_character constant_character_escape constant_character_escape_shell"&gt;\(&lt;/span&gt; -&lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;type&lt;/span&gt; d -empty &lt;span class="constant constant_character constant_character_escape constant_character_escape_shell"&gt;\)&lt;/span&gt; -and &lt;span class="constant constant_character constant_character_escape constant_character_escape_shell"&gt;\(&lt;/span&gt; -not -regex ./&lt;span class="constant constant_character constant_character_escape constant_character_escape_shell"&gt;\.&lt;/span&gt;git.&lt;span class="keyword keyword_operator keyword_operator_glob keyword_operator_glob_shell"&gt;*&lt;/span&gt; &lt;span class="constant constant_character constant_character_escape constant_character_escape_shell"&gt;\)&lt;/span&gt; 
   -&lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;exec&lt;/span&gt; touch {}/.gitignore &lt;span class="constant constant_character constant_character_escape constant_character_escape_shell"&gt;\;&lt;/span&gt; from /Users/reborg/tmp/test2
        file  .gitignore
     running  git add &lt;span class="support support_function support_function_builtin support_function_builtin_shell"&gt;.&lt;/span&gt;
     running  git commit -a -m &lt;span class="string string_quoted string_quoted_single string_quoted_single_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_shell"&gt;'&lt;/span&gt;Ignored native files&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_shell"&gt;'&lt;/span&gt;&lt;/span&gt;
     applied  ./on_gems_build.rb
reborg:test2 reborg$ git status
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_shell"&gt;#&lt;/span&gt; On branch master
&lt;/span&gt;nothing to commit &lt;span class="meta meta_scope meta_scope_subshell meta_scope_subshell_shell"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;(&lt;/span&gt;working directory clean&lt;span class="punctuation punctuation_definition punctuation_definition_subshell punctuation_definition_subshell_shell"&gt;)&lt;/span&gt;&lt;/span&gt;
reborg:test2 reborg$ &lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;To summarize&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working on a Rails app you have the need to add gems dependency but some of the gems are native (developer adding gem dependency)
&lt;/li&gt;
&lt;li&gt;Edit config/environment.rb with wanted gems
&lt;/li&gt;
&lt;li&gt;run “rake gems:install”
&lt;/li&gt;
&lt;li&gt;run “rake gems:unpack:dependencies”
&lt;/li&gt;
&lt;li&gt;Git add everything or svn add everything, no need to commit, just useful to see what the build steps will add
&lt;/li&gt;
&lt;li&gt;run “rake gems:build”
&lt;/li&gt;
&lt;li&gt;git ignore or svn ignore all created files and dirs
&lt;/li&gt;
&lt;li&gt;commit
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are just checking out the app with all gems installed, then you only need to “rake gems:build” after check-out.&lt;/p&gt;

&lt;p&gt;Happy coding.&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/99668398</link><guid>http://reborg.tumblr.com/post/99668398</guid><pubDate>Fri, 24 Apr 2009 09:40:00 -0500</pubDate><category>rails</category><category>gems</category><category>unpack</category><category>native</category><category>programming</category><category>build</category></item><item><title>Corporate Craftsmanship</title><description>&lt;p&gt;
&lt;a href="http://www.cocoacast.com/?q=node/236" target="_blank"&gt;Interview with David Anderson Part I&lt;/a&gt;…
First time I hear the voice of Dave Anderson after reading his blog. David speaks also about craftsmanship in this episode saying that craftsmanship is mainly an individual attitude and as such it shouldn’t be a problem to apply it to enterprises because it does not require changes to the actual process. I agree. I also think that should be easy to organize large companies into cross-departmental mentoring hierarchies. After I heard this podcast I thought that really craftsmanship is all about continuous self-improvement and the mentoring organization (master programmer, journeyman, apprentice) is just how individuals, who try hard to self-improve, collaborate. Same for team dynamics: individuals cooperate to improve their craft as a collective.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://cocoacast.com/?q=node/237" target="_blank"&gt;Unbound Developers - Interview with David Anderson Part II&lt;/a&gt;…
I heard again interesting things in this second episode of the podcast. David advocates the introduction of a new process in a company by examining the context and adopting values and principles first. It’s the company responsibility to set the goals and find the best practices for them which can come from XP or Lean for example. In the need for a change is the team that self-organize and choose what practice works best in their situation. David’s take on generalists VS specialists is that a profitable company needs both. With only generalists you have for sure flexibility and probably fast time to market but lack of marginal value (the key differentiator for a product on the market). Specialists are able to bring that key differentiator for a business to succeed in the long term. I also heard a quick history or FDD, circa 1987. FDD is like enterprise-agile with more design and architecture up-front to mitigate mission critical risks. I found evident traces of FDD in today’s DDD.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://antoniocangiano.com/2009/04/13/startup-interviews-balsamiq-studio-llc/" target="_blank"&gt;Startup Interviews: Balsamiq Studio LLC | Zen and the Art of Programming&lt;/a&gt;…
I think I heard about Mockups on some Stackoverflow episode but then I forgot abut the name when I wanted a tool to do rapid sketches of pages or part of an application. Glad I found a second reference, as usual when the tool is really a good tool. I’m impressed by the company effort to maintain good customer relationships and the web based office idea to keep the overall company costs very low. Happy to hear about italians doing great things, but sadly they are or they were first out of Italy to produce their ideas and leverage their potential.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://smartic.us/2009/04/01/introduction-to-acceptance-testing-ruby-web-applications/" target="_blank"&gt;Smarticus - Introduction to Acceptance Testing Ruby Web Applications&lt;/a&gt;…
Simple and enjoyable presentation on the typical Cucumber stack. I’m catching up these days with the latest evolution of acceptance driven development but having some real life experience with the story runner and webrat-rspec already I’m just focusing on the new things. Nice to see that there is a standard webrat steps library for common steps and the good use of regular expressions. Bryan made a good point worth remembering. It’s fun to use Cucumber for development, but it’s more a customer facing tool than developer oriented. If you don’t have a customer willing to collaborate to write scenarios, you might want to switch to rails integration tests plus webrat (if you use Rails). Bryan doesn’t use CruiseControl because it’s too big… I also like Integrity, but the size of a product is not very important to me. Am I missing something?
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://lizkeogh.com/2009/04/14/what-does-not-agile-look-like/" target="_blank"&gt;lizkeogh.com - What does “Not Agile” look like?&lt;/a&gt;…
Interesting point of view. Actually, I can’t remember of an example of someone telling me “we aren’t agile”. That depends of course on the kind of people I know. I agree: if we can all be agile just by saying the word, then the term failed to describe itself. At the same time Uncle Bob’s example of filtering the audience by practices is not a perfect indicator either. Maybe this question is more appropriate: have you tried the practice you claim is not working for your organization before removing it? Definition of “try”: practice used consistently for at least one small (or above) size production project or full release (if the project is big).
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/97791916</link><guid>http://reborg.tumblr.com/post/97791916</guid><pubDate>Sun, 19 Apr 2009 08:35:10 -0500</pubDate><category>thisweekhighlights</category><category>craftsmanship</category><category>startup</category></item><item><title>Visualization Time</title><description>&lt;p&gt;
I was talking a while ago about esthetic in code and specifically if the way the code organizes on the screen can represent a measure of its quality. This idea is intriguing to me. Here’s something that goes close to that idea although it’s more connected to the notion of module, class or function. The work of Michele is remarkable, especially the animation of the evolving code-base as visual artifact. I heard about him on the &lt;a href="http://www.se-radio.net/podcast/2009-03/episode-130-code-visualization-michele-lanza" target="_blank"&gt;Software Engineering Radio&lt;/a&gt; another of my favorite podcasts.
&lt;/p&gt;

&lt;p&gt;As usual, here’s a selection of what I discovered this week that is worth mentioning:&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.ibm.com/developerworks/web/library/os-couchdb/index.html" target="_blank"&gt;Exploring CouchDB&lt;/a&gt;…
Here’s a nicely written introduction to CouchDB and document-based databases. It’s not too short not too long and assumes you have a relational background. CouchDB remembers me of another doc-db I’ve used in the past: Exist. Since Exist is XML based there is somehow an implied Schema structure given by the XSL (you can decide not to use it) while CouchDB is completely de-structured. I couldn’t understand how the map-reduce is related to CouchDB: I understand the result are key-value pair but I didn’t understand what criteria are used for the hashing. It’s just a matter to try some example first and I’m sure I’ll understand.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.8thlight.com/articles/2009/3/30/material-consciousness-in-software" target="_blank"&gt;Material Consciousness in Software - Paul 8thlight&lt;/a&gt;…
Enjoyed this post by Paul at 8thlight. Material consciousness is the essence for a craft and we should avoid to go “meta”. The best definition of craftsmanship for me is exactly this: doing things. Therefore pure exercise is a must to refresh the craft: kata, solving quizzes, refactoring exercises, etc. A sentence often repeated in photography communities is: “go out and take some pictures”. This is because people tend to spend all their time reading forums and article to improve their photography skills while of course they should be out taking pictures. The same is valid in software.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://media.fngtps.com/rubybanter/2008/008/#play" target="_blank"&gt;Conditional logic with methods Ruby Banter #008&lt;/a&gt;…
The guys at Fingerprints put together a series of small pairing sessions which are a mix of video and screencasting. It’s a good way to promote the work of the company and it illustrates how the guys work internally. I would say a must for a company of craftsmen. In this episode you can see why is always possible to substitute conditionals creating on the fly the opportune strategy object. Ruby allows to create strategies like this quickly and with a clean format just by using blocks as container of the strategy. That said, for this specific case (checking if mocha is installed) I’d rather use a simple if. A strategy is overkill for a case where there is only one option and its negation. I understand the usage here to illustrate the possibilities. Well done.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://jamesshore.com/Blog/Stumbling-Through-Mediocrity.html" target="_blank"&gt;James Shore: Stumbling Through Mediocrity&lt;/a&gt;…
Need to remember. I think that objections to Agile are done mostly with the same “Does Agile scale?” principle in mind: can I attach that “Agile” thing on my name but keep doing what I do? We are back to that “real world” context excuse that hides reluctancy to change. Change is difficult, requires energy, strong decisions and probably an unpleasant feeling at first. Like anything that brings you to another level and makes you great, you have to try hard.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://cocoacast.com/?q=node/228" target="_blank"&gt;Agile Corner - Interview with Curt Hibbs on Lean&lt;/a&gt;…
I found in this podcast a concise and convincing description of Lean Development: Lean applies to an already existing process adding the tools to improve throughput, increase quality and eliminate waste. Considering Lean like an “attachment” of Scrum or XP, the three Agile processes together form a nice combo. Scrum handles the management, XP handles the development, Lean handles the optimization of the production phase. There are already several Lean contaminations in XP (Kanban being the last of them), sign that the different agile souls are slowly converging as expected into a single entity.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://web20show.com/episodes/web20show-ep55-capital-factory" target="_blank"&gt;The Web 2.0 Show - Capital Factory&lt;/a&gt;…
Are companies like Capital Factory the next kind of venture capital funding for start-ups? There seems to be a huge difference when Marc Nathan illustrates the mentoring program for young entrepreneurs that Capital Factory provides as part of the package. I’d like to call it entrepreneur craftsmanship, because the entrepreneur is trained to produce more business value from the funding they are given. Like software craftsmanship locality is fundamental to create relationships.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/95011873</link><guid>http://reborg.tumblr.com/post/95011873</guid><pubDate>Fri, 10 Apr 2009 19:20:00 -0500</pubDate><category>thisweekhighlights</category><category>visualization</category></item><item><title>Naked Planning</title><description>&lt;p&gt;
Most important learning this week is &lt;a href="http://agiletoolkit.libsyn.com/index.php?post_id=400364" target="_blank"&gt;Arlo Belshee - Naked Planning&lt;/a&gt; from the Agile Toolkit series. It’s a fact: &lt;b&gt;this guy officially does crazy stuff!&lt;/b&gt; And there are only two ways to follow his work: conferences or podcasts. Considering the podcasts are recorded during the conference that means you can hear from him once every two years or so. I remember his past revolutions like “promiscuous pairing” and the “least qualified implementor” but the current one is about “naked planning”. 
&lt;br/&gt;
Main facts: the user story length is bigger around 5-15 days or work and the perceived execution time from when it enters the queue (basically the board with all the other MMF) is up to 45-60 days. The user story is prioritized by value not by cost (that means no estimates). It’s called “minimal marketable feature” (MMF) and it’s different from a user story because it must be releasable in isolation. Releases happen as soon as the MMF is ready (no release planning). There is an iteration but is just a container for retrospectives with no planning game. When the MMF is in progress, the team discuss the design potentially splitting in sub-tasks or doing whatever is needed to complete the MMF, again with no estimates.
&lt;br/&gt;
Another opinion expressed by Arlo in the podcast (not connected with naked planning) is that the maintenance cost of acceptance tests is too high. His suggestion is to use acceptances to drive unit testing and then throw them away. Pretty wild uh?
&lt;br/&gt;
I had some thinking about this approach. Naked Planning is based on strong  assumptions. The customer must be able to understand and to produce minimal marketable features. The customer must also be trained to take business decisions independently from the cost of implementing the MMF. As a developer I like the fact that I fight against complexity and time to maintain an estimate and I learn how to estimate better the next time. Micro-estimates like pomodoros are my daily game which is what makes me an happy programmer. How a developer feel considering the next 15 days working on the same feature? Arlo is not talking about what happens in the team when the MMF is in progress, but I suspect the pair creates and implicitly think of estimates.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.objectmentor.com/articles/2009/04/01/master-craftsman-teams" target="_blank"&gt;Master Craftsman Teams - Uncle Bob&lt;/a&gt;…
Here’s a flame-like post by Uncle Bob for the richness of ideas it contains. Perplexity: skipping higher CS education for a serious apprenticeship? Could be. But somehow higher education is important beside the actual subject of training. So why not learning physics, maths, chemistry or other high abstraction disciplines with the specific goal to move to computer science right after? I know a lot of successful examples of cross-discipline CS professionals and the success seems to depend on their ability to think “differently” than the subject of their studies. I think what Uncle Bob describes is doable but probably what is missing are those Master Programmers described in the post. There are just a few of them in my opinion, I don’t know if this is enough. Anyway, I aspire to be a Master Programmer one day. I changed my Linkedin tag line accordingly. :)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://video.google.com/videoplay?docid=-7230144396191025011&amp;ei=aLvQSd2tJpuo_AGQsPmYCg&amp;q=scrum" target="_blank"&gt;Ken Schwaber on Scrum at Google&lt;/a&gt;…
Here’s the classic video about Scrum by Ken Schwaber. Three years have passed already but the talk is just actual as it used to be. I’m wondering how Scrum adoption at Google is doing after several years. Anyway, I liked the how Ken rendered the accumulation of technical debt using burn-down charts. First management asks to increase velocity to produce more value. The team reacts reducing quality and achieving the velocity increase. But the following sprints velocity decreases for the accumulation of technical debt although the team is always trading quality for speed. What they experience is a false perception of instant velocity while they fail to see the decrease of long-term velocity which is so much harder to fix. Amazing that Ken can explain whatever idea with a burn-chart :)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/" target="_blank"&gt;I Love Pair-Programming - Absolutely No Machete Juggling&lt;/a&gt;…
At first I judged this experience report to be too naive. It’s instead a valuable article about the conversion of a cowboy coder into a quality-aware agile practices enthusiast. There are catch phrases and definitions to remember, like the experience of coding at the speed of light or the fact that “programmer man” is instead “technical debt man”. I don’t know if I ever was a programmer man: I probably suffered of the opposite problem of lacking of pragmatism and focus.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://itc.conversationsnetwork.org/shows/detail3987.html" target="_blank"&gt;Legacy Code - David Heinemeier Hansson&lt;/a&gt;…
I want to remember this podcast not for the content but for the speech capabilities of DHH. The content is actually very simple and can be summarized as: “legacy software is a personal opinion”. On top of this interesting concept DHH was able to create an entire speech. I’m amazed by the approach: a very simple catch phrase or concept and then, like in a mind-map, a set of corollary and consequences and for each one an simple explanation. I’ll be happy to be able to repeat the same approach in my talks: find out what the content is all about in just one sentence and draw from that sentence all the consequences. Is not necessary for the main topic to be a complex theory, just something simple that can potentially have many consequences and what are the most important of them. Just a dream… I don’t have of course the same eloquence.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/92803629</link><guid>http://reborg.tumblr.com/post/92803629</guid><pubDate>Sat, 04 Apr 2009 00:34:00 -0500</pubDate><category>thisweekhighlights</category><category>naked</category><category>agile</category><category>arlo</category></item><item><title>Quality is Dead?</title><description>&lt;p&gt;
A provocation, I know. But there is actually truth in that. It’s true that software is seen by the large public as an unstable artifact, prone to unexpected behavior, difficult to fix and unreliable. This is the point of the most interesting post I found the last week 
&lt;a href="http://www.satisfice.com/blog/archives/224" target="_blank"&gt;Quality is Dead: The Hypothesis&lt;/a&gt; by James Bacha. We lowered the bar of software quality to such an extent that software users believe that grotesque user experiences and crashes are normal. Fatalism that we (software people) created. Marketing efforts are all focused to produce easily measurable metrics for the customer satisfaction like for example a convincing help line or distracting useless services. What software people can do is actually very simple: &lt;a href="http://manifesto.softwarecraftsmanship.org/" target="_blank"&gt;rising the bar&lt;/a&gt; starting from everyday development activities.
&lt;/p&gt;

&lt;p&gt;Other worth noticing this week and my opinion below:&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://www.youtube.com/watch?v=pqeJFYwnkjE" target="_blank"&gt;Ward Cunningham - Debt Metaphor&lt;/a&gt;…
Amazing how many good things can be said in less than 5 minutes. When technical debt accumulates it’s usually too late to fix it mainly because the code was not written to be easy to clean-up an debt accumulation is exponential. Especially when instead of fixing the broken design all dependencies to that part are fixed creating duplication. Ward remembers us that technical debt is about writing bad code with the idea of fixing it later, not writing good code with the understanding of the moment designing it so that can be easily changed. That is exactly what evolutionary design is about, not to be confused with technical debt.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www2.computer.org/portal/web/csdl/abs/html/mags/so/2007/03/s3024.htm" target="_blank"&gt;TDD: The Art of Fearless Programming&lt;/a&gt;…
In this article Ron Jeffries and Grigori Melnik discuss advantages of TDD adoption. The article is a basic introduction to TDD, but it publishes a couple of tables of research studies in the industry and academic about results of agile adoption. The study shows an average increment in the effort which is usually low and a substantial quality increase percentage. The article confirms that with agile adoption a low increase in the effort produces a substantial quality increase. The results aren’t extraordinary but positive, just to stress once again that there is no silver bullet.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.infoq.com/articles/adopting-pair-programming" target="_blank"&gt;Jay Fields: Successfully Adopting Pair Programming&lt;/a&gt;…
Here’s another nice write-up by Jay. This article is good to remember because it clearly describe usual pair programming stories and their challenges. Is good to remember that pair programming should never be imposed. There are people who obviously aren’t interested in pairing if they never tried or if they fear their freedom is in danger. Jay suggestion to start from who is more willing to pair to first create a working team and then convince the others is great. The mentor/learner distinction is very important too especially talking of the mentor role. In my experience often the mentor doesn’t switch to teaching mode (driving the learner to the correct solution instead of dictate literally the solution). I also tried pairing sessions myself and I am very happy about the results.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://mwrc2009.confreaks.com/14-mar-2009-15-00-bdd-with-cucumber-ben-mabey.html" target="_blank"&gt;BDD with Cucumber - Ben Mabey: MountainWest RubyConf 2009&lt;/a&gt;…
This is a well crafted Cucumber presentation, with funny examples and a great selection of pictures. I already know what cucumber can do and I know is a wonderful acceptance framework. My take-aways are a concise formulation of the 5 whys rule and a clear statement that there is no fixed way to say what to use between views specs, controllers spec, models spec, Cucumber-webrat or Cucumber-Selenium. Based on the project, you can use all of the possible level of testing or just part of them.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://mwrc2009.confreaks.com/14-mar-2009-15-35-what-the-ruby-craftsman-can-learn-from-the-smalltalk-master-philippe-hanrigou.html" target="_blank"&gt;Smalltalk to Ruby: MountainWest RubyConf 2009&lt;/a&gt;…
Maybe this presentation is too simple as the author said at the end. It presents the Implementation Patterns book Smalltalk version by Kent Beck with  a few examples from the everyday Ruby and Rails development. But it helped me out to clarify the meaning of esthetic in code. Esthetic is about visualization: symmetry for example is a visual effect. How then software relates to esthetic? Because there is a visualization aspect of code which is actually very important. It is through visualization for example that is possible to say if some code is good or bad, because of the “impression” of length of methods or the symmetry of a class where there is the same amount of code averaged in every method. The first metric we often use to judge clean code is the visual aspect. At least this is what I do. It would be interesting to analyze these visual aspects in a formal way. Mmmh.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://rubyconf2008.confreaks.com/advanced-dsls-in-ruby.html" target="_blank"&gt;Neal Ford DSLs RubyConf 2008&lt;/a&gt;…
The de-facto DSL in Ruby presentation these days. Neal Ford’s talk are usually well crafted and this is no exception. I especially liked the constant factory trick to avoid double quotes on names, bubble words and instance_eval to expand contexts. Slides available here &lt;a href="http://www.nealford.com/downloads/conferences/canonical/Neal_Ford-Advanced_DSLs_in_Ruby-slides.pdf" target="_blank"&gt;http://www.nealford.com/downloads/conferences/canonical/Neal_Ford-Advanced_DSLs_in_Ruby-slides.pdf&lt;/a&gt;
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/90731671</link><guid>http://reborg.tumblr.com/post/90731671</guid><pubDate>Sat, 28 Mar 2009 16:30:48 -0500</pubDate><category>thisweekhighlights</category><category>quality</category><category>craftsman</category><category>craftsmanship</category></item><item><title>MacRuby CSS Based Charts</title><description>&lt;p&gt;I spiked around a while ago searching for the best solution to create charts under MacRuby for &lt;a href="http://reborg.github.com/pomodori/" target="_blank"&gt;Pomodori&lt;/a&gt;. There are wonderful Ruby library for charting and 2D drawing in general, but the problem is to see if they are MacRuby compatible. In theory, everything can work under MacRuby as it runs under MRI but the macgem mechanism is still immature and even installing by hand doesn’t guarantee that the gem doesn’t bomb with impossible-to-read core dumps. I also searched for a non-native drawing solution (so all rmagick libs are out of discussion) because I don’t want to force the user to install a dependency which requires compilation.&lt;/p&gt;

&lt;p&gt;A promising pure 100% Ruby library for the task is &lt;a href="http://www.germane-software.com/software/SVG/SVG::Graph/" target="_blank"&gt;SVG::Graph&lt;/a&gt;. I jumped into it to find out that REXML gives a strange exception under MacRuby 0.4 which is already a &lt;a href="http://www.macruby.org/trac/ticket/134" target="_blank"&gt;major open ticket&lt;/a&gt;. I wasted some time to understand if I could fix it but I really wanted to have something done quickly. So I searched for something else.&lt;/p&gt;

&lt;p&gt;While searching for options I also found this hidden gem inside the MacRuby installation: &lt;a href="http://hcg.drtoast.com/" target="_blank"&gt;HotCocoa::Graphics&lt;/a&gt;. This is the Ruby bridge to the powerful Cocoa 2D graphics capabilities and can draw wonders. Probably this is the future core for a native charting library that unfortunately doesn’t exist yet. I had a quick look to realize how much work would require to use those low level primitives to create a bar chart. Again, too much work.&lt;/p&gt;

&lt;p&gt;CSS charting was a very promising option from the start. I had a look at the many Geoffrey Grosenbach’s wonderful &lt;a href="http://geoffreygrosenbach.com/projects/show/5" target="_blank"&gt;charting libraries&lt;/a&gt; with no luck. That’s because either Rails based or requiring rmagick. So I was left with javascript charting or CSS charting, two solutions requiring a web engine to work. Of the two I picked CSS charting because it’s dead simple and plenty of examples around.&lt;/p&gt;

&lt;p&gt;The trick to make it works under MacRuby is just to open a web_view (I’m using HotCocoa to wrap Cocoa objects) and point the view to a local HTML file containing the data and using a CSS file to render them as charts. And you see the following as expected&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20090325-kykr2q3amn36yyngjtu8hdxcee.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;That’s just a matter of:&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/85505.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;where resources/all_tags_report.html is local to the application. The HTML file can then import all the necessary CSS always from localhost. Notice how the local reference is loaded with NSURL.alloc.initFileURLWithPath. There is some trickyness though: the &lt;a href="http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html#//apple_ref/occ/instm/WebView/reload:" target="_blank"&gt;reload method on WebView&lt;/a&gt; doesn’t work for local pages so to refresh the chart you actually need to produce another HTML file with different data and point the web_view to it.&lt;/p&gt;
&lt;p&gt;The next piece of implementation to consider is how to make the static HTML page dynamic so that when it’s loaded it populates with the latest data available. I started looking around for template engines like &lt;a href="http://radius.rubyforge.org/" target="_blank"&gt;Radius&lt;/a&gt;. No problem running a Radius parsing like this one under MacRuby:&lt;/p&gt;
&lt;p&gt;&lt;script src="http://gist.github.com/85515.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;except for the fact that the to_s isn’t working! The Proc returned after the parse isn’t evaluated for some reason and returned as is.&lt;/p&gt;
&lt;p&gt;
&gt; macruby radius_test.rb&lt;br/&gt;
[##-&lt;:parsetag:0x8005d84e0 block="#&lt;Proc:0x8005d87a0@csscharts/radius/lib/radius.rb:422"&gt;&gt;]&lt;br/&gt;
&gt; ruby radius_test.rb&lt;br/&gt;
A small example: Hello world!
&lt;/:parsetag:0x8005d84e0&gt;&lt;/p&gt;
&lt;p&gt;Damn another MacRuby incompatibility! Also in this case I decided not to try to fix it myself, also because a simple gsub on the HTML file should do the trick. The last thing I want to try for this is &lt;a href="http://github.com/mdeiters/semr/tree/master" target="_blank"&gt;semr&lt;/a&gt;: I can create a small html-ish grammar with loop support to help me creating the small template engine I need.&lt;/p&gt;

&lt;p&gt;Even though not perfect, I find the CSS web view based solution very simple and flexible at the same time. I’m pretty sure that when MacRuby will be shipped with Mac Os X nothing of this work would be useful because all the standard pure Ruby graphic library will be supported out of the box. But for now…&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/89712030</link><guid>http://reborg.tumblr.com/post/89712030</guid><pubDate>Wed, 25 Mar 2009 10:29:44 -0500</pubDate></item><item><title>Pomodoro Talk in Review</title><description>Submission for &lt;a href="http://agile2009.agilealliance.org/" target="_blank"&gt;Agile 2009&lt;/a&gt; are now closed but the review process is still on going. I submitted the &lt;a href="http://agile2009.agilealliance.org/node/246" target="_blank"&gt;following talk&lt;/a&gt; and received some good reviews and comments already. Please consider reviewing your self or send me comments about what you’d like to see at the talk.
&lt;p&gt;&lt;b&gt;You say tomato, I say Pomodoro&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The “pomodoro technique” is a simple tracking and feedback process where the unit of work is the “pomodoro”, a time slot of 25 mins. In this tutorial I’ll give you advanced practical advices on how to implement the daily pomodoro practice, common pitfalls, tools you may find useful and how to read and use pomodoro metrics and answer questions like: what did I do the last week, on which tasks I spent most of the time, how frequent is the context switching. Hopefully after this talk you’ll be able to go back to your team and give pomodoros a try with all the practical information needed&lt;/p&gt;
&lt;p&gt;Process/Mechanics&lt;/p&gt;
&lt;p&gt;I’ll show a small agile setup with a bunch of stories in different states. As the project progresses pomodoros are first produced and then “consumed” by the different roles in the project. I’ll be moving fast between the start of the iteration, the retrospective and the day by day work by tracking pomodoros worked and show how to read the charts produced by it to infer useful information (for example something like &lt;a href="http://reborg.net/pic/tomato2.png" target="_blank"&gt;this chart&lt;/a&gt; of pomodoros worked by task). I’m mainly focused on the practice of using pomodoros in-context giving just enough of the theory necessary to move forward. Please consider following Staffan Noteberg’s talk on pomodoros that covers much better all the basics of the technique.

About me: my personal experience with pomodoros started 3 years ago. I’ve collected around 5000 tomatoes (time-stamps plus descriptions) with different tools (have a &lt;a href="http://reborg.tumblr.com/post/51570675/tomatoes" target="_blank"&gt;read here&lt;/a&gt; to know more about my experience ). I’ve tried the technique as a team practice at least a couple of times. I think the key is to render the tracking less invasive as possible: tracking pomodoros shouldn’t take more than a few seconds.

About the Pomodoro Technique: the PT was invented by Francesco Cirillo in late ‘80 and refined over time until today. The Pomodoro has an &lt;a href="http://www.pomodorotechnique.com/" target="_blank"&gt;official site&lt;/a&gt; and an &lt;a href="http://www.pomodorotechnique.com/resources/cirillo/ThePomodoroTechnique_v1-3.pdf" target="_blank"&gt;official paper (PDF)&lt;/a&gt;. There is also a &lt;a href="http://www.pomodoro-book.com/" target="_blank"&gt;great book&lt;/a&gt; by Staffan Noteberg now in beta state.&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/88477669</link><guid>http://reborg.tumblr.com/post/88477669</guid><pubDate>Sat, 21 Mar 2009 09:37:00 -0500</pubDate><category>agile2009</category><category>pomodoro</category><category>pdt</category><category>talk</category><category>agile</category></item><item><title>A Start-up Life</title><description>&lt;p&gt;I decided to change the title of the week’s highlights to reflect the most interesting topic I discovered running through my feeds. The same title every time is just boring and gives the impression there is no content inside.&lt;/p&gt;

&lt;p&gt;The &lt;b&gt;1st prize&lt;/b&gt; this week goes to Jake Scruggs’s “&lt;a href="http://jakescruggs.blogspot.com/2009/03/on-going-fast-because-youre-start-up.html" target="_blank"&gt;On Going Fast Because You’re A Start-up&lt;/a&gt;” blog post. Jake talks about a typical start-up frustration experience. The “experiment” phase should not be longer than 4-6 months and after that the entrepreneur should know if it’s worthwhile. From the technical standpoint that should be also the time to plan based on the user feedback. The problem is that once lower quality is established and there is a public release it’s too late to educate the customer about the need for quality. So my suggestion is never trade quality for speed, it’s a false impression of speed. Yes the entrepreneur will probably go finding someone else for a 4th of the price but we (the craftsmen) have the responsibility to tell the customer what to expect. And this post is a good example to tell other people.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Other topics this week&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://matteo.vaccari.name/blog/archives/171" target="_blank"&gt;Extreme Enthusiasm  Blog Archive  Not wishful thinking&lt;/a&gt;…
I want to remember the example of the toddler baby. They are not sold the idea of walking on two feet and still they are able to move quite well anyway on four. They try the new “practice” anyway and they see they can cover much more distance with ease. So, yes, you don’t need to try anything new if you are successful already. But you might discover you can do the same thing with less effort and spend the energy for something else.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.objectmentor.com/articles/2009/03/16/tighter-ruby-methods-with-functional-style-pattern-matching-using-the-case-gem" target="_blank"&gt;Ruby Functional-style Pattern Matching, Using the Case Gem - Dean Wampler&lt;/a&gt;…
Interesting use of pattern matching instead of explicit conditional to control the program flow. The best would be to have a method definition in Ruby that accept a “Case” pattern declaration. When the method with that name is called the selection of which overridden version is done by the patter matching. Should we fork a functional Ruby? :)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.cuberick.com/2009/03/pair-programming-with-multiple-mouse.html" target="_blank"&gt;Pair programming with multiple mouse pointers and keyboard&lt;/a&gt;…
Wondering why I never thought about this before :) Why a screen should be constrained to just a single user interacting with it? Multiple mice and keyboards can be connected to a single screen with the use of a special switch and used sequentially. But the possibility of having multiple mouse pointers and users sitting in front of the same screen offers new possibility for pair programming. For a little more on discipline, you cut down on all those “can I grab it for a moment” synchronization points! Thanks to Josh for pointing this out.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://agileinaflash.blogspot.com/2009/03/extreme-measures.html" target="_blank"&gt;Agile: In A Flash: Extreme Measures&lt;/a&gt;…
This is a series of flash cards collecting agile and programming principles. The format is a pleasure to read: small enough to attract your attention with a single catch sentence. I link to this one in particular (but go and read the rest) because it’s full of original and advanced tips. In particular I like the technique of splitting a team so that developers aren’t tempted to cheat on the done percentage of a story and sneak features into the following iteration. Since they can be in a different sub-team, there is no next iteration to close the user story. The other interesting tip is to discard work which is over 3 weeks old. I would also add to clean-up the task list of stale/old tasks that never get done in the hope to have more time in the future. I know from experience that they never get done.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://rubyconf2008.confreaks.com/what-all-rubyist-should-know-about-threads.html" target="_blank"&gt;Jim Weirich - Threads - RubyConf 2008&lt;/a&gt;…
Classic threads presentation but as usual with Jim Weirich entertaining and fun. Common aspects of concurrent programming in Ruby are covered here and was a good refresh for my Java memories too. The problem with thread is all about shared state and very similar to transaction management at the end. You need to make atomic a sequence of operations with something like a Mutex. Deadlock is when all the thread are in a wait state (and this happens when a couple of them are waiting for each other) and can be solved with prioritization. Suggestion: if your application is highly concurrent in nature, consider to use a secondary inherently thread safe language like Erlang or Clojure instead of trying to use thread controlling constructs of the sequential language.
&lt;/p&gt;</description><link>http://reborg.tumblr.com/post/88475216</link><guid>http://reborg.tumblr.com/post/88475216</guid><pubDate>Sat, 21 Mar 2009 09:25:00 -0500</pubDate><category>thisweekhighlights</category><category>startup</category><category>jake</category></item></channel></rss>
