<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet TW</title>
	<link>http://blogs.thoughtworks.com/</link>
	<language>en</language>
	<description>Planet TW - http://blogs.thoughtworks.com/</description>

<item>
	<title>Ye Zheng: 一个用C++实现的Dispatcher（二）</title>
	<guid isPermaLink="true">http://dreamhead.blogbus.com/logs/74698689.html</guid>
	<link>http://dreamhead.blogbus.com/logs/74698689.html</link>
	<description>&lt;p&gt;遗留代码就是遗留代码，总会有一些让人意想不到的地方，原以为所有消息都是由一个类（MsgHandler）处理的，可事实上，不是。&lt;br&gt;&lt;/br&gt;if (msg-&amp;gt;id == &quot;open&quot;) {&lt;br&gt;&lt;/br&gt;    MsgHandler handler(msg);&lt;br&gt;&lt;/br&gt;    handler.open();&lt;br&gt;&lt;/br&gt;} else if (msg-&amp;gt;id == &quot;close&quot;) {&lt;br&gt;&lt;/br&gt;    MsgHandler2 handler(msg);&lt;br&gt;&lt;/br&gt;    handler.close();&lt;br&gt;&lt;/br&gt;} else if (…) {&lt;br&gt;&lt;/br&gt;    …&lt;br&gt;&lt;/br&gt;} else {&lt;br&gt;&lt;/br&gt;    // exception handler&lt;br&gt;&lt;/br&gt;    …&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;上面的代码里面只有消息处理类的名字不同，其它的处理完全相同。不过，这样就让之前那个dispatcher就显得势单力薄。解决程序设计的问题，有一个很好用的处理手法：加个间接层。于是，&lt;br&gt;&lt;/br&gt;class DispatchHandler {&lt;br&gt;&lt;/br&gt;public:&lt;br&gt;&lt;/br&gt;    virtual void execute(Msg* msg) = 0;&lt;br&gt;&lt;/br&gt;};&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;对于前面的两种类型，道理上来说，我们需要分别为两个类型（MsgHandler和MsgHandler2）分别编写对应的子类。不过，我们用的是C++，是的，模板：&lt;br&gt;&lt;/br&gt;template&amp;lt;typename T&amp;gt;&lt;br&gt;&lt;/br&gt;class DispatchHandlerImpl : public DispatchHandler {&lt;br&gt;&lt;/br&gt;    typedef void (T::*Func)();&lt;br&gt;&lt;/br&gt;public:&lt;br&gt;&lt;/br&gt;    DispatchHandlerImpl(Func sourceHandler)&lt;br&gt;&lt;/br&gt;        :handler(sourceHandler) {}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;    void execute(Msg* msg) {&lt;br&gt;&lt;/br&gt;        T msgHandler(msg);&lt;br&gt;&lt;/br&gt;        (msgHandler.*(this-&amp;gt;handler))();&lt;br&gt;&lt;/br&gt;    }&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;private:&lt;br&gt;&lt;/br&gt;    Func handler;&lt;br&gt;&lt;/br&gt;};&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;原来的dispatcher也要相应的调整：&lt;br&gt;&lt;/br&gt;class MsgDispatcher {&lt;br&gt;&lt;/br&gt;public:&lt;br&gt;&lt;/br&gt;    ...&lt;br&gt;&lt;/br&gt;    void dispatch(Msg* msg);&lt;br&gt;&lt;/br&gt;private:&lt;br&gt;&lt;/br&gt;    map&amp;lt;string, DispatchHandler&amp;gt; handlers;&lt;br&gt;&lt;/br&gt;};&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;void MsgDispatcher::dispatch(Msg* msg) {&lt;br&gt;&lt;/br&gt;    DispatchHandler* handler = this-&amp;gt;handlers[msg-&amp;gt;id];&lt;br&gt;&lt;/br&gt;    if (handler) {&lt;br&gt;&lt;/br&gt;        handler-&amp;gt;execute(msg);&lt;br&gt;&lt;/br&gt;    } else {&lt;br&gt;&lt;/br&gt;        // exception handler&lt;br&gt;&lt;/br&gt;        …&lt;br&gt;&lt;/br&gt;    }&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;对应的注册代码也就变成：&lt;br&gt;&lt;/br&gt;handlers[&quot;open&quot;] = new DispatchHandlerImpl&amp;lt;MsgHandler&amp;gt;(MsgHandler::open);&lt;br&gt;&lt;/br&gt;handlers[&quot;close&quot;] = new DispatchHandlerImpl&amp;lt;MsgHandler2&amp;gt;(MsgHandler2::close);&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;有代码洁癖的我们发现类名在这里重复了，于是，定义一个宏对其进行简化：&lt;br&gt;&lt;/br&gt;#define DISPATCH_HANDLER(className, funcName) \&lt;br&gt;&lt;/br&gt;  DispatchHandlerImpl &amp;lt;className&amp;gt;(className::funcName)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;handlers[&quot;open&quot;] = new DISPATCH_HANDLER(MsgHandler, open);&lt;br&gt;&lt;/br&gt;handlers[&quot;close&quot;] = new DISPATCH_HANDLER(MsgHandler2, close);&lt;/p&gt;</description>
	<pubDate>Fri, 10 Sep 2010 15:33:56 +0000</pubDate>
</item>
<item>
	<title>Ye Zheng: 一个用C++实现的Dispatcher（一）</title>
	<guid isPermaLink="true">http://dreamhead.blogbus.com/logs/74629744.html</guid>
	<link>http://dreamhead.blogbus.com/logs/74629744.html</link>
	<description>&lt;p&gt;又和一个团队合作，面前又摆着一堆分发的代码，不同的是，这次用的是C++：&lt;br&gt;&lt;/br&gt;if (msg-&amp;gt;id == &quot;open&quot;) {&lt;br&gt;&lt;/br&gt;    MsgHandler handler(msg);&lt;br&gt;&lt;/br&gt;    handler.open();&lt;br&gt;&lt;/br&gt;} else if (msg-&amp;gt;id == &quot;close&quot;) {&lt;br&gt;&lt;/br&gt;    MsgHandler handler(msg);&lt;br&gt;&lt;/br&gt;    handler.close();&lt;br&gt;&lt;/br&gt;} else if (…) {&lt;br&gt;&lt;/br&gt;    …&lt;br&gt;&lt;/br&gt;} else {&lt;br&gt;&lt;/br&gt;    // exception handler&lt;br&gt;&lt;/br&gt;    …&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;不要问我为什么不是每个消息对应一种处理类，要是知道为什么，就不是遗留代码了。于是，我们尝试着用C++写了一个dispatcher。下面是这个dispatcher的声明：&lt;br&gt;&lt;/br&gt;#include &amp;lt;map&amp;gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;typedef void (MsgHandler::*handlerFunc)();&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;class MsgDispatcher {&lt;br&gt;&lt;/br&gt;public:&lt;br&gt;&lt;/br&gt;    ...&lt;br&gt;&lt;/br&gt;    void dispatch(Msg* msg);&lt;br&gt;&lt;/br&gt;private:&lt;br&gt;&lt;/br&gt;    map&amp;lt;string, handlerFunc&amp;gt; handlers;&lt;br&gt;&lt;/br&gt;};&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;因为要处理遗留代码，这里用到了指向成员函数的指针，也就提高了理解这段代码的门槛。具体实现如下：&lt;br&gt;&lt;/br&gt;void MsgDispatcher::dispatch(Msg* msg) {&lt;br&gt;&lt;/br&gt;    handlerFunc func = this-&amp;gt;handlers[msg-&amp;gt;id];&lt;br&gt;&lt;/br&gt;    if (func) {&lt;br&gt;&lt;/br&gt;        MsgHandler msgHandler(pkg);&lt;br&gt;&lt;/br&gt;        (msgHandler.*func)();&lt;br&gt;&lt;/br&gt;    } else {&lt;br&gt;&lt;/br&gt;        // exception handler&lt;br&gt;&lt;/br&gt;        …&lt;br&gt;&lt;/br&gt;    }&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;注册很简单：&lt;br&gt;&lt;/br&gt;handlers[&quot;open&quot;] = MsgHandler::open;&lt;br&gt;&lt;/br&gt;handlers[&quot;close&quot;] = MsgHandler::close;&lt;/p&gt;</description>
	<pubDate>Thu, 09 Sep 2010 15:04:41 +0000</pubDate>
</item>
<item>
	<title>Simon Brunning: Links for 2010-09-08 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2010-09-08</guid>
	<link>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/b5PQAXEOr9g/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dorktower.com/2010/09/06/dork-tower-monday-september-6/&quot;&gt;140 Characters&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
For nerds of a certain age.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.guardian.co.uk/science/political-science/2010/sep/08/science-spending-vince-cable&quot;&gt;What is Vince Cable really saying about how to make science cutbacks?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://openlibrary.org/&quot;&gt;Open Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.secretgeek.net/dod_intro.asp&quot;&gt;DOS on Dope: The last MVC web framework you'll ever need&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 09 Sep 2010 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Siva Jagadeesan: sivajag</title>
	<guid isPermaLink="false">https://sivajag.wordpress.com/?p=179</guid>
	<link>http://techbehindtech.com/2010/09/08/mql-a-clojure-library-for-querying-nested-maps/</link>
	<description>&lt;p&gt;I was working on a feature that needed me to query nested map structure. I wanted to do it in a generic way. Amit pointed me to &lt;a href=&quot;http://github.com/MrHus/rql&quot;&gt;rql&lt;/a&gt;, a library for dealing with collections of records in clojure. I thought it will be helpful if I have something similar to rql for querying map, so I created &lt;a href=&quot;http://github.com/sivajag/mql&quot;&gt;mql&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Given a map&lt;/p&gt;
&lt;pre class=&quot;brush: plain;&quot;&gt;(def m
     {:cid
      {
       :visits {
                :id-1 {
                       :last-ts &quot;1284166000040&quot;
                       :first-ts &quot;1274166000000&quot;
                       :duration &quot;40&quot;}
                :id-2 {
                       :last-ts &quot;1274166000040&quot;
                       :first-ts &quot;1274166000000&quot;
                       :duration &quot;40&quot;}
                :id-3 {
                       :last-ts &quot;1264166000040&quot;
                       :first-ts &quot;1274166000000&quot;
                       :duration &quot;40&quot;}}

       :promo{
              :id-1 {:promo &quot;p2&quot;}
              :id-2 {:promo &quot;p1&quot;}}

       :purchase {
                  :id-1
                  {:order-id &quot;order-id-1&quot;
                   :total-dollars &quot;970.00&quot;
                   :purchase? &quot;true&quot;,
                   :merchant-total-dollars &quot;1000.00&quot;}
                  :id-3
                  {:order-id &quot;order-id-2&quot;
                   :total-dollars &quot;1000.00&quot;
                   :purchase? &quot;&quot;
                   :merchant-total-dollars &quot;1000.00&quot;}}}})
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Select: simple select&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: plain;&quot;&gt;mql.core&amp;gt; (select [:cid :promo] m)
{:id-1 {:promo &quot;p2&quot;}, :id-2 {:promo &quot;p1&quot;}}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Select: with filtering&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: plain;&quot;&gt;mql.core&amp;gt; (select [:cid :purchase] (where [* :total-dollars] :gt 980) m)
([:id-3 {:order-id &quot;order-id-2&quot;, :total-dollars &quot;1000.00&quot;, :purchase? &quot;&quot;, :merchant-total-dollars &quot;1000.00&quot;}])
&lt;/pre&gt;
&lt;p&gt;You can currently use :gt,:ge,:lt,:le and :eq as logical operators in where clause. In where clause for key-seq you can use * if a key is dynamic. The last key in where clause key-seq should not be *.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There could be only one * in Where Clause&lt;/li&gt;
&lt;li&gt;Select clause cannot have * now&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is an early version of this library. It is doing what I need for now. So if you have any requirements/idea, you can send me a patch or let me know, I will hack when I get some free time.&lt;/p&gt;
&lt;p&gt;Please feel free to send me your feedback on syntax, code style … etc&lt;/p&gt;
&lt;br&gt;&lt;/br&gt;Filed under: &lt;a href=&quot;http://techbehindtech.com/category/clojure/&quot;&gt;Clojure&lt;/a&gt; Tagged: &lt;a href=&quot;http://techbehindtech.com/tag/clojure-2/&quot;&gt;clojure&lt;/a&gt;, &lt;a href=&quot;http://techbehindtech.com/tag/data-structure/&quot;&gt;data structure&lt;/a&gt;, &lt;a href=&quot;http://techbehindtech.com/tag/libraries/&quot;&gt;libraries&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/sivajag.wordpress.com/179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/sivajag.wordpress.com/179/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/sivajag.wordpress.com/179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/sivajag.wordpress.com/179/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/sivajag.wordpress.com/179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/sivajag.wordpress.com/179/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/sivajag.wordpress.com/179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/sivajag.wordpress.com/179/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/sivajag.wordpress.com/179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/sivajag.wordpress.com/179/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/sivajag.wordpress.com/179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/sivajag.wordpress.com/179/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/sivajag.wordpress.com/179/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/sivajag.wordpress.com/179/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=techbehindtech.com&amp;amp;blog=11954221&amp;amp;post=179&amp;amp;subd=sivajag&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 09 Sep 2010 05:43:18 +0000</pubDate>
</item>
<item>
	<title>Hakan Raberg: Enumerable.java - Lambdas in Java 5 Today</title>
	<guid isPermaLink="true">http://www.jroller.com/ghettoJedi/entry/enumerable_java_lambdas_in_java</guid>
	<link>http://www.jroller.com/ghettoJedi/entry/enumerable_java_lambdas_in_java</link>
	<description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Ruby/Smalltalk style internal iterators for Java 5 using bytecode transformation to capture expressions as closures.&lt;/i&gt; &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/hraberg/enumerable&quot;&gt;http://github.com/hraberg/enumerable&lt;/a&gt; | &lt;a href=&quot;http://github.com/downloads/hraberg/enumerable/enumerable-java-0.2.4-20100510.tgz&quot;&gt;0.2.4 binary&lt;/a&gt; | &lt;a href=&quot;http://github.com/hraberg/enumerable/tarball/0.2.4&quot;&gt;0.2.4 source&lt;/a&gt; | &lt;a href=&quot;http://github.com/hraberg/enumerable/blob/0.2.4/src/example/java/lambda/enumerable/EnumerableExample.java&quot;&gt;examples&lt;/a&gt; | &lt;a href=&quot;http://github.com/hraberg/enumerable/blob/0.2.4/README.markdown#readme&quot;&gt;readme&lt;/a&gt; &lt;/p&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;&lt;b&gt;int&lt;/b&gt; factorial = &lt;b&gt;&lt;i&gt;inject&lt;/i&gt;&lt;/b&gt;(ints, &lt;b&gt;&lt;i&gt;fn&lt;/i&gt;&lt;/b&gt;(&lt;b&gt;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt;, &lt;b&gt;&lt;i&gt;m&lt;/i&gt;&lt;/b&gt;, &lt;b&gt;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; * &lt;b&gt;&lt;i&gt;m&lt;/i&gt;&lt;/b&gt;));&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;&lt;pre&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;Map&amp;lt;String, Integer&amp;gt; map = new HashMap&amp;lt;String, Integer&amp;gt;();&lt;br&gt;&lt;/br&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;font class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;	&lt;/span&gt;eachWithIndex&lt;/b&gt;&lt;/i&gt;(strings, &lt;i&gt;&lt;b&gt;fn&lt;/b&gt;&lt;/i&gt;(&lt;i&gt;&lt;b&gt;s&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;idx&lt;/b&gt;&lt;/i&gt;, map.put(&lt;i&gt;&lt;b&gt;s&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;idx&lt;/b&gt;&lt;/i&gt;))); &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;pre&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;i&gt;	&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;b&gt;int&lt;/b&gt; x = 6;&lt;/span&gt;&lt;/i&gt;&lt;br&gt;&lt;/br&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;i&gt;	&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;b&gt;&lt;i&gt;fn&lt;/i&gt;&lt;/b&gt;(&lt;b&gt;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt;, x += &lt;b&gt;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt;).call(2);&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;/i&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;i&gt;	&lt;/i&gt;&lt;/span&gt;&lt;b&gt;assert&lt;/b&gt;&lt;i&gt; x == 8;  &lt;/i&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Mark Reinhold &lt;a href=&quot;http://blogs.sun.com/mr/entry/rethinking_jdk7&quot;&gt;announced today&lt;/a&gt; that there will be no lambdas in Java, at least not until probably 2012. This doesn't come as a huge surprise after following the &lt;a href=&quot;http://mail.openjdk.java.net/mailman/listinfo/lambda-dev&quot;&gt;lambda-dev&lt;/a&gt; list for quite some time, even though I was a bit more optimistic. It seems Oracle has basically one guy dedicated to actually implementing the core of this, &lt;a href=&quot;http://blogs.sun.com/mcimadamore/&quot;&gt;Maurizio Cimadamore&lt;/a&gt;. That is not an easy job, and he has my respect.&lt;/p&gt;&lt;p&gt;&lt;b&gt;I would at this point seriously recommend using &lt;/b&gt;&lt;a href=&quot;http://www.scala-lang.org/&quot;&gt;&lt;b&gt;Scala&lt;/b&gt;&lt;/a&gt;&lt;b&gt;, &lt;/b&gt;&lt;a href=&quot;http://clojure.org/&quot;&gt;&lt;b&gt;Clojure&lt;/b&gt;&lt;/a&gt;&lt;b&gt; or &lt;/b&gt;&lt;a href=&quot;http://jruby.org/&quot;&gt;&lt;b&gt;JRuby&lt;/b&gt;&lt;/a&gt;&lt;b&gt; for any greenfield development on the JVM&lt;/b&gt;. &lt;a href=&quot;http://www.thoughtworks.com/radar/&quot;&gt;ThoughtWorks Technology Radar&lt;/a&gt; has had &lt;i&gt;Java language, end of life&lt;/i&gt; as &quot;Assess&quot; for quite some time now, while still keeping &lt;i&gt;JVM as a platform&lt;/i&gt; and &lt;i&gt;JRuby&lt;/i&gt; as &quot;Adapt&quot;.&lt;/p&gt;&lt;p&gt;But if you're still on Java 5, you could do worse than trying out &lt;a href=&quot;http://github.com/hraberg/enumerable&quot;&gt;Enumerable.java&lt;/a&gt; for your closure needs. I implemented it mainly &lt;a href=&quot;http://www.jroller.com/ghettoJedi/entry/closures_in_valid_java_limited&quot;&gt;during one month&lt;/a&gt; on the road, and it has since, sorry to say, gone silent while I've been moving back to work and live in London, currently maintaining a huge &lt;a href=&quot;http://www.springsource.com/&quot;&gt;Spring application&lt;/a&gt; (but, also doing a healthy amount of &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;But the unrealistic schedule of JDK 7 was exactly the reason I implemented Enumerable.java in the first place.&lt;/p&gt;</description>
	<pubDate>Wed, 08 Sep 2010 20:22:25 +0000</pubDate>
</item>
<item>
	<title>Mark Needham: Ruby: Checking an array contains an item</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2904</guid>
	<link>http://feedproxy.google.com/~r/MarkNeedham/~3/YqmEg8BLwhs/</link>
	<description>&lt;p&gt;A couple of times in the past few days I've wanted to check if a particular item exists in an array and presumably influenced by working for too long with the .NET/Java APIs I keep expecting there to be a 'contains' method that I can call on the array!&lt;/p&gt;
&lt;p&gt;More as an attempt to help myself remember than anything else, the method we want is actually called 'include?'.&lt;/p&gt;
&lt;p&gt;Therefore…&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;ruby&quot;&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #006666;&quot;&gt;1&lt;/span&gt;,&lt;span style=&quot;color: #006666;&quot;&gt;2&lt;/span&gt;,&lt;span style=&quot;color: #006666;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: #9966CC; font-weight: bold;&quot;&gt;include&lt;/span&gt;?&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #006666;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;ruby&quot;&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #006666;&quot;&gt;1&lt;/span&gt;,&lt;span style=&quot;color: #006666;&quot;&gt;2&lt;/span&gt;,&lt;span style=&quot;color: #006666;&quot;&gt;3&lt;/span&gt;,&lt;span style=&quot;color: #006666;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: #9966CC; font-weight: bold;&quot;&gt;include&lt;/span&gt;?&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #006666;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;One other quite neat thing is that we can use that in tests when we want to check that an array contains one item that we're expecting. &lt;/p&gt;
&lt;p&gt;This is much better than having to specify a specific index which is what we often seem to end up doing in Java/C#.&lt;/p&gt;
&lt;p&gt;We therefore end up with (RSpec) tests similar to this:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;ruby&quot;&gt;response.&lt;span style=&quot;color: #9900CC;&quot;&gt;flash&lt;/span&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ff3333; font-weight: bold;&quot;&gt;:error&lt;/span&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;]&lt;/span&gt;.&lt;span style=&quot;color: #9966CC; font-weight: bold;&quot;&gt;include&lt;/span&gt;?&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #996600;&quot;&gt;&quot;Some error message&quot;&lt;/span&gt;&lt;span style=&quot;color: #006600; font-weight: bold;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #9900CC;&quot;&gt;should&lt;/span&gt; be_true&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;img src=&quot;http://feeds.feedburner.com/~r/MarkNeedham/~4/YqmEg8BLwhs&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 08 Sep 2010 18:54:50 +0000</pubDate>
</item>
<item>
	<title>Mark Needham: jQuery UI Tabs: Changing selected tab</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2901</guid>
	<link>http://feedproxy.google.com/~r/MarkNeedham/~3/0qnw0M4PfuY/</link>
	<description>&lt;p&gt;We're using the &lt;a href=&quot;http://jqueryui.com/demos/tabs/&quot;&gt;tabs part of the jQuery UI library&lt;/a&gt; on the project I'm currently working on and one thing we wanted to do was change the default tab that was being selected. &lt;/p&gt;
&lt;p&gt;The documentation suggested that one way to do this was to give the index of the tab we wanted selected when calling the tabs function:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript&quot;&gt;$&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&quot;.selector&quot;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;tabs&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; selected&lt;span style=&quot;color: #339933;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;3&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since we wanted to select the tab by name based on a value from the query string we thought it would probably be simpler if we could just set the selected tab using a css class.&lt;/p&gt;
&lt;p&gt;Our initial thought was that we could put the 'ui-tabs-hide' class on the divs that we wanted to hide and then not put that class on the one that we wanted to show.&lt;/p&gt;
&lt;p&gt;Unfortunately that didn't work and the first tab was still being selected…&lt;/p&gt;
&lt;p&gt;We downloaded version &lt;a href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.js&quot;&gt;1.8.2&lt;/a&gt; of the library  via &lt;a href=&quot;http://code.google.com/apis/libraries/devguide.html#jqueryUI&quot;&gt;Google's CDN&lt;/a&gt; (which seems really cool!) and were able to see that our class was actually intentionally being removed!&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;10523
10524
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;o.&lt;span style=&quot;color: #660066;&quot;&gt;selected&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&quot;color: #CC0000;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;anchors&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;{&lt;/span&gt; &lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// check for length avoids error when initializing empty list&lt;/span&gt;
				&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;panels&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;eq&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;o.&lt;span style=&quot;color: #660066;&quot;&gt;selected&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;removeClass&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;'ui-tabs-hide'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Luckily a little further down the file there is a comment which explains some other ways to manipulate the selected tab:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;10749
10750
10751
10752
10753
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;javascript&quot;&gt;			&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// Selected tab&lt;/span&gt;
			&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// use &quot;selected&quot; option or try to retrieve:&lt;/span&gt;
			&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// 1. from fragment identifier in url&lt;/span&gt;
			&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// 2. from cookie&lt;/span&gt;
			&lt;span style=&quot;color: #006600; font-style: italic;&quot;&gt;// 3. from selected class attribute on &amp;lt;li&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We need to put the class 'ui-tabs-selected' on the appropriate &amp;lt;li&amp;gt; and then that will be the one that gets selected.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/MarkNeedham/~4/0qnw0M4PfuY&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 08 Sep 2010 18:32:37 +0000</pubDate>
</item>
<item>
	<title>Ye Zheng: 一个用C实现的Dispatch框架</title>
	<guid isPermaLink="true">http://dreamhead.blogbus.com/logs/74572553.html</guid>
	<link>http://dreamhead.blogbus.com/logs/74572553.html</link>
	<description>&lt;p&gt;用条件语句做分发是一件很常见的事：&lt;br&gt;&lt;/br&gt;switch(msg-&amp;gt;id) {&lt;br&gt;&lt;/br&gt;    case ID1: &lt;br&gt;&lt;/br&gt;        ID1Handler(msg);&lt;br&gt;&lt;/br&gt;        break;&lt;br&gt;&lt;/br&gt;    case ID2:&lt;br&gt;&lt;/br&gt;        ID2Handler(msg);&lt;br&gt;&lt;/br&gt;        break;&lt;br&gt;&lt;/br&gt;    ...&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;条件稍微多一些点，函数就会变得冗长不堪。有的团队会直接用if..else，进行判断，于是我们有幸知道了，VC不支持超过128个的选择分支。为了让这种代码的可维护性更好，我们做了一些尝试。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;下面定义了一个dispatcher：&lt;br&gt;&lt;/br&gt;BEGIN_DISPATCHER(MSG, ID, MsgHandler)&lt;br&gt;&lt;/br&gt;    DISPATCH_ITEM(ID1, ID1Handler)&lt;br&gt;&lt;/br&gt;    DISPATCH_ITEM(ID2, ID2Handler)&lt;br&gt;&lt;/br&gt;END_DISPATCHER(PCU_DisasterHandler)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;首先，用BEGIN_DISPATCH_MAP定义了这个dispatcher的名字（MSG），用做分发键值的类型（ID）和处理函数的类型（MsgHandler）。接下来，用DISPATCH_ITEM定义了几个分发项，也就是说，如果传入的值是ID1，会用ID1Handler进行处理，如果是ID2，则对应着ID2Handler。最后，用END_DISPATCH_MAP定义了一个错误处理函数。这样的话，就把使用的时候，就不必额外去做判空的操作了。这是Null Object模式的一种体现。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;这个dispatcher的使用方式如下：&lt;br&gt;&lt;/br&gt;dispatch(to(MSG), with(msg-&amp;gt;id))(msg);&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;这段代码的含义是使用MSG这个dispatcher，根据msg-&amp;gt;id找到对应的处理函数，传入的参数是msg。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;这个dispatch框架的实现如下：&lt;br&gt;&lt;/br&gt;#include &amp;lt;string.h&amp;gt;&lt;br&gt;&lt;/br&gt;#define SIZE_OF_ARRAY(array) sizeof(array)/sizeof(array[0])&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;/* dispatcher definition */&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;#define __DISPATCHER_NAME(name) __dispatcher_##name&lt;br&gt;&lt;/br&gt;#define __DISPATCH_ITEM_NAME(name) __dispatch_item_##name&lt;br&gt;&lt;/br&gt;#define __IsMatched(target, source) (0 == memcmp(&amp;amp;target, &amp;amp;source, sizeof(target)))&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;#define BEGIN_DISPATCHER(name, key_type, handler_type) \&lt;br&gt;&lt;/br&gt;    struct __DISPATCH_ITEM_NAME(name) {\&lt;br&gt;&lt;/br&gt;        key_type key;\&lt;br&gt;&lt;/br&gt;        handler_type *handler;\&lt;br&gt;&lt;/br&gt;    };\&lt;br&gt;&lt;/br&gt;    \&lt;br&gt;&lt;/br&gt;handler_type* __DISPATCHER_NAME(name)(key_type key) \&lt;br&gt;&lt;/br&gt;{\&lt;br&gt;&lt;/br&gt;    static struct __DISPATCH_ITEM_NAME(name) dispatchers[] = {\&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;#define END_DISPATCHER(disaster_handler) \&lt;br&gt;&lt;/br&gt;    };\&lt;br&gt;&lt;/br&gt;    int i;\&lt;br&gt;&lt;/br&gt;    int array_size = SIZE_OF_ARRAY(dispatchers); \&lt;br&gt;&lt;/br&gt;    for (i = 0; i &amp;lt; array_size; i++)\&lt;br&gt;&lt;/br&gt;    {\&lt;br&gt;&lt;/br&gt;        if (__IsMatched(dispatchers[i].key, key)) {\&lt;br&gt;&lt;/br&gt;            return dispatchers[i].handler;\&lt;br&gt;&lt;/br&gt;        }\&lt;br&gt;&lt;/br&gt;    }\&lt;br&gt;&lt;/br&gt;    return disaster_handler;\&lt;br&gt;&lt;/br&gt;}&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;#define DISPATCH_ITEM(key, handler) {key, handler},&lt;br&gt;&lt;/br&gt;#define DISPATCH_ITEM_2(key1, key2, handler) {key1, key2, handler},&lt;br&gt;&lt;/br&gt;#define DISPATCH_ITEM_3(key1, key2, key3, handler) {key1, key2, key3, handler},&lt;br&gt;&lt;/br&gt;#define dispatch(name, key) __DISPATCHER_NAME(name)(key)&lt;br&gt;&lt;/br&gt;#define to(name) name&lt;br&gt;&lt;/br&gt;#define with(key) key&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;从这里可以看出，定义dispatcher，实际上是定义了一个函数，这个函数的返回值是一个函数指针，而这个函数指针的类型是由handler_type定义的。这样的话，就解决了不同dispatcher之间函数参数不同的问题。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;当然，这个处理里面采用了最简单的数组，在分发项不是很多的情况下是适用的。如果分发项较多，可以考虑改为map实现。另外，这里还运用了一些宏的技巧。在写应用代码时，我们并不鼓励多用宏。但写一些框架代码，为了提高使用上的表现力时，宏也会是一个利器。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;如果有兴趣，欢迎讨论！&lt;/p&gt;</description>
	<pubDate>Wed, 08 Sep 2010 14:30:24 +0000</pubDate>
</item>
<item>
	<title>Prabin Deka: How to upload data stolen from the Net – for dummies**!</title>
	<guid isPermaLink="true">http://prabindeka.com/?p=83</guid>
	<link>http://prabindeka.com/?p=83</link>
	<description>&lt;p&gt;** If you are a cool professional Ruby programmer you might find all of this just a bit greenish.&lt;/p&gt;
&lt;p&gt;We all have our pet web apps we work on whenever our day job does not get in the way. I have mine too. Many of these apps integrate various services over the web – like albums on Flickr. Well, every now and then I get a craving to actually put some usable data in my apps. I go around looking for that data on the net, which is followed by a moral debate with myself when I find some. Actually, it is not as bad as it sounds.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.49.14-PM.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.49.14-PM.png&quot; title=&quot;Screen shot 2010-09-08 at 3.49.14 PM&quot; height=&quot;49&quot; width=&quot;456&quot; alt=&quot;&quot; class=&quot;size-full wp-image-95 alignleft&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is a lot of data that you can pick up legally – like the nutrient data that the Australian government publishes in one of it’s websites.&lt;/p&gt;
&lt;p&gt;Data comes in various shapes and sizes. Tabular data that can be converted into CSV, which is sometimes the simplest to load. We all have done it a hundred times in projects. But here is how I did it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-2.55.11-PM.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-2.55.11-PM.png&quot; title=&quot;Screen shot 2010-09-08 at 2.55.11 PM&quot; height=&quot;304&quot; width=&quot;466&quot; alt=&quot;&quot; class=&quot;size-full wp-image-87 alignnone&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s a simple approach. The script is fast enough for me. There are 4000 rows in the file and it takes about 20 sec to upload the same. That works for me.&lt;/p&gt;
&lt;p&gt;You can off course avoid the first line using&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-2.58.19-PM.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-2.58.19-PM.png&quot; title=&quot;Screen shot 2010-09-08 at 2.58.19 PM&quot; height=&quot;37&quot; width=&quot;597&quot; alt=&quot;&quot; class=&quot;size-full wp-image-88 alignnone&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-2.58.19-PM.png&quot;&gt;&lt;/a&gt;You can also use FasterCSV and then avoid the first line using&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.01.18-PM.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.01.18-PM.png&quot; title=&quot;Screen shot 2010-09-08 at 3.01.18 PM&quot; height=&quot;21&quot; width=&quot;437&quot; alt=&quot;&quot; class=&quot;size-full wp-image-89 alignnone&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That brings us to our next topic&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Other alternatives to upload CSV&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Here are some of the other alternatives…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt; &lt;/strong&gt;Ruby String#split (slow)&lt;/li&gt;
&lt;li&gt;Ruby CSV (slow)&lt;/li&gt;
&lt;li&gt;FasterCSV (slow)&lt;/li&gt;
&lt;li&gt;ccsv (fast &amp;amp; recommended if you have control over CSV format)&lt;/li&gt;
&lt;li&gt;CSVScan (fast &amp;amp; recommended if you have control over CSV format)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.toastyapps.com/excelsior/&quot;&gt;Excelsior&lt;/a&gt; (fast &amp;amp; recommended if you have control over CSV format)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This data can be found &lt;a href=&quot;http://snippets.aktagon.com/snippets/246-How-to-parse-CSV-data-with-Ruby&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. There are some benchmarks of how fast each of the parser are in that website.&lt;/p&gt;
&lt;p&gt;I like the simplicity of&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.37.51-PM.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.37.51-PM.png&quot; title=&quot;Screen shot 2010-09-08 at 3.37.51 PM&quot; height=&quot;44&quot; width=&quot;224&quot; alt=&quot;&quot; class=&quot;size-full wp-image-90 alignnone&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;What about other non-tabular data?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Well there is much to be had over the web. There is the RSS feed that you can do a lot with if a website is publishing an RSS. If not, well, there is screen scraping! Ever heard of that beast?! This is how I parsed and uploaded some RSS data some time ago.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.25.42-PM.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Screen-shot-2010-09-08-at-3.25.42-PM.png&quot; title=&quot;Screen shot 2010-09-08 at 3.25.42 PM&quot; height=&quot;301&quot; width=&quot;383&quot; alt=&quot;&quot; class=&quot;size-full wp-image-91 alignnone&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some months hence … and after a few more Railscast under my belt, I would use FeedZirra.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Picture-6.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Picture-6.png&quot; title=&quot;Picture 6&quot; height=&quot;217&quot; width=&quot;337&quot; alt=&quot;&quot; class=&quot;size-full wp-image-92 alignnone&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Do have a look at the github page &lt;a href=&quot;http://github.com/pauldix/feedzirra&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. You can then set up a call to FeedEntry.update_from_feed(“feed url”) in your crons, or use &lt;a href=&quot;http://github.com/javan/whenever&quot; target=&quot;_blank&quot;&gt;Whenever&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One is probably wasting a bit of bandwidth by the way, if you are doing this, cause you are downloading the whole feed, when there are means for you to just get what has changed. You can do this using…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Picture-7.png&quot;&gt;&lt;img src=&quot;http://prabindeka.com/wp-content/uploads/2010/09/Picture-7.png&quot; title=&quot;Picture 7&quot; height=&quot;302&quot; width=&quot;421&quot; alt=&quot;&quot; class=&quot;size-full wp-image-93 alignnone&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 08 Sep 2010 06:55:41 +0000</pubDate>
</item>
<item>
	<title>Michael Long: Design a Media Collection (part 1)</title>
	<guid isPermaLink="false">http://emergentdomain.com/?p=125</guid>
	<link>http://emergentdomain.com/projects/design-a-media-collection-part-1/</link>
	<description>&lt;h3&gt;To give you some context&lt;/h3&gt;
&lt;p&gt;The Northwest lifestyle has found its way into shopping malls by way of Eddie Bauer, and into record stores through the alternative rock scene. Daniel Cardenas of NWLive.TV wants to spread Northwest living through the Internet. With a camera in hand and adventure in his heart, Daniel travels between Portland, Oregon and Vancouver, BC tracking down and documenting Northwest artists and events with the wonderment of a young boy.&lt;/p&gt;
&lt;p&gt;Daniel, on behalf of NWlive, has generated a lot of content over the past year. NWLive needs a flexible yet solid web content delivery platform; one that can grow in-step with the growing body of work.&lt;/p&gt;
&lt;h3&gt;Design for context and the rest will follow&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;This is a media collection, not a web log&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are many ways to display content: Chronologically, frequency of access, the source of the content. There are more ways to display content and its relationships to other content than any one person can imagine. This sentiment also goes for sharing content. The most readily accessible form of content sharing these days is the web log (blog). Blogs are great for journal style publishing whereby an author shares their thoughts, uploads a picture of their cat doing something cute, or posting a recipe for just about anything. Out-of-the-box, most web logs are organized chronologically with the most recent post first: One-dimensional content presentation. What if the content could be provided in multiple-dimensions? In how many other dimensions can we present NWLive’s content? How can we raise the bar and make the NWLive media collection less like a &lt;em&gt;blog&lt;/em&gt;? And finally, how can we improve the discovery and retrieval of content in the media collection? The answer does not reside in the content itself, but in the context and the purpose for its use.&lt;/p&gt;
&lt;p&gt;We can describe the context with the following activities and use cases for the NWLive media collection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An office worker takes a break from the daily grind to watch short, yet entertaining media clips&lt;/li&gt;
&lt;li&gt;An event attendee follows-up a few days later to relive highlights and reflect on their own experiences&lt;/li&gt;
&lt;li&gt;An internet searcher explores a topic of interest and discovers some relevant media clips&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Content Strategy&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;How the media collection will be used and in what context guides the content strategy. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Observing when and how viewers consume the content provides valuable data. NWLive needs qualitative data to know whether the current content strategy aligns with the Northwest lifestyle.&lt;/p&gt;
&lt;p&gt;To help us generate content strategy proposals and in-turn validate those proposals, we look to representatives of NWLive’s target audience: Females in their late twenties to early thirties. While NWLive’s content does not currently reflect the interests of any one gender, focusing on the female gender as a target audience helps to bring a balanced gender perspective by avoiding the male archetype’s penchant for sports, beer, and bikinis. The target age group ensures the audience has the means to travel around the Northwest and participate in leisure activities.&lt;/p&gt;
&lt;p&gt;Usually, one persona will suffice. However, the Northwest lifestyle is quite unique in that there are two hemispheres of experience given the cosmopolitan attitude of major Northwest cities and the natural environment that surrounds these urban centers. In response, we created two personas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Intelligent 30-something&lt;br&gt;&lt;/br&gt;
&lt;em&gt;Natalie H&lt;/em&gt; represents the typical Northwest archetype: outdoorsy, environmentally conscious. Natalie’s primary motivation for exploring the Northwest-centric media collection is to raise her awareness of outdoor activities and community events with an environmental focus.&lt;/li&gt;
&lt;li&gt;Hip 30-something&lt;br&gt;&lt;/br&gt;
&lt;em&gt;Kristen J &lt;/em&gt;is the life of the party with approximately 50% percent of Facebook’s 500 million users as her ‘friends’. Below that party-girl exterior lives a community activist who volunteers at the local youth shelter, providing mentorship to young girls from broken homes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;a href=&quot;http://emergentdomain.com/projects/design-a-media-collection-part-1/attachment/kristenj/&quot; title=&quot;kristenj&quot;&gt;&lt;img src=&quot;http://emergentdomain.com/media/kristenj-150x150.png&quot; title=&quot;kristenj&quot; height=&quot;150&quot; width=&quot;150&quot; alt=&quot;kristenj&quot; class=&quot;attachment-thumbnail&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;a href=&quot;http://emergentdomain.com/projects/design-a-media-collection-part-1/attachment/natalieh/&quot; title=&quot;natalieh&quot;&gt;&lt;img src=&quot;http://emergentdomain.com/media/natalieh-150x150.png&quot; title=&quot;natalieh&quot; height=&quot;150&quot; width=&quot;150&quot; alt=&quot;natalieh&quot; class=&quot;attachment-thumbnail&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;br&gt;&lt;/br&gt;
By focusing on these two primary personas, we have a good grasp of who consumes and shares the content. The next time Daniel chooses a Northwest event or topic to shoot, he can ask himself if Natalie or Kristen will take interest in that content.&lt;/p&gt;
&lt;h3&gt;Design Strategy&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Let the content shine.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Video-based media holds our attention quite well when displayed on the television. The TV screen feeds our eyes and synapses. Television has an advantage: The rectangle is completely filled with images broadcasters and filmmakers want us to see. This experience changes in an interactive context. Not only are our eyes filled with a moving image, our visual field scans across text and controls. When combined, all of these elements call on us to make decisions about what to do and where to go next.&lt;/p&gt;
&lt;p&gt;The design principles for NWLive have to support the viewer’s goals to discover the content they find relevant and quickly retrieve content they want to experience again. In order to get the message across to viewers, NWLive needs a user interface that showcases the content, vs. the work of a web graphic designer. And likewise, viewers need subtle visual cues like tags, descriptions, titles, and media controls in order to support and enhance their interactive experience.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Give the content producer the freedom to change and to iterate on their platform of choice.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Daniel has a brand direction for his media collection. He also has a logo that he commissioned from a talented graphic designer. He uses the logo to brand NWLive videos so that when they are viewed and shared across various channels, people know who produced the content. Daniel isn’t quite sure about how the brand will be expressed in an interactive realm and he’s not even ready to consider this aspect until he sees results about how people are using his collection. Daniel wants the scaffolding so he can figure out the finer details later.&lt;/p&gt;
&lt;h3&gt;Business Strategy&lt;/h3&gt;
&lt;p&gt;Hosting a website comes with a cost. While those costs continue to drop, Daniel has to be able to pay the expenses incurred through owning camera equipment, travel and fuel costs: the normal operating expenses.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Let them see ads.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Most viewers do not mind the presence of ads in their viewing space as long as the ads do not obstruct or obscure the content. Popups, flyouts, and other egregious methods used by advertisers to force their message into a viewers face typically put people off. People will usually appreciate a website that doesn’t bark at them like a rabid car salesman.&lt;/p&gt;
&lt;p&gt;When ads integrate nicely into the user interface they do not obstruct content. Three advertising opportunities for NWLive to leverage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google ads&lt;/li&gt;
&lt;li&gt;In-Player ads&lt;/li&gt;
&lt;li&gt;Partner-based ads&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In part 2, we will generate design solutions and work toward a sustainable technology strategy.&lt;/p&gt;</description>
	<pubDate>Tue, 07 Sep 2010 20:16:58 +0000</pubDate>
</item>
<item>
	<title>Marc McNeill: The tyranny of nice</title>
	<guid isPermaLink="false">http://www.dancingmango.com/blog/?p=1072</guid>
	<link>http://feedproxy.google.com/~r/Dancingmango/~3/evr_Z1BHbm8/</link>
	<description>&lt;p&gt;My first English lesson with Mrs Sullivan aged nine.  She was one of those teachers you remember.  An awesome teacher.&lt;/p&gt;
&lt;p&gt;“&lt;em&gt;Nice&lt;/em&gt;” she told the class, “nice is a word you will not use”.&lt;/p&gt;
&lt;p&gt;The word “nice” was forbidden in her classes.  And woe betide anyone who described their weekend as nice, or their birthday present as nice (probably an Action Man or Scalextrix or if you were really lucky a Raleigh Chopper or Grifter).&lt;/p&gt;
&lt;p&gt;It is a lesson I learned and kept close to my heart today:  Nice is mediocre, saccharine, inoffensive, meaningless, ordinary, without passion, expression or meaning.  “Nice” is a faceless word.  “Nice” is something that the left brain aspires to and the right brain shuns.  Nice is an anathema to the artist, to the designer.  Nice doesn’t provoke, it doesn’t inspire.  Nice is instantly forgettable.&lt;/p&gt;
&lt;p&gt;“Have a nice day”.&lt;/p&gt;
&lt;p&gt;Shit NO! (this deserves swearing – see the passion that Mrs Sullivan infected in me; &lt;em&gt;what a teacher!&lt;/em&gt;) That’s “have an ordinary day”.  It’s not a &lt;em&gt;differentiated&lt;/em&gt; day.  I don’t want to just have a nice day.  I want to have an awesome day, a magical day, a memorable day!!&lt;/p&gt;
&lt;p&gt;And the same with experiences and products.&lt;/p&gt;
&lt;p&gt;Disneyland isn’t nice; it’s memorable and magical (despite the fact that you spend most of your day there queuing).   Do you think that Steve Jobs would be happy if someone called the iPhone ‘nice’?&lt;/p&gt;
&lt;p&gt;Nice is for Microsoft.  It is for engineers to aspire to.  Nice is not art, nice is not design, elegance, simplicity or beauty.  Nice is dull mediocrity.&lt;/p&gt;
&lt;p&gt;And yet nice is something that corporate software doesn’t even begins to strive for. There’s no place for nice in software methodology.  Think Scrum; nice is rarely even a nice to have (it’s gold plating).  Tell me Scrum Masters, in your zeal to deliver “business value”, ship the “minimal viable product”, I bet you’d be happy with what you deliver being considered nice.  F@@k that.  Your projects fester in a world of mediocrity,  in a quagmire of backlog; picking off stuff to do, focussed on features and functions rather than customers goals and a desire to delight.&lt;/p&gt;
&lt;p&gt;Bring it on Mrs Sullivan.  Nice has no place in the English Language.  Bring it on, &lt;a href=&quot;http://www.thoughtworks.com/xd-qtb-uk&quot; target=&quot;_blank&quot;&gt;Agile + Experience Design&lt;/a&gt;.  Nice has no place in software development.&lt;/p&gt;
&lt;p&gt;Can you banish nice from your lexicon; go beyond nice and seek delight?&lt;/p&gt;
&lt;p&gt;I don’t want to have a nice day, I want to have a memorable day.&lt;/p&gt;
&lt;p&gt;I don’t want to have a nice product, I want to have an awesome product.&lt;/p&gt;
&lt;p&gt;I don’t want to have a nice experience.  I want to have a memorable experience.&lt;/p&gt;
&lt;p&gt;…And if I’ve designed an experience and the only word you can use to describe it is ‘nice’ then I consider myself a failure.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.dancingmango.com/blog/wp-content/uploads/2010/09/dumbo.jpg&quot;&gt;&lt;img src=&quot;http://www.dancingmango.com/blog/wp-content/uploads/2010/09/dumbo.jpg&quot; title=&quot;The Dumbo ride at Disneyland; it delights, people will queue up for it, even though there is nothing special about the ride itself.  Carousel rides are nice enough but forgettable, the Dumbo ride is memorable and an experience to enjoy&quot; height=&quot;231&quot; width=&quot;400&quot; alt=&quot;The Dumbo ride at Disneyland; it delights, people will queue up for it, even though there is nothing special about the ride itself.  Carousel rides are nice enough but forgettable, the Dumbo ride is memorable and an experience to enjoy&quot; class=&quot;size-full wp-image-1079 aligncenter&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Dancingmango?a=evr_Z1BHbm8:WhLk2B_rn5c:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Dancingmango?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Dancingmango?a=evr_Z1BHbm8:WhLk2B_rn5c:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Dancingmango?i=evr_Z1BHbm8:WhLk2B_rn5c:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Dancingmango?a=evr_Z1BHbm8:WhLk2B_rn5c:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Dancingmango?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Dancingmango?a=evr_Z1BHbm8:WhLk2B_rn5c:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Dancingmango?i=evr_Z1BHbm8:WhLk2B_rn5c:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Dancingmango?a=evr_Z1BHbm8:WhLk2B_rn5c:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Dancingmango?i=evr_Z1BHbm8:WhLk2B_rn5c:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Dancingmango/~4/evr_Z1BHbm8&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 07 Sep 2010 12:10:42 +0000</pubDate>
</item>
<item>
	<title>Simon Brunning: Links for 2010-09-06 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2010-09-06</guid>
	<link>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/PFmTxm5vnio/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.technologyreview.com/blog/arxiv/25718/?ref=rss&quot;&gt;Physicists Build A Memory That Stores Entanglement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 07 Sep 2010 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Mark Needham: Ruby: Hash ordering</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2896</guid>
	<link>http://feedproxy.google.com/~r/MarkNeedham/~3/jMVsm_wMUbY/</link>
	<description>&lt;p&gt;The application that I'm working on at the moment is deployed into production on JRuby but we also use the C Ruby 1.8.7 interpreter when developing locally since this allows us much quicker feedback.&lt;/p&gt;
&lt;p&gt;As a result we sometimes come across interesting differences in the way that the two runtimes work.&lt;/p&gt;
&lt;p&gt;One that we noticed yesterday is that if you create a hash, the order of the keys in the hash will be preserved when interpreted on JRuby but not with the C Ruby interpreter.&lt;/p&gt;
&lt;p&gt;For example if we create the following hash in Ruby 1.8.7 it will be resorted into alphabetical order:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;text&quot;&gt;ruby-1.8.7 &amp;gt; a_hash = { :a =&amp;gt; 1, :d =&amp;gt; 2, :c =&amp;gt; 3 }
 =&amp;gt; {:a=&amp;gt;1, :c=&amp;gt;3, :d=&amp;gt;2}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Whereas in JRuby it will maintain its order:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;text&quot;&gt;jruby-1.5.1 &amp;gt; a_hash = { :a =&amp;gt; 1, :d =&amp;gt; 2, :c =&amp;gt; 3 }
 =&amp;gt; {:a=&amp;gt;1, :d=&amp;gt;2, :c=&amp;gt;3}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We found &lt;a href=&quot;http://www.ruby-forum.com/topic/153146&quot;&gt;a post on the Ruby mailing list from a couple of years ago&lt;/a&gt; which pointed out that from Ruby 1.9 the order is in fact maintained.&lt;/p&gt;
&lt;p&gt;However, Gregory Seidman also pointed out that…&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Hashes are inherently unordered. Hashes provide amortized O(1) insertion and retrieval of elements by key, and that's it. If you need an ordered set of pairs, use an array of arrays. Yes, this is a pet peeve of mine.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Since that is indeed what we want we've created an array of arrays in our code instead. The code to retrieve values from the array of arrays is a bit more verbose but at least the order is now guaranteed!&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/MarkNeedham/~4/jMVsm_wMUbY&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Tue, 07 Sep 2010 03:52:32 +0000</pubDate>
</item>
<item>
	<title>Nishant Verma: Selecting Test Automation Tool</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5829479533085218307.post-6913691649441948759</guid>
	<link>http://feedproxy.google.com/~r/NishantVerma/~3/K-um2bncSh0/selecting-test-automation-tool.html</link>
	<description>&lt;p align=&quot;justify&quot;&gt;I was reading an interesting discussion on some Testing website (discussion thread) which was about commercial testing tool versus the open source counterparts. &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Just to name a few and revising my own knowledge, some of the prominent software test automation tools are : QTP, LoadRunner, Rational Robot, Silk Performer, TestPartner etc. On the other hand the open source tools are: Selenium, Watir, Sahi, Cucumber,Frankenstein, SoapUI, Watin etc. No offense to the tools which I haven’t mentioned here. :)&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;So when we have such a huge list of test automation tools, the question is how do we decide the test automation tool? It’s a very good question and should be asked always before finalizing the Test Automation plan.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Depending on the project, a good test tool is the one which has:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Support project’s Technical Requirements&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Multiple Environment Support&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Programming language: Easy to learn and use&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Allows Test Data Management&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Easy and structured Reporting Features&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Failure and Error Logging&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Technical Support and available user community &amp;amp; acceptance&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align=&quot;justify&quot;&gt;Re-Usability of components and libraries&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align=&quot;justify&quot;&gt;I am sure there will be many more points to add to the above mentioned list but once there are a set of tools which passes the above mentioned checklist then the only deciding factor would be the “Investment on the Tool”.&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5829479533085218307-6913691649441948759?l=www.nishantverma.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/8Zpu5zxmTpMip6sXPWuwlGnCm6w/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/8Zpu5zxmTpMip6sXPWuwlGnCm6w/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/8Zpu5zxmTpMip6sXPWuwlGnCm6w/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/8Zpu5zxmTpMip6sXPWuwlGnCm6w/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/NishantVerma/~4/K-um2bncSh0&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 06 Sep 2010 15:28:56 +0000</pubDate>
	<author>nishuverma@gmail.com (Nishant Verma)</author>
</item>
<item>
	<title>Philip Calcado: Thoughts on Abstractions: Part 1 – Abstractions Everywhere</title>
	<guid isPermaLink="false">http://fragmental.tw/?p=169</guid>
	<link>http://feedproxy.google.com/~r/fragmental/tw/~3/E-kgc7i7cM8/</link>
	<description>Update: Part II is here.
Most complex tasks are solved using abstractions. To create an abstraction one groups lower-level concepts, what I will call primitives in this text, and make them interact in a pre-defined way.

Abstractions are present at all levels in a system. Computers work based on electric signals. To reduce the Essential Complexity we [...]&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Go to http://fragmental.tw for the full article
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Oh5dPwpZrLYPI5xVNAckMynDq-g/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Oh5dPwpZrLYPI5xVNAckMynDq-g/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/Oh5dPwpZrLYPI5xVNAckMynDq-g/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/Oh5dPwpZrLYPI5xVNAckMynDq-g/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/fragmental/tw/~4/E-kgc7i7cM8&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 06 Sep 2010 11:07:54 +0000</pubDate>
</item>
<item>
	<title>Philip Calcado: Thoughts on Abstractions: Part 2 – Abstractions in Your Domain</title>
	<guid isPermaLink="false">http://fragmental.tw/?p=170</guid>
	<link>http://feedproxy.google.com/~r/fragmental/tw/~3/01Fa91QOkZg/</link>
	<description>As we saw in Part I, abstractions are everywhere. Unfortunately, even though everyone is more than happy to reuse abstractions provided by someone else I often see people failing to identify those in their own code.
Most people tend to create abstractions found using Russ Abbott’s method of using the textual description of a problem to [...]&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Go to http://fragmental.tw for the full article
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/8W_yIBTYBmNa21dsoHuDeCPsyIE/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/8W_yIBTYBmNa21dsoHuDeCPsyIE/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/8W_yIBTYBmNa21dsoHuDeCPsyIE/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/8W_yIBTYBmNa21dsoHuDeCPsyIE/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/fragmental/tw/~4/01Fa91QOkZg&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 06 Sep 2010 11:05:29 +0000</pubDate>
</item>
<item>
	<title>Nishant Verma: Identifying Memory Leakage</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-5829479533085218307.post-234795422110697929</guid>
	<link>http://feedproxy.google.com/~r/NishantVerma/~3/PhGacJKoTgc/identifying-memory-leakage.html</link>
	<description>&lt;p align=&quot;justify&quot;&gt;When I think of Performance Testing, the response time is not the only thing which comes to my mind. Performance Testing should not be done alone to capture the response time.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Based on the nature of application and it’s usage, minimally we should run two types of test. One to find out how many concurrent users the system will support for a given response time.  I have really seen a decline in the need of performing these kinds of test. Application Performance is not always about the response time of web service. As a part of Performance Testing, one should also run Soak Test. Soak tests are long duration tests on the system with a static number of concurrent users that tests the overall robustness of the application. The intention of this test is to identify any performance degradation over time through memory leaks, increased GC or any other problem in the system.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;To get the memory footprints of the application, we need to set up some specific counters in the server where the application is installed. Some of those counters are: Available Mbytes, Virtual Bytes, Private Bytes, # Bytes in all heaps, %Time in GC, Gen 1 Heap Size, Gen 2 Heap Size, Requests/sec. Once we run the test and get all the data, we need to plot the data in a graphic format so that we can find out the pattern and trend.&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;A typical memory usage graph would look like: &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;a href=&quot;http://lh5.ggpht.com/_nvYUg7HAZms/TISpbDwcxGI/AAAAAAAAA0c/fzXdWy6D1GE/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img src=&quot;http://lh6.ggpht.com/_nvYUg7HAZms/TISpcI1ZlNI/AAAAAAAAA0g/G5wIeGHXrow/image_thumb%5B1%5D.png?imgmax=800&quot; style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px;&quot; title=&quot;image&quot; height=&quot;413&quot; width=&quot;1028&quot; alt=&quot;image&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;So if we see the graph above, there is little degradation of memory over the period of 3 hours of test. &lt;em&gt;If there is any significant dip then we need to further break down the test and capture some more counters in order to find out why the memory is degrading.&lt;/em&gt;&lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;Apart from this memory aspect, we also need to find out the windows resource aspect which would typically contain plotting of % Time in GC, Available MBytes, Request/Sec and some more counters depending on the specific needs. &lt;/p&gt;  &lt;p align=&quot;justify&quot;&gt;&lt;strong&gt;&lt;em&gt;To me Performance Testing is more to do with these graphical representation of Application data and System Usage rather than just capturing the Average Response Time. Moreover it’s easy to educate/convince anyone  on the trend and plotting rather than just number.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/5829479533085218307-234795422110697929?l=www.nishantverma.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/9EluH9uxlNHlPemZHO_AUQuycl4/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/9EluH9uxlNHlPemZHO_AUQuycl4/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/9EluH9uxlNHlPemZHO_AUQuycl4/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/9EluH9uxlNHlPemZHO_AUQuycl4/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/NishantVerma/~4/PhGacJKoTgc&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 06 Sep 2010 08:42:25 +0000</pubDate>
	<author>nishuverma@gmail.com (Nishant Verma)</author>
</item>
<item>
	<title>Manish Chakravarty: Setting up a JRuby on Rails 3 + NetBeans dev environment</title>
	<guid isPermaLink="true">http://manish-chaks.livejournal.com/104842.html</guid>
	<link>http://manish-chaks.livejournal.com/104842.html</link>
	<description>Aim: to get a dev environment up and running for what would be a mixed-mode Java/JRuby project using NetBeans as the IDE.&lt;br&gt;&lt;/br&gt;If NetBeans is your IDE of you choice then this blog post should help you out.&lt;br&gt;&lt;/br&gt;I have done these steps using a macbook pro / OSX Leopard with NetBeans 6.9  - steps should be pretty much the same on other platforms.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;==========&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Download JRuby from &lt;a href=&quot;http://jruby.org.s3.amazonaws.com/downloads/1.5.2/jruby-bin-1.5.2.tar.gz&quot;&gt;here&lt;/a&gt; and extract it in a directory of your choice ( I used /Users/manish/Desktop/jruby-1.5.2 for this example )&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Fire up neatbeans &lt;br&gt;&lt;/br&gt;Go to Project - &amp;gt; New Ruby on Rails project.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;We will now attempt to point NetBeans to the latest version of JRuby that we downloaded.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Click on the &quot;Manage&quot; button &lt;br&gt;&lt;/br&gt; &lt;img src=&quot;http://img.skitch.com/20100906-ffbydef4rfnxwcgfwsyc87pcny.jpg&quot; alt=&quot;New Ruby on Rails application - manage the ruby platform&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In the Ruby Platform Manager, browse and point to the &quot;jruby&quot; binary in the &quot;bin&quot; folder : &lt;img src=&quot;http://img.skitch.com/20100906-jckh26n4hqsisf7auh1fs7mr28.jpg&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;We will now attempt to setup the ruby-debugger.&lt;br&gt;&lt;/br&gt;Download the &lt;em&gt;jruby-debug-base&lt;/em&gt; gem from &lt;a href=&quot;http://rubyforge.org/frs/download.php/48904/ruby-debug-base-0.10.3.1-java.gem&quot;&gt;here&lt;/a&gt; and save it. &lt;br&gt;&lt;/br&gt;Install the gem locally.&lt;br&gt;&lt;/br&gt;Here's the command-line trace&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;% ./jruby -S gem install -l ~/Desktop/ruby-debug-base-0.10.3.1-java.gem&lt;br&gt;&lt;/br&gt;Successfully installed ruby-debug-base-0.10.3.1-java&lt;br&gt;&lt;/br&gt;1 gem installed&lt;br&gt;&lt;/br&gt;Installing ri documentation for ruby-debug-base-0.10.3.1-java...&lt;br&gt;&lt;/br&gt;Couldn't find file to include: 'VERSION'&lt;br&gt;&lt;/br&gt;Installing RDoc documentation for ruby-debug-base-0.10.3.1-java...&lt;br&gt;&lt;/br&gt;Couldn't find file to include: 'VERSION'&lt;/blockquote&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Now pull in the &lt;em&gt;ruby-debug-ide&lt;/em&gt; gem&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Here's the command-line trace&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;% ./jruby -S gem install --ignore-dependencies -v 0.4.6 ruby-debug-ide&lt;br&gt;&lt;/br&gt;Successfully installed ruby-debug-ide-0.4.6&lt;br&gt;&lt;/br&gt;1 gem installed&lt;br&gt;&lt;/br&gt;Installing ri documentation for ruby-debug-ide-0.4.6...&lt;br&gt;&lt;/br&gt;Installing RDoc documentation for ruby-debug-ide-0.4.6...&lt;/blockquote&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Switching back to netbeans, give your project and name and choose the correct platform as shown below:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-qep54hu97rqytn6qgqj3wysh4d.jpg&quot; alt=&quot;Choose the correct target platform&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Configure the DB - I would strongly suggest using SQLite or MySQL unless your team has a good reason to use a different database. In the example I have used derby but I &lt;strong&gt;do not&lt;/strong&gt; recommend it.&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-rdsb2g6dknqrrh2at64xpq94ku.jpg&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;We now go to the installing rails page: &lt;br&gt;&lt;/br&gt;We have three action items - I have marked them with blue arrows&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-kp4uhp2ep66qbpyfbhtupy84db.jpg&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Click on the &quot;Install Rails button&quot; - you get the following dialog once it gets done:&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-xn4ggce7qfynsw4rurim1ajcrm.jpg&quot; alt=&quot;Rails installation done&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;After this I also installed Warbler and JRuby openssl.&lt;br&gt;&lt;/br&gt;Hit next and let netbeans complete the project creation. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Now that we have a JRuby on Rails 3 project created on the site, lets find out how to debug this application inside of netbeans.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Firing up the debugger ( Command-F5 ) - Netbeans tells me that it's downloading the glassfish debug gem - I am not sure why this is there - but I let it go ahead nonetheless. &lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-fe2g4q385ij5he41axy32rsj8e.jpg&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Turns out I was wrong - I changed the server preferences to webrick.&lt;br&gt;&lt;/br&gt;Right click on the project name in the left pane , select &quot;properties&quot; and select Webrick server from the drop down as show below:&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-xjbnibrt3ye1f9myh5xebkgq8m.jpg&quot; alt=&quot;Change netbeans server preferences to Webrick&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;You would also need to comment out the entry referencing the sqlite-ruby gem in the Gemfile ( Line #8 ) as show below: &lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-f7h8axb24jem964xh7ukfpkfkj.jpg&quot; alt=&quot;Comment out the need for sqlite3-ruby in the gemfile&quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;We now need the activerecord-jdbcsqlite3-adapter ( we commented out sqlite in the previous step ) &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The command line trace on my system is as follows:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;blockquote&gt;% ./jruby -S gem install activerecord-jdbcsqlite3-adapter&lt;br&gt;&lt;/br&gt;Successfully installed jdbc-sqlite3-3.6.3.054&lt;br&gt;&lt;/br&gt;Successfully installed activerecord-jdbcsqlite3-adapter-0.9.7-java&lt;br&gt;&lt;/br&gt;2 gems installed&lt;br&gt;&lt;/br&gt;Installing ri documentation for jdbc-sqlite3-3.6.3.054...&lt;br&gt;&lt;/br&gt;Installing ri documentation for activerecord-jdbcsqlite3-adapter-0.9.7-java...&lt;br&gt;&lt;/br&gt;Installing RDoc documentation for jdbc-sqlite3-3.6.3.054...&lt;br&gt;&lt;/br&gt;Installing RDoc documentation for activerecord-jdbcsqlite3-adapter-0.9.7-java...&lt;/blockquote&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Hit F6 to run your app and voila! &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://img.skitch.com/20100906-csc251yecgceth47r8nhjj8r9p.jpg&quot; alt=&quot;Safari running JRuby on Rails 3 &quot;&gt;&lt;/img&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;==========&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Further reading:&lt;br&gt;&lt;/br&gt;1. &lt;a href=&quot;http://wiki.netbeans.org/RubyDebugging67#JRuby&quot;&gt;JRuby Debugging&lt;/a&gt;&lt;br&gt;&lt;/br&gt;2. &lt;a href=&quot;http://blog.nicksieger.com/articles/2010/02/24/jruby-and-rails-3-sitting-in-a-tree&quot;&gt;JRuby and Rails 3&lt;/a&gt; ( This information in this link is a bit outdated though )</description>
	<pubDate>Mon, 06 Sep 2010 08:25:14 +0000</pubDate>
</item>
<item>
	<title>Simon Brunning: Links for 2010-09-05 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2010-09-05</guid>
	<link>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/z7RMP6SvDrE/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://radiohead-prague.nataly.fr/Main.html&quot;&gt;Radiohead live in Prague&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lifehacker.com/5619227/keychain-multi+tool-is-eight-handy-pocketable-tools-in-one&quot;&gt;Keychain Multi-tool Is Eight Handy, Pocketable Tools in One&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
Ooh, I so want one of these!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.wired.co.uk/news/archive/2010-08/09/5-things-google-should-change-in-android&quot;&gt;5 things Google still needs to fix in Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Mon, 06 Sep 2010 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Sumeet Moghe: In Defense of Powerpoint</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-8396317.post-1594298680496709365</guid>
	<link>http://feedproxy.google.com/~r/blogspot/sawZ/~3/7k_IALYAdsw/in-defense-of-powerpoint.html</link>
	<description>&lt;center&gt;&lt;/center&gt;
&lt;br&gt;&lt;/br&gt;In the past couple of years that I've had a Mac, a lot of people I've spoken to about presentation skills have remarked to me, &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Oh, but you have Apple Keynote for presentations. It's so much better than Powerpoint.&quot;&lt;/span&gt; At the end of several of my presentations people ask me, &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;You didn't do that in Powerpoint, did you?&quot;&lt;/span&gt;. Whenever I do &lt;a href=&quot;http://www.slideshare.net/sumeet.moghe/tips-for-effective-presentations-4462308&quot;&gt;one of my talks on presentation skills&lt;/a&gt; I invariably have some people in my audience start off the discussion with a &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Powerpoint sucks...&quot;&lt;/span&gt; refrain. And the fact is that I've very loosely used the phrase &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Death by Powerpoint...&quot;&lt;/span&gt; in my conversations and talks. Today, I think it's high time that we give Powerpoint a proper defense. Let me say this -- there's nothing wrong with Powerpoint. It's probably the most versatile presentation tool on the planet and gives us a lot of power. The fact that we misuse it and give it a bad name has nothing to do with the quality of the tool itself. In fact, to rest my case I've gone ahead and &lt;a href=&quot;http://www.slideshare.net/sumeet.moghe/you-can-create-awful-presentations-with-apple-keynote/v1&quot;&gt;created some awful slides using Apple Keynote&lt;/a&gt; and I assure you it took me little effort. I'm pretty sure I can do an awful &lt;a href=&quot;http://www.prezi.com&quot;&gt;Prezi&lt;/a&gt; and do similar stuff with &lt;a href=&quot;http://www.sliderocket.com&quot;&gt;Slide Rocket&lt;/a&gt; and &lt;a href=&quot;http://docs.google.com&quot;&gt;Google Presentations&lt;/a&gt;. Convinced? I thought so!
&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;Now to the skill of making good presentations. I think it's so simple, that anyone can do it.  &lt;a href=&quot;http://blog.duarte.com/2009/11/the-microsoft-office-2010-public-beta-is-available-and-we%E2%80%99re-in-it/&quot;&gt;Nancy Duarte has made that point&lt;/a&gt; with an amazing presentation created solely in Powerpoint (above). In fact I'm going to use three presentations by our &lt;a href=&quot;http://www.learninggeneralist.com/search/label/thoughtworks%20university&quot;&gt;ThoughtWorks University&lt;/a&gt; students to make my point about things that you should absolutely do when you want to create effective presentations. And hopefully then, the tools will cease to matter.
&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;font size=&quot;4&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Think Stories, not Facts&lt;/span&gt;&lt;/font&gt;
&lt;br&gt;&lt;/br&gt;&lt;center&gt;&lt;/center&gt;
&lt;br&gt;&lt;/br&gt;And I'm not talking about stories of the once-upon-a-time variety, though they may be cool too. I'm talking about why anything that you will say means anything to anyone. This is about how can you weave your message into an engaging timeline that captures attention, creates interest and evokes emotion. Last week, I shared with you &lt;a href=&quot;http://www.learninggeneralist.com/2010/09/funniest-pecha-kucha-talk-ever.html&quot;&gt;SG Hill's hilarious Pecha-Kucha talk&lt;/a&gt;. Steve's talk had really simple tips on how to generate traffic for your blog. I could actually summarise the facts in a few lines:
&lt;br&gt;&lt;/br&gt;&lt;ol&gt;&lt;li&gt;Start a blog.&lt;/li&gt;&lt;li&gt;Get an analytics service to track your readership.&lt;/li&gt;&lt;li&gt;Try a snazzy blog title, and creative post headlines.
&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;Have your friends comment liberally.&lt;/li&gt;&lt;li&gt;Mention your blog to your friends.&lt;/li&gt;&lt;li&gt;Provide an RSS feed.&lt;/li&gt;&lt;li&gt;Publicise it on social networks.&lt;/li&gt;&lt;/ol&gt;That's a really simple set of facts. In fact, they're so simple that they don't even need a presentation. I could put all of that into a single slide with bullet points or maybe even email it across. That however, isn't memorable enough and the way Steve wove these pieces of advice into a story of his own experience was funny, engaging and created a lasting impression. If I had to introduce someone to blogging, I'm now going to point them to Steve's video. The point I'm trying to make is that your presentation is more than just the facts that you want to convey. In fact I argue that presentation are more about entertainment and excitement than education. If you can as get people interested and excited about your topic; that's enough to get them to learn about the facts by themselves. In that, it's often more important as to what you don't say than what you do say in your presentation. 
&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;Ditch the Templates&lt;/font&gt;
&lt;br&gt;&lt;/br&gt;&lt;center&gt;&lt;div style=&quot;width: 425px;&quot; id=&quot;__ss_5106769&quot;&gt;&lt;strong style=&quot;margin: 12px 0pt 4px; display: block;&quot;&gt;&lt;/strong&gt;&lt;/div&gt;&lt;/center&gt;
&lt;br&gt;&lt;/br&gt;Most Keynote and Powerpoint templates are really well intentioned. Both Apple and Microsoft however, are trying to satisfy the natural urge of most users and companies - the urge to bullet point. No wonder most templates tend towards a bullet-point layout for their slides. Now of course you don't want to be like the others, do you? I'm sure you want to be different. If you do, you're perhaps on the right track.
&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Be interesting, or be invisible.&quot; &lt;/span&gt;- Andy Sernovitz
&lt;br&gt;&lt;/br&gt;&lt;/div&gt;
&lt;br&gt;&lt;/br&gt;The fact is, that in most cases you don't need a template. You just need a blank slide that you overlay with full-bleed images. Last week Andrew Kiellor did a pretty amazing presentation, giving us a tour of what we should see in Australia. I've embedded the presentation for you to see (above) and you'll notice that Andrew has maintained visual harmony in the top right of his presentation by moving an arrow across Australia's map. In that, it fits with his presentation title; &lt;a href=&quot;http://www.slideshare.net/twuniversity/australia-a-tour&quot;&gt;Australia - A Tour&lt;/a&gt;. By including real, dazzling images of landscapes across Australia, Andrew didn't just have people gasp in the middle of his presentation, he also negated the need for a template.
&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;I'm not saying that you'll never need a template though. There are times when you want to create a strong, visual consistency across your presentation and a template is real handy for doing that. &lt;a href=&quot;http://www.slideshare.net/garr/think-like-designer-1835686&quot;&gt;Garrey Reynolds' presentation on thinking like a designer&lt;/a&gt; is an example of one such situation. In such cases I recommend you create your own templates. And believe me, it isn't rocket science. If you can get smart at using master slides, &lt;a href=&quot;http://www.articulate.com/rapid-elearning/how-to-design-custom-powerpoint-templates-for-e-learning-plus-8-free-templates/&quot;&gt;Tom Kuhlmann can show you just how easy it is&lt;/a&gt;. 
&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;font style=&quot;font-weight: bold;&quot; size=&quot;4&quot;&gt;Meaningful Imagery Counts&lt;/font&gt;
&lt;br&gt;&lt;/br&gt;&lt;center&gt;&lt;div style=&quot;width: 425px;&quot; id=&quot;__ss_4750405&quot;&gt;&lt;strong style=&quot;margin: 12px 0pt 4px; display: block;&quot;&gt;&lt;/strong&gt;&lt;/div&gt;&lt;/center&gt;
&lt;br&gt;&lt;/br&gt;A few weeks back I saw Sam Tardiff do a cool presentation with a provocative title - &lt;a href=&quot;http://www.slideshare.net/twuniversity/17-reasons-why-afls-better-than-your-favourite-sport&quot;&gt;17 Reasons why AFL's better than your favourite sport&lt;/a&gt;. Now Sam's presentation may not be the prettiest presentation on the planet, but he very effectively takes images from real life and puts them in front of the audience to let them see why AFL is a superior sport. I particularly like reason 14 - take a look! There's something about visual evidence that makes messages stick for our audience. It's important to note that where a single image was going to struggle making a point, Sam used a video. In a time when most presentation tools allow unbridled use of media, it's crucial that we exploit it. It's also crucial though, that we maintain relevance. It's easy to go overboard with irrelevant stock imagery and as &lt;a href=&quot;http://martinfowler.com/&quot;&gt;Martin Fowler&lt;/a&gt; often says, &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Stock photos are the bullet points of the 21st century.&quot;&lt;/span&gt; I can't help but agree when I see cheesy, overused stock imagery on slides when an earthy, real life image could have done a world of good. Garrey Reynolds of &lt;a href=&quot;http://www.presentationzen.com&quot;&gt;Presentation Zen fame&lt;/a&gt; has an excellent article on &lt;a href=&quot;http://www.presentationzen.com/presentationzen/2009/08/10-ways-to-use-images-poorly.html&quot;&gt;10 ways you can use images poorly in presentations&lt;/a&gt; - an excellent list of mistakes to avoid. And if you needed some inspiration on how to create beautiful slides you can be proud of, do read my &lt;a href=&quot;http://www.learninggeneralist.com/2010/05/here-are-7-thoughts-for-you-to-whip.html&quot;&gt;7 tips to whip your slides into shape&lt;/a&gt;. &lt;hr&gt;&lt;/hr&gt;I strongly believe that bad presentations have to do more with the presenter than the tool. That said, you need a capable tool to help translate your actions into a show. Powerpoint 2010 (Windows only), is a worthy upgrade and there are &lt;a href=&quot;http://blogs.msdn.com/b/powerpoint/archive/2010/04/20/powerpoint-2010-released-to-manufacturing.aspx&quot;&gt;several good reasons for you to add it to your presentation arsenal&lt;/a&gt;. Sure, there'll be a few tools here and there that have an extra feature or the other, but I guess nothing beats &lt;a href=&quot;http://www.articulate.com/rapid-elearning/powerpoint-for-e-learning/&quot;&gt;Powerpoint's all round capabilities&lt;/a&gt;. And if you needed help on how to effectively use the tool, &lt;a href=&quot;http://www.articulate.com/rapid-elearning/these-powerpoint-experts-can-make-you-a-star/&quot;&gt;you always have experts to reach out to for help&lt;/a&gt;. So the next time you feel like blaming the tool, please don't. Go back to the drawing board and just try harder!
&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Update:&lt;/span&gt;BTW, if you wanted to take your presentation skills to the next level, here's your opportunity to learn from the best. &lt;a href=&quot;http://www.speakingaboutpresenting.com/presentation-skills/outstanding-presentations-workshop/&quot;&gt;Hear live from eight presentation experts without leaving your home&lt;/a&gt; - ain't that amazing?&lt;div class=&quot;blogger-post-footer&quot;&gt;© Sumeet Moghe, 2009&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8396317-1594298680496709365?l=www.learninggeneralist.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=7k_IALYAdsw:usWy8oueyDo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=7k_IALYAdsw:usWy8oueyDo:-BTjWOF_DHI&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=7k_IALYAdsw:usWy8oueyDo:-BTjWOF_DHI&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=7k_IALYAdsw:usWy8oueyDo:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=7k_IALYAdsw:usWy8oueyDo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=7k_IALYAdsw:usWy8oueyDo:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=7k_IALYAdsw:usWy8oueyDo:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=7k_IALYAdsw:usWy8oueyDo:YwkR-u9nhCs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=YwkR-u9nhCs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=7k_IALYAdsw:usWy8oueyDo:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=7k_IALYAdsw:usWy8oueyDo:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/sawZ/~4/7k_IALYAdsw&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 06 Sep 2010 04:06:13 +0000</pubDate>
	<author>noreply@blogger.com (Sumeet Moghe)</author>
</item>
<item>
	<title>Michael Long: Prototype Two</title>
	<guid isPermaLink="false">http://diary.figlang.com/?p=40</guid>
	<link>http://emergentdomain.com/projects/fig-prototype-two/</link>
	<description>&lt;p&gt;Fig’s guiding design principles are still in play: let the content shine by keeping the user interface elements to a minimum; provide guidance and error feedback in a friendly and non-invasive manner.&lt;/p&gt;
&lt;p&gt;This second prototype features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Branding by way of a snazzy logo. The font face is Georgia (bold, italic) and the texture is actually an illustration of leaves.&lt;/li&gt;
&lt;li&gt;Fast and simple account creation so anyone can start contributing&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;And a couple of new phrases in Russian and Chinese&lt;/li&gt;
&lt;/ul&gt;

&lt;a href=&quot;http://emergentdomain.com/projects/fig-prototype-two/attachment/tree_leaves/&quot; title=&quot;Leaves&quot;&gt;&lt;img src=&quot;http://emergentdomain.com/media/tree_leaves-150x150.jpg&quot; title=&quot;Leaves&quot; height=&quot;150&quot; width=&quot;150&quot; alt=&quot;Leaves: Texture for Fig logo&quot; class=&quot;attachment-thumbnail&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;a href=&quot;http://emergentdomain.com/projects/fig-prototype-two/attachment/logo/&quot; title=&quot;Fig Logo&quot;&gt;&lt;img src=&quot;http://emergentdomain.com/media/logo-150x94.png&quot; title=&quot;Fig Logo&quot; height=&quot;94&quot; width=&quot;150&quot; alt=&quot;Fig Logo&quot; class=&quot;attachment-thumbnail&quot;&gt;&lt;/img&gt;&lt;/a&gt;

&lt;p&gt;The next prototype will introduce some security and personalization by associating a phrase to the contributor that created it and hopefully the ability to attach and playback audio clips so people can learn pronunciations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://figlang.com/figs&quot; title=&quot;Working prototype&quot;&gt;Play with the prototype »&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 06 Sep 2010 02:22:55 +0000</pubDate>
</item>
<item>
	<title>Philip Calcado: ThoughtWorks Sydney Open Geek Night this Wednesday!</title>
	<guid isPermaLink="false">http://fragmental.tw/?p=171</guid>
	<link>http://feedproxy.google.com/~r/fragmental/tw/~3/1ProV9DsDek/</link>
	<description>Giles says:

A Talk on Seph
ThoughtWorks‘ resident language inventor Ola Bini will be visiting Sydney in September. Ola is one of the four committers on the JRuby project (now the fastest Ruby runtime) and the inventor of the highly experimental prototype-based language Ioke. And we’ve convinced him to give a talk about his latest language project [...]&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Go to http://fragmental.tw for the full article
&lt;p&gt;&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/FRmw1acpTpw-FqMmD4YI6L_rFBw/0/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/FRmw1acpTpw-FqMmD4YI6L_rFBw/0/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
&lt;a href=&quot;http://feedads.g.doubleclick.net/~a/FRmw1acpTpw-FqMmD4YI6L_rFBw/1/da&quot;&gt;&lt;img src=&quot;http://feedads.g.doubleclick.net/~a/FRmw1acpTpw-FqMmD4YI6L_rFBw/1/di&quot; border=&quot;0&quot; ismap=&quot;true&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/fragmental/tw/~4/1ProV9DsDek&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Mon, 06 Sep 2010 02:12:09 +0000</pubDate>
</item>
<item>
	<title>Mark Needham: Flow in software teams</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2892</guid>
	<link>http://feedproxy.google.com/~r/MarkNeedham/~3/KYDkKsQz7Zg/</link>
	<description>&lt;p&gt;My former colleague Greg Gigon has written an interesting blog post where he talks about &lt;a href=&quot;http://blog.gigoo.org/2010/08/18/agile-multitasking-context-switching/&quot;&gt;the pain that we cause ourselves by multi-tasking&lt;/a&gt;, a point which &lt;a href=&quot;http://theoryofconstraints.blogspot.com/2007/07/multi-tasking-why-projects-take-so-long.html&quot;&gt;Kevin Fox also makes on the Theory of Constraints blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think the overall point that he makes is very true:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
We can switch our attention quickly from one task to another. But … is it good for our brain? Is it good for the work we are doing? Are we really more productive?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I've often found that when I try and switch between multiple different tasks I end up finishing none of them and it's certainly true that twitter, facebook and emails can be amazingly distracting. &lt;/p&gt;
&lt;p&gt;Hopefully those types of distractions are less of an issue when working on a software development team, particularly if the team are pair programming.&lt;/p&gt;
&lt;h3&gt;Project influenced context switching&lt;/h3&gt;
&lt;p&gt;While I agree with Greg that it's good to try and make sure that we're only working on one task at a time, I think that to an extent there is always going to be some context switching involved if we have a group of people working together.&lt;/p&gt;
&lt;p&gt;Greg touches on this briefly in his post: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
When we are in a despair and need answers we are not worrying about anyone else. The goal is to ask or tell to achieve whatever we are after. We are not taking into consideration that we might be disturbing someone else Flow.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;To me it seems that focusing on the flow of an individual individual/pair is a bit of a local optimisation when we're talking about software teams.&lt;/p&gt;
&lt;p&gt;For example if a pair are working on a piece of functionality orthogonal to what another pair are working on then should they interrupt that pair if they need to talk about something?&lt;/p&gt;
&lt;p&gt;Interrupting them possible would break their 'flow' but it might give one or both pairs an insight into the problem which they wouldn't have otherwise had. &lt;/p&gt;
&lt;p&gt;From my experience pairs interrupting each other often helps reduce the amount of time that we spend building the wrong thing. &lt;/p&gt;
&lt;p&gt;An alternative way to still gain this knowledge without interrupting people straight away would be to delay the conversation until a later time but perhaps the best moment for gaining that knowledge has now gone?&lt;/p&gt;
&lt;h3&gt;Counter productive context switching&lt;/h3&gt;
&lt;p&gt;The only time when interrupting a pair does seem counter productive is if you're doing so to ask a question whose answer could easily be found out with a quick bit of Googling.&lt;/p&gt;
&lt;p&gt;In that case I completely agree with Greg that we should first think about the impact our interruption will have on our colleagues.&lt;/p&gt;
&lt;h3&gt;Overall&lt;/h3&gt;
&lt;p&gt;The topic of flow/context switching is an interesting one but I think we need to be careful about having it as our main goal on software delivery teams.&lt;/p&gt;
&lt;p&gt;I wrote about &lt;a href=&quot;http://www.markhneedham.com/blog/2008/10/17/pair-programming-pair-flow/&quot;&gt;pair flow&lt;/a&gt; a while ago where I described some ways to achieve more 'flow' within a pair but my current line of thinking is that we'll still have some interruption between pairs and that's not necessarily a bad thing.&lt;/p&gt;
&lt;h4&gt;An approach to ponder…&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/mikewagg&quot;&gt;Mike Wagg&lt;/a&gt; once suggested that pairs should work in 25 minute pomodoros and only be interruptible when they're on a break from one.&lt;/p&gt;
&lt;p&gt;This seems like an interesting idea but communication would end up being much more structured/time boxed/weird?!&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/MarkNeedham/~4/KYDkKsQz7Zg&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Sun, 05 Sep 2010 17:34:17 +0000</pubDate>
</item>
<item>
	<title>Mark Needham: Design Simplicity: Partially updating an object</title>
	<guid isPermaLink="false">http://www.markhneedham.com/blog/?p=2887</guid>
	<link>http://feedproxy.google.com/~r/MarkNeedham/~3/7opksSeYFoo/</link>
	<description>&lt;p&gt;One of the most common discussions that I have with my colleagues is around designing bits of code in the simplest way possible.&lt;/p&gt;
&lt;p&gt;I've never quite been able to put my finger on exactly what makes a design simple and there is frequently disagreement about what is even considered simple.&lt;/p&gt;
&lt;p&gt;On the last project I worked on we had an interesting problem where we wanted to partially update different parts of an object from different pages of the application.&lt;/p&gt;
&lt;div style=&quot;float: right;&quot;&gt;
&lt;img src=&quot;http://www.markhneedham.com/blog/wp-content/uploads/2010/08/design-simplicity.jpg&quot; alt=&quot;design-simplicity.jpg&quot; height=&quot;334&quot; border=&quot;0&quot; width=&quot;457&quot;&gt;&lt;/img&gt;
&lt;/div&gt;
&lt;p&gt;We had access to the id of the object from the URL so my initial thought was that when we submitted each page we could load the full object from the database and update it with the values that had just been submitted from that page.&lt;/p&gt;
&lt;p&gt;The problem with that solution was that it meant we needed to make another database call without any real benefit from doing so.&lt;/p&gt;
&lt;p&gt;We had already created objects representing the data submitted from these pages so &lt;a href=&quot;http://twitter.com/christianralph&quot;&gt;Christian&lt;/a&gt; suggested that an alternative approach would be to create NHibernate mappings for those objects instead so that we could just map the updated values straight to the database.&lt;/p&gt;
&lt;p&gt;We had bit of duplication in our objects as we had one object representing every bit of data the user had provided so far and then two smaller objects just representing the data provided for each of the pages.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;csharp&quot;&gt;&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;class&lt;/span&gt; TheObject
&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt;
	&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;string&lt;/span&gt; Page1Property &lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt; get&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; set&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;
	&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;string&lt;/span&gt; Page2Property &lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt; get&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; set&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;csharp&quot;&gt;&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;class&lt;/span&gt; PartialObject1
&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt;
	&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;string&lt;/span&gt; Page1Property &lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt; get&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; set&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;csharp&quot;&gt;&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;class&lt;/span&gt; PartialObject2
&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt;
	&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;string&lt;/span&gt; Page2Property &lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt; get&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; set&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We then created NHibernate mappings for each of those objects:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;csharp&quot;&gt;&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;class&lt;/span&gt; TheObjectMapping &lt;span style=&quot;color: #008000;&quot;&gt;:&lt;/span&gt; ClassMap&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;&lt;/span&gt;TheObject&lt;span style=&quot;color: #008000;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt;
	Map&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;x &lt;span style=&quot;color: #008000;&quot;&gt;=&amp;gt;&lt;/span&gt; x.&lt;span style=&quot;color: #0000FF;&quot;&gt;Page1Property&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt;
	Map&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;x &lt;span style=&quot;color: #008000;&quot;&gt;=&amp;gt;&lt;/span&gt; x.&lt;span style=&quot;color: #0000FF;&quot;&gt;Page2Property&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;csharp&quot;&gt;&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;class&lt;/span&gt; PartialObject1Mapping &lt;span style=&quot;color: #008000;&quot;&gt;:&lt;/span&gt; ClassMap&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;&lt;/span&gt;PartialObject1&lt;span style=&quot;color: #008000;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt;
	Map&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;x &lt;span style=&quot;color: #008000;&quot;&gt;=&amp;gt;&lt;/span&gt; x.&lt;span style=&quot;color: #0000FF;&quot;&gt;Page1Property&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre style=&quot;font-family: monospace;&quot; class=&quot;csharp&quot;&gt;&lt;span style=&quot;color: #0600FF;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;class&lt;/span&gt; PartialObject2Mapping &lt;span style=&quot;color: #008000;&quot;&gt;:&lt;/span&gt; ClassMap&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;&lt;/span&gt;PartialObject2&lt;span style=&quot;color: #008000;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;{&lt;/span&gt;
	Map&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;x &lt;span style=&quot;color: #008000;&quot;&gt;=&amp;gt;&lt;/span&gt; x.&lt;span style=&quot;color: #0000FF;&quot;&gt;Page2Property&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When loading the object from the database onto the page we used 'TheObject' and its associated mappings and when updating the object from the individual pages we could use the partial object mappings.&lt;/p&gt;
&lt;p&gt;I think this was quite a neat approach as it allowed us to reduce the complexity of our controller code when updating an object as well as removing the need for one trip to the database.&lt;/p&gt;
&lt;p&gt;The trade off was that we ended up writing more mapping code but that seemed to be a reasonable trade off to make.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/MarkNeedham/~4/7opksSeYFoo&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Sun, 05 Sep 2010 17:32:00 +0000</pubDate>
</item>
<item>
	<title>Jonathan McCracken: ASP.NET MVC in 4 minutes!</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-2580952471083668495.post-996518839246479323</guid>
	<link>http://feedproxy.google.com/~r/MyIdeationHasFoundAHome/~3/aDKIkuAFB-M/aspnet-mvc-in-4-minutes.html</link>
	<description>I just published a short 4 minute video on how to build an ASP.NET MVC project. It walks you though the absolute basics of MVC. You can take a look below or visit YouTube here.

&lt;img src=&quot;http://feeds.feedburner.com/~r/MyIdeationHasFoundAHome/~4/aDKIkuAFB-M&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Sun, 05 Sep 2010 15:13:57 +0000</pubDate>
	<author>jonathan.mccracken@gmail.com (Jonathan McCracken)</author>
</item>
<item>
	<title>Thomas Czarniecki: StringTemplate views for Spring</title>
	<guid isPermaLink="false">http://watchitlater.com/blog/?p=226</guid>
	<link>http://watchitlater.com/blog/2010/09/stringtemplate-views-for-spring/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.stringtemplate.org/&quot;&gt;StringTemplate&lt;/a&gt; is a great templating engine. It’s powerful, simple and quite opinionated. I’ve come really appreciate its simple purpose: render data. No assignment, no arbitrary method invocation. It is not Turing-complete and it would make a lousy rules engine.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.opensymphony.com/sitemesh/&quot;&gt;SiteMesh&lt;/a&gt; is a web-page layout and decoration framework that is my current “golden hammer” when I need to provide a consistent layout across a java web-application. It seems to fit with the way that I think about web pages a whole lot more than something like Tiles – I really prefer decoration over composition as a means of layout control.&lt;/p&gt;
&lt;p&gt;I’ve used StringTemplate it in the past on java projects and for a while have wanted to create a way to integrate it with Spring Framework’s MVC so I can stop using Freemarker and Velocity in Spring-heavy projects. Not that Freemarker is that bad, it’s just that I really don’t need or want all of the bells and whistles that come with it and allow it to be so frequently misused. All I really want is a templating engine that renders the model and does not get in my way. It just so happens that SiteMesh also makes an appearance on these projects and I’ve been wanting to use StringTemplate to provide layout decorators as well as Spring views.&lt;/p&gt;
&lt;p&gt;Today I’ve released version 1.0 of my &lt;a href=&quot;http://github.com/tomcz/spring-stringtemplate&quot;&gt;spring-stringtemplate&lt;/a&gt; integration library as a GitHub project. It provides an implementation of a Spring MVC View and ViewResolver for StringTemplate, and a decorator servlet for SiteMesh.&lt;/p&gt;
&lt;p&gt;Feedback is always welcome.&lt;/p&gt;</description>
	<pubDate>Sun, 05 Sep 2010 07:27:02 +0000</pubDate>
</item>
<item>
	<title>Simon Brunning: Links for 2010-09-04 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2010-09-04</guid>
	<link>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/qXTxx8WGUSY/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.guardian.co.uk/science/life-and-physics/2010/aug/21/susy-supersymmetry-higgs-boson&quot;&gt;SUSY: The Higgs boson's flexible friend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dailygalaxy.com/my_weblog/2010/09/cosmic-ghost-discovered-evidence-of-a-supermassive-black-hole-equal-in-power-to-a-billion-supernovas.html&quot;&gt;Cosmic 'Ghost': Evidence of a supermassive black hole equal in power to a billion supernovas.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.discovermagazine.com/sciencenotfiction/2010/08/31/is-ai-more-common-than-biological-intelligence-across-the-universe/&quot;&gt;Is AI More Common Than Biological Intelligence Across the Universe?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Sun, 05 Sep 2010 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Jason Yip: Andrew Walker's Kanban journey</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-7807708.post-1370193908281996574</guid>
	<link>http://feedproxy.google.com/~r/YoudThinkWithAllMy/~3/g5vczMmkMBs/andrew-walkers-kanban-journey.html</link>
	<description>Andrew Walker just told me that he started a blog about his team trying Kanban, partly inspired by the &lt;a href=&quot;http://jchyip.blogspot.com/2010/08/agile-sydney-version-stop-starting-and.html&quot;&gt;talk I gave at Agile Sydney&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
Check out &lt;a href=&quot;http://www.kanbanchronicle.com/&quot;&gt;Kanban Chronicle: Insights Into Our Kanban Journey&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/7807708-1370193908281996574?l=jchyip.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=g5vczMmkMBs:wQqFjNIgTTs:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=g5vczMmkMBs:wQqFjNIgTTs:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?a=g5vczMmkMBs:wQqFjNIgTTs:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/YoudThinkWithAllMy?i=g5vczMmkMBs:wQqFjNIgTTs:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/YoudThinkWithAllMy/~4/g5vczMmkMBs&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Sat, 04 Sep 2010 09:05:14 +0000</pubDate>
	<author>noreply@blogger.com (Jason Yip)</author>
</item>
<item>
	<title>Simon Brunning: Links for 2010-09-03 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2010-09-03</guid>
	<link>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/t2e6WNfBNzQ/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://lifehacker.com/5628369/use-technicians-codes-to-diagnose-your-android-phone&quot;&gt;Use Technician's Codes to Diagnose Your Android Phone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://android-developers.blogspot.com/2010/09/brace-for-future.html&quot;&gt;Android Developers: Brace for the Future&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://newsarse.com/2010/08/31/cricket-to-remain-dull-despite-betting-scandal-insists-icc/&quot;&gt;Cricket to remain dull despite betting scandal, insists ICC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://newsarse.com/2010/09/02/william-hague-is-definitely-not-one-of-ours-insist-furious-gay-community/&quot;&gt;William Hague is definitely not one of ours, insist furious gay community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.github.com/sitaramc/gitolite/&quot;&gt;GitHub&lt;/a&gt;&lt;br&gt;&lt;/br&gt;
&quot;Gitolite allows you to host Git repositories easily and securely.&quot;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Sat, 04 Sep 2010 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Sumeet Moghe: Dev Camp Bangalore 3 is today - Hope to see you there</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-8396317.post-6515148131114746370</guid>
	<link>http://feedproxy.google.com/~r/blogspot/sawZ/~3/RHOup64M_cg/dev-camp-bangalore-3-is-today-hope-to.html</link>
	<description>&lt;a href=&quot;http://devcamp.in/index.php/Bangalore&quot;&gt;DevCamp Bangalore 3&lt;/a&gt; is happening at &lt;a href=&quot;http://www.thoughtworks.com/&quot;&gt;ThoughtWorks&lt;/a&gt;'s &lt;a href=&quot;http://is.gd/ejWkd&quot;&gt;Diamond District office at Bangalore&lt;/a&gt; today.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-size: 130%;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Registration&lt;/span&gt; &lt;/span&gt;&lt;br&gt;&lt;/br&gt;Like any BarCamp, &lt;a href=&quot;http://devcamp.in/index.php/Bangalore/2010/Registrations&quot;&gt;registration&lt;/a&gt; is on the wiki and there is no registration fee.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;DevCamp is an un-conference by the hackers, for the hackers and of the hackers. It's a species of BarCamp where anything a lover of computers and technology would consider important or entertaining goes. The first DevCamp took place a little over two years ago, and we've always had a lot of fun being a part of this event; we're hoping to keep that trend going with DCB3.&lt;span style=&quot;font-weight: bold; font-size: 130%;&quot;&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;What's in store?&lt;/span&gt;&lt;br&gt;&lt;/br&gt;DCB3 is going to be packed with informative &lt;span style=&quot;font-weight: bold;&quot;&gt;presentations, Fishbowl sessions, lightning talks&lt;/span&gt;, and much more, so don't miss it!&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-size: 100%;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Interested in doing a session?&lt;/span&gt; &lt;/span&gt;&lt;br&gt;&lt;/br&gt;Please keep in mind the fact that everyone at DevCamp is a hacker, a pro. Assume a high level of exposure and knowledge on the part of your audience, and tailor your sessions accordingly. Avoid 'Hello World' and how-to sessions which can be easily found on the net. First hand war stories, in-depth analyses of topics, and live demos are best.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Add your abstract/presentation topic &lt;a href=&quot;http://devcamp.in/index.php/Bangalore/2010/Proposals&quot;&gt;here&lt;/a&gt;. Don't forget to sign up, and do pass the message along to anyone you think would be interested. Hope to see you there!&lt;div class=&quot;blogger-post-footer&quot;&gt;© Sumeet Moghe, 2009&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8396317-6515148131114746370?l=www.learninggeneralist.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=RHOup64M_cg:Q6jNl2PvSow:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=RHOup64M_cg:Q6jNl2PvSow:-BTjWOF_DHI&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=RHOup64M_cg:Q6jNl2PvSow:-BTjWOF_DHI&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=RHOup64M_cg:Q6jNl2PvSow:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=RHOup64M_cg:Q6jNl2PvSow:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=RHOup64M_cg:Q6jNl2PvSow:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=RHOup64M_cg:Q6jNl2PvSow:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=RHOup64M_cg:Q6jNl2PvSow:YwkR-u9nhCs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=YwkR-u9nhCs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=RHOup64M_cg:Q6jNl2PvSow:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=RHOup64M_cg:Q6jNl2PvSow:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/sawZ/~4/RHOup64M_cg&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Sat, 04 Sep 2010 02:16:55 +0000</pubDate>
	<author>noreply@blogger.com (Sumeet Moghe)</author>
</item>
<item>
	<title>Jie Xiong: 贪婪与恐惧</title>
	<guid isPermaLink="false">tag:gigix.thoughtworkers.org,2010-09-03:1179</guid>
	<link>http://gigix.thoughtworkers.org/2010/9/3/greed-and-dread</link>
	<description>&lt;p&gt;有个小姑娘对我说：“我们真的很想用TDD的方式来开发，可是我们的基础太差了，我们真的能做到那样吗？”&lt;/p&gt;


	&lt;p&gt;人性的两大弱点：贪婪，和恐惧。亲眼看到了美好的可能性，于是迫不及待想要得到它，是为贪婪。一旦理想与现实抵牾，马上开始担心是否天堂遥不可及，在忧心忡忡中停止了前进，是为恐惧。&lt;/p&gt;


	&lt;p&gt;不要贪婪。静下心来把远景细化成一个个可以实施的细小改进，把一件件小事落实做好。不要恐惧。不要停下自我改善与帮助别人的步伐，在看不到山顶的时候也不要踯躅不前。每天向上走一点，也许到不了天堂，一定会比现在好很多。&lt;/p&gt;


	&lt;p&gt;（与WJ共勉）&lt;/p&gt;</description>
	<pubDate>Fri, 03 Sep 2010 14:21:41 +0000</pubDate>
</item>
<item>
	<title>Martin Fowler: Rehabbing my website</title>
	<guid isPermaLink="false">tag:martinfowler.com,2010-09-03:Rehabbing-my-website</guid>
	<link>http://martinfowler.com/snips/201009030955.html</link>
	<description>&lt;p&gt;I started martinfowler.com back in 2000, now its grown to around 3.5 million words in 500 pages, getting about 200,000 page views a month. One problem with the site is that it looks retro even for 2000 and seriously needs some cosmetic surgery. Another is that it’s not easy to browse to find useful articles.&lt;/p&gt;

&lt;p&gt;So now the dsl book (which weighs in at 1.2 million words) is pretty much done with, I need to give martinfowler.com some love in these (and some other) departments. So I’m currently working on a nicer look for the website. I’ve also decided to write a series of “guide pages” - these are pages devoted to a single topic (such as agile software development) that highlight which pages on my website are likely to be useful on that topic.&lt;/p&gt;

&lt;p&gt;I have these mocked up now to a point where I’m reasonably happy with them. Now the task is to apply these changes to the current website. My task is eased to some degree by the fact that all the HTML pages are generated from XML sources, but even so it will take some time to ensure everything looks reasonable. I also have a lot of travels coming up in the next few months, so I’m not predicting any delivery dates.&lt;/p&gt;</description>
	<pubDate>Fri, 03 Sep 2010 13:55:00 +0000</pubDate>
</item>
<item>
	<title>Kailuo Wang: Short update about Photography Assistant Beta</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-15558048.post-1417610530764978092</guid>
	<link>http://kailuowang.blogspot.com/2010/09/short-update-about-photography.html</link>
	<description>So far the feedbacks I got from users are pretty good. No major defects found. I did some testing myself, and I love the DoF calculator! (with manual exposure setting :)&lt;br&gt;&lt;/br&gt;It's going to be a hectic month Sept for me. I wouldn't expect new features any time soon ( I might release 1.5 with some minor fixes ). But the I already decided what to add the next release - Photography Log, which will allow you to record all exposure setting (iso, shutter speed, aperture, subject distance, GPS location and even an optional cell phone camera pic of the motif) in your log. I would hope that this will be helpful mostly for film photography beginners. The GPS location might be helpful for most digital photographers too.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/15558048-1417610530764978092?l=kailuowang.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 03 Sep 2010 13:05:00 +0000</pubDate>
	<author>noreply@blogger.com (Kailuo Wang)</author>
</item>
<item>
	<title>Daniel Wildt: DanielWildt</title>
	<guid isPermaLink="false">http://danielwildt.wordpress.com/?p=124</guid>
	<link>http://danielwildt.wordpress.com/2010/09/03/en-what-would-you-do-to-change-someone-elses-world-for-better-inspiration-and-effect/</link>
	<description>&lt;p&gt;Sometimes I see people saying that they don’t need to do anything to improve the world they live in, since they do their part, paying taxes. Some believe that government needs to take action.   &lt;/p&gt;
&lt;p&gt;I have another opinion about it, and as far as I know, lots of people have another opinion too.  &lt;/p&gt;
&lt;p&gt;In summary: &lt;strong&gt;What we have in place, it’s not enough. Waiting on government, will not help at all. We need action. We need to help people to take action. &lt;a href=&quot;http://en.wikipedia.org/wiki/Diy&quot;&gt;Let’s do it ourselves&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The thing is: people develop ways to do good to their communities, and therefore to their cities, countries and bingo, world! &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But how? Is there a ticket to buy somewhere?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Do we need something huge like a “&lt;a href=&quot;http://en.wikipedia.org/wiki/Live_Aid&quot;&gt;live aid&lt;/a&gt;“?&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;Do we need a disaster to happen, to start looking for these things? &lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;Do I need to wait for &lt;a href=&quot;http://en.wikipedia.org/wiki/World_Social_Forum&quot;&gt;World Social Forum&lt;/a&gt; to come to my country?&lt;/p&gt;
&lt;p&gt;No… &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, give one example of movement to help and/or follow!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Looking at software development world, we have &lt;a href=&quot;http://en.wikipedia.org/wiki/Open_source&quot;&gt;opensource software&lt;/a&gt;, a &lt;a href=&quot;http://en.wikipedia.org/wiki/History_of_free_and_open_source_software&quot;&gt;movement&lt;/a&gt; that creates an environment for knowledge sharing. An environment that helps people all around the world to build better software, and have access to computer software with less costs. &lt;/p&gt;
&lt;p&gt;With these things, other people can do good to their communities. That’s good.  &lt;/p&gt;
&lt;p&gt;That’s a way to help changing someone else’s world. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But, let’s take a look at “a thing” that is universal… music&lt;/strong&gt;! &lt;/p&gt;
&lt;p&gt;I’m gonna use as an example, &lt;a href=&quot;http://www.playingforchange.com/journey/introduction&quot;&gt;Playing for Change&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Here’s a message: &lt;em&gt;no matter who you are, no matter where you go in your life, at some point, you gonna need somebody to stand by you&lt;/em&gt;. Check this:&lt;br&gt;&lt;/br&gt;
&lt;span style=&quot;text-align: center; display: block;&quot;&gt;&lt;a href=&quot;http://danielwildt.wordpress.com/2010/09/03/en-what-would-you-do-to-change-someone-elses-world-for-better-inspiration-and-effect/&quot;&gt;&lt;img src=&quot;http://img.youtube.com/vi/Us-TVg40ExM/2.jpg&quot; alt=&quot;&quot;&gt;&lt;/img&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;That turned out to become a movement all around the world, called &lt;a href=&quot;http://www.playingforchange.com/journey/introduction&quot;&gt;playing for change&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;But, how that’s relate to software world?&lt;/p&gt;
&lt;p&gt;They did something and later on they realize that it was big and could become a movement to help people to help people. Musicians could make this happen. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So… we need to understand how to make a movement? &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe… check this &lt;a href=&quot;http://blog.ted.com/2010/04/how_to_start_a.php&quot;&gt;TED.com talk about how to start a movement&lt;/a&gt;. &lt;/p&gt;
&lt;div align=&quot;center&quot;&gt; &lt;/div&gt;
&lt;p&gt;So this is all about following someone and help the movement to grow. Some movement you believe and want to help. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here I go then. Follow me.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well, every time I do an event related to technology, where I get a lot of people together, I do some action for those who need help, with donation of food or clothing. &lt;/p&gt;
&lt;p&gt;It’s like a “&lt;strong&gt;presenting for change&lt;/strong&gt;“, where you have people doing what they love to do, presenting technology, running coding dojos, but with a social action together with it. It is a simple way to continue being who you are, and doing what you do, but getting different results from your actions. &lt;/p&gt;
&lt;p&gt;If you are working close to a technology users group (take &lt;a href=&quot;http://java.sun.com/community/usergroups/&quot;&gt;Java&lt;/a&gt; or &lt;a href=&quot;http://www.ruby-lang.org/en/community/user-groups/&quot;&gt;Ruby&lt;/a&gt; or &lt;a href=&quot;http://www.agilealliance.org/show/1641&quot;&gt;Agile&lt;/a&gt; for instance), you can do that.&lt;br&gt;&lt;/br&gt;
If you are doing an event, you can add some kind of donation to an entity that needs help in your event schedule. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, all my events will have an entry pass, a donation?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well, if it is a donation, you can’t make it mandatory. But, you can ask people to bring donations! They have a choice. Give them a choice. They will bring donations, if they want to!   &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, bottom line is?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Look around and you will see that a lot of people need help. Check for &lt;em&gt;nongovernmental organizations&lt;/em&gt; that need help. You will not be able to help them all. Help some of them, check for local needs, ask for help to understand and find organizations that need more help. And help them. With the help of your community. You will find people willing to help. Go for it. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let’s Help It!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This post was first wrote in May 17th of 2010. It was on my draft since today. Since then I was searching for a way to help this new movement to happen. And here we go again. &lt;a href=&quot;http://letshelpit.heroku.com/about&quot;&gt;Let’s Help It&lt;/a&gt;! It is an &lt;a href=&quot;http://github.com/thoughtworks/letshelp.it&quot;&gt;open source software&lt;/a&gt; deployed in a &lt;a href=&quot;http://about.heroku.com/&quot;&gt;free cloud environment&lt;/a&gt;, where you can add organizations near you. Therefore other people looking for organizations where they live, can look at that. &lt;/p&gt;
&lt;p&gt;It took less than a month to build the first release of the software (from Aug 8th to Aug 31st), following Engineering practices from &lt;a href=&quot;http://en.wikipedia.org/wiki/Agile_software_development&quot;&gt;Agile Software Development Methodologies&lt;/a&gt;, with free time from a team of great developers, &lt;a href=&quot;http://github.com/thoughtworks/letshelp.it/graphs/impact&quot;&gt;people I respect a lot&lt;/a&gt;. Thanks a lot to all people who made it happen and will continue. And if you want to make it happen too, help us to improve the software! &lt;a href=&quot;http://letshelp.it&quot;&gt;Get in touch and play with us&lt;/a&gt;! &lt;/p&gt;
&lt;br&gt;&lt;/br&gt; Tagged: &lt;a href=&quot;http://danielwildt.wordpress.com/tag/cloud/&quot;&gt;cloud&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/community/&quot;&gt;community&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/do-it-yourself/&quot;&gt;do it yourself&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/donation/&quot;&gt;donation&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/motivation/&quot;&gt;motivation&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/open-source/&quot;&gt;open source&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/teamwork/&quot;&gt;teamwork&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/danielwildt.wordpress.com/124/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/danielwildt.wordpress.com/124/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/danielwildt.wordpress.com/124/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/danielwildt.wordpress.com/124/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/danielwildt.wordpress.com/124/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/danielwildt.wordpress.com/124/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/danielwildt.wordpress.com/124/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/danielwildt.wordpress.com/124/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/danielwildt.wordpress.com/124/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/danielwildt.wordpress.com/124/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/danielwildt.wordpress.com/124/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/danielwildt.wordpress.com/124/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/danielwildt.wordpress.com/124/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/danielwildt.wordpress.com/124/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=danielwildt.wordpress.com&amp;amp;blog=8452578&amp;amp;post=124&amp;amp;subd=danielwildt&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Fri, 03 Sep 2010 11:19:26 +0000</pubDate>
</item>
<item>
	<title>Simon Brunning: Links for 2010-09-02 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2010-09-02</guid>
	<link>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/BiYTedOUUf8/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://lifehacker.com/5627286/battle-of-the-android-home-screen-launchers-adw-vs-launcherpro-vs-helixlauncher&quot;&gt;Battle of the Android Home Screen Launchers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Fri, 03 Sep 2010 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Sam Newman: links for 2010-09-02</title>
	<guid isPermaLink="false">http://www.magpiebrain.com/2010/09/02/links-for-2010-09-02/</guid>
	<link>http://feedproxy.google.com/~r/Magpiebrain/~3/wzPXC2Eyoc0/</link>
	<description>&lt;ul class=&quot;delicious&quot;&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://keynotekungfu.com/&quot;&gt;Keynote Wireframe Toolkit – Get your Keynote Kung-Fu on&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/keynote&quot;&gt;keynote&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/prototyping&quot;&gt;prototyping&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/ux&quot;&gt;ux&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/ui&quot;&gt;ui&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/webdesign&quot;&gt;webdesign&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://keynotopia.com/&quot;&gt;Keynotopia – Keynote themes and templates for interactive prototyping of iPad, iPhone, Android and web apps&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/keynote&quot;&gt;keynote&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/prototyping&quot;&gt;prototyping&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/ux&quot;&gt;ux&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/ui&quot;&gt;ui&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/webdesign&quot;&gt;webdesign&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=wzPXC2Eyoc0:xizVsxeEHiw:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=wzPXC2Eyoc0:xizVsxeEHiw:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=wzPXC2Eyoc0:xizVsxeEHiw:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?i=wzPXC2Eyoc0:xizVsxeEHiw:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=wzPXC2Eyoc0:xizVsxeEHiw:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Thu, 02 Sep 2010 21:01:38 +0000</pubDate>
</item>
<item>
	<title>Patric Fornasier: Agile Talk in Bern</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-34378650.post-2101206513132923190</guid>
	<link>http://feedproxy.google.com/~r/patforna/~3/ILDuqfp4flY/agile-talk-in-bern.html</link>
	<description>Next Monday (September 6th), I'm giving a talk in Bern. I'll be talking about how our software delivery teams around the globe work and get stuff done.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The talk will start at 6pm at Restaurant Schmiedstube. More info and registration via &lt;a href=&quot;http://www.guild42.ch/10601/17722.html&quot;&gt;Guild42&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Come along if you're in the area!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/34378650-2101206513132923190?l=patforna.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 02 Sep 2010 20:27:41 +0000</pubDate>
	<author>noreply@blogger.com (Patric Fornasier)</author>
</item>
<item>
	<title>Zubair Khan: Agile session Alt.Net London</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2008/09/17/agile-session-altnet-london/</guid>
	<link>http://zubairk.wordpress.com/2008/09/17/agile-session-altnet-london/</link>
	<description>So to start the conference I chose to take part in a session about agile development and processes. I think mainly because I wanted a refresher on some of the points and to see if I could contribute. It’s nice to see plenty of people there new to Agile as I was at my first [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=11&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:45 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: altdotnet London September 2008</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2008/09/14/altdotnet-london-september-2008/</guid>
	<link>http://zubairk.wordpress.com/2008/09/14/altdotnet-london-september-2008/</link>
	<description>So, I’ve just got back from the altdotnet conference in London. This is my second altdotnet conference, and it was as good as I remember. You could see people had moved on, and it was nice to see that altdotnet has had its affect on uSwitch.com in a positive way. 5 attendees were currently employed [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=7&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:45 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: Lost dev seeks direction</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2008/09/12/lost-dev/</guid>
	<link>http://zubairk.wordpress.com/2008/09/12/lost-dev/</link>
	<description>My first blog post on this wordpress site. How exciting, I’m trying to get other the initial, “I’m not worthy of publishing my thoughts” thing that I’m sure all those that blog need to get over, so please bear with me. I’ve also got to keep my sentences shorter! Hopefully, I’ll be able to use [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=1&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:45 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: MEF and the Personal Spike</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2009/02/12/mef-and-the-personal-spike/</guid>
	<link>http://zubairk.wordpress.com/2009/02/12/mef-and-the-personal-spike/</link>
	<description>A week or two ago I attended the Open Space Coding day arranged by Alan Dean, and held at the Conchango offices. The Alt.Net community is very good at getting together and talking about code, software, and how it should all be done, but the focus of this meeting was to get on and write [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=70&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:44 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: The object epiphany</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2009/02/02/the-object-epiphany/</guid>
	<link>http://zubairk.wordpress.com/2009/02/02/the-object-epiphany/</link>
	<description>Why do Ruby developers brag about true OO vs Class based OO?&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=60&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:44 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: Evil Burndown Charts</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2009/01/26/evil-burndown-charts/</guid>
	<link>http://zubairk.wordpress.com/2009/01/26/evil-burndown-charts/</link>
	<description>This post is in response to Tim Ross’s post on ‘Are Burndowns Evil?‘ Tim asks how useful a Burndown chart is, especially in the case of a new team with a new or unknown code base. A burn down chart (with an ideal line) for a new team immediately gives a team ‘schedule pressure’. Some may [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=53&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:44 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: Sustainable pace</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2009/01/02/sustainable-pace/</guid>
	<link>http://zubairk.wordpress.com/2009/01/02/sustainable-pace/</link>
	<description>One of the great things about Agile software development that I’ve noticed is sustainable pace. Planning poker, point based estimation and velocity are all great tools for finding a team’s sustainable pace. Knowing a team’s velocity and consistent estimating by the entire team, allows a team to commit to as much work as it is [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=43&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:44 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: Our first good acceptance test</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2008/11/10/our-first-good-acceptance-test/</guid>
	<link>http://zubairk.wordpress.com/2008/11/10/our-first-good-acceptance-test/</link>
	<description>In an effort to get our teams understanding ‘Done Done’ we’ve started looking at acceptance testing. We’ve moved, over the last 18 months or so, from a traditional waterfall process to a full on Agile one, our final hurdle is the QA process. We still have a very waterfall-esque QA approach. We’ve done lots in [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=32&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:44 +0000</pubDate>
</item>
<item>
	<title>Zubair Khan: Estimating tasks with points</title>
	<guid isPermaLink="true">http://zubairk.wordpress.com/2008/09/17/estimating-tasks-with-points/</guid>
	<link>http://zubairk.wordpress.com/2008/09/17/estimating-tasks-with-points/</link>
	<description>Following on from my entry on the altnetuk session on Agile Process, I’m just going to layout the different types of estimating with points that I know of. I’m not sure why but at that session it felt like someone had put and end to point to complexity estimating and forgot to let me know! [...]&lt;img src=&quot;http://stats.wordpress.com/b.gif?host=zubairk.wordpress.com&amp;amp;blog=4832951&amp;amp;post=20&amp;amp;subd=zubairk&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 19:01:44 +0000</pubDate>
</item>
<item>
	<title>Jie Xiong: 作为管理工具的持续集成</title>
	<guid isPermaLink="false">tag:gigix.thoughtworkers.org,2010-09-02:1177</guid>
	<link>http://gigix.thoughtworkers.org/2010/9/2/continuous-integration-as-management-tool</link>
	<description>&lt;p&gt;有一个敏捷推行人，给她的团队设立了一个规则：每个函数不要超过30行。一开始，领导们都说，很好，很有道理。可是真的做起来，就发现遗留代码里有这样那样的特殊情况。紧跟着，开发人员也有了抱怨：我这里写32行又有什么损害呢？为什么一定要那么死板呢？于是，一个又一个的口子被打开。当然，你可以想象，有了越来越多的口子以后，“改善代码质量”也就成了纯理念──跟没有规则之前没什么区别。&lt;/p&gt;


	&lt;p&gt;我打算怎么做这件事呢？&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;把持续集成搭起来，只做编译。编译失败就红。红了就不能转测试，红了就必须马上修复，红了就是在阻塞整个团队的工作，红了就是最高优先级。让领导开始盯住持续集成。破坏构建就是和整个团队作对。&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;大家讨论一下，30行是不是一个合适的门限？如果不是，35行？40行？50行？行。我们就把门限定在50行。把静态检查放进持续集成。旧的代码我们既往不咎。就算现在有100个函数超过50行吧，没关系，我们容忍它。但是如果出现第101个长函数，就会让持续集成变红，要马上修复。&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;每次构建失败就是一个教育和学习的机会。一个人第一次写出长函数，我跟他一起重构；第二次写出长函数，我要看着他用我教的方法重构；第三次再写出长函数，那就要让领导来关心一下了。没有能力可以学，有了能力还破坏规则，说不过去了吧？&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;现在大家都学到怎么写更短小的函数了。偷偷把门限降低到45行试试？又多出来10个长函数。拉上几个开发者，我们来搞一次代码优化活动，把这10个长函数解决掉。于是大家又学到了更多的重构技巧。于是45行的门限变成了持续集成的要求。&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;两周搞一次代码优化学习会，降一次门限值。两个月以后，30行的标准就放在了持续集成里。如果有时间就去重构以前遗留的长函数，如果没时间就留着吧，至少大家已经不会写出新的长函数了。&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;先讲道理，再定规则，然后帮所有人提升能力以遵守规则，随着能力的提升逐渐拉高规则。30行的规则落实不下去？我就不信了。&lt;/p&gt;


	&lt;p&gt;把持续集成作为团队规则的自动、可视执行者，于是敏捷推行人就不必扮演那个凶恶的执法者，只需专心帮人排疑解难。持续集成把违规行为变成一个人与整个团队的对立，而不是一个人与另一个人的对立。&lt;/p&gt;</description>
	<pubDate>Thu, 02 Sep 2010 16:23:32 +0000</pubDate>
</item>
<item>
	<title>Jim Webber: REST in Practice for Universities</title>
	<guid isPermaLink="true">http://jim.webber.name/2010/09/02/ee658595-bfca-4db1-827b-9d2a798989e1.aspx</guid>
	<link>http://jim.webber.name/2010/09/02/ee658595-bfca-4db1-827b-9d2a798989e1.aspx</link>
	<description>&lt;div&gt;&lt;p&gt;It's really pleasing that finally the book &lt;a href=&quot;http://restinpractice.com&quot;&gt;REST in Practice&lt;/a&gt; that &lt;a href=&quot;http://savas.me&quot;&gt;Savas&lt;/a&gt;, &lt;a href=&quot;http://iansrobinson.com&quot;&gt;Ian&lt;/a&gt;, and I have been writing will hit bookshelves on the 24th September. We're pretty pleased that we got it out before the next university term starts (at least in the northern hemisphere), but we didn’t leave a very wide margin. Several university computing departments have already expressed that they're interested in using the book as as recommended text. But we realise we're leaving it late for lecturers to prepare materials. &lt;/p&gt;&lt;p&gt;Fortunately, we have some ready-baked. For a couple of years now &lt;a href=&quot;http://iansrobinson.com&quot;&gt;Ian&lt;/a&gt; and I have been on the conference circuit doing &lt;a href=&quot;http://iansrobinson.com/2010/08/27/rest-in-practice-tutorials-sept-oct/&quot;&gt;day-long tutorials&lt;/a&gt; on the material from the &lt;a href=&quot;http://restinpractice.com&quot;&gt;book&lt;/a&gt;. Those slides have been &lt;a href=&quot;http://www.slideshare.net/guilhermecaelum/rest-in-practice&quot;&gt;all over the Web&lt;/a&gt;, and we continue to add and refine them all the time. What's less known is those tutorial slides are actually a subset of much more substantial set that have been used to teach other academics and researchers about the Web, with a distinctly distributed systems flavour. &lt;/p&gt;&lt;p&gt;Here's the good news: if you're an academic who teaches distributed computing and you want to use the &lt;strong&gt;full set of slides&lt;/strong&gt; that we have for your course then you can have the whole set,&lt;strong&gt; for free&lt;/strong&gt;. All we ask in return is that you consider using REST in Practice as one of your recommended texts for your course. &lt;/p&gt;&lt;p&gt;What's more, we'll keep those slides up to date, add more detail over time where it's requested (or we think it's needed), and you'll be able to take that new material as it's created and pushed to our repository. &lt;/p&gt;&lt;p&gt;So if you'd like the full slide set for &lt;a href=&quot;http://restinpractice.com&quot;&gt;REST in Practice&lt;/a&gt;, first thing to do is drop me an &lt;a href=&quot;mailto:restinpractice@jim.webber.name?subject=REST in Practice Course Slides&quot;&gt;email&lt;/a&gt; and we'll sort things out pretty quickly from there.&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 02 Sep 2010 14:32:16 +0000</pubDate>
</item>
<item>
	<title>Ian Robinson: Using Typed Links to Forms</title>
	<guid isPermaLink="false">http://iansrobinson.com/?p=247</guid>
	<link>http://iansrobinson.com/2010/09/02/using-typed-links-to-forms/</link>
	<description>&lt;p&gt;Nowadays, I tend to use a typed link leading to a form, rather than a heavily typed link alone (I’ll explain what I mean by heavily typed link shortly), to advertise unsafe operations and/or requests that require an entity body. Here’s an example of a typed link:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//Request
GET /shop HTTP/1.1
Host: restbucks.com
Accept: application/vnd.restbucks+xml

//Response
HTTP/1.1 200 OK
Date: Mon, 26 Jul 2010 10:00:00 GMT
Cache-Control: public, max-age=86400
Content-Type: application/vnd.restbucks+xml
Content-Length: ...

&amp;lt;shop xmlns=&quot;http://schemas.restbucks.com/shop&quot;&amp;gt;
  &amp;lt;link rel=&quot;http://relations.restbucks.com/rfq&quot;
        href=&quot;http://restbucks.com/request-for-quote&quot;
        type=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
&amp;lt;/shop&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The link here is typed with the link relation value &lt;em&gt;http://relations.restbucks.com/rfq&lt;/em&gt;, which indicates that the link points to a resource where a request for a quote can be submitted. Following the link, the client retrieves a form:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//Request
GET /request-for-quote HTTP/1.1
Host: restbucks.com
Accept: application/vnd.restbucks+xml

//Response
HTTP/1.1 200 OK
Date: Mon, 26 Jul 2010 10:00:05 GMT
Cache-Control: public, max-age=86400
Content-Type: application/vnd.restbucks+xml
Content-Length: ...

&amp;lt;model xmlns=&quot;http://www.w3.org/2002/xforms&quot;
  schema=&quot;http://schemas.restbucks.com/rfq.xsd&quot;&amp;gt;
  &amp;lt;submission
    resource=&quot;http://restbucks.com/quotes&quot; 
    method=&quot;post&quot; 
    mediatype=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
&amp;lt;/model&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The response entity body comprises an &lt;a href=&quot;http://www.w3.org/TR/xforms11/&quot; target=&quot;_blank&quot; title=&quot;XForms 1.1&quot;&gt;XForms&lt;/a&gt; form model. (Our custom media type definition for &lt;code&gt;application/vnd.restbucks+xml&lt;/code&gt; says that one of the things a client can expect to receive in a response is an XForms form model.) The form’s &lt;code&gt;&amp;lt;submission&amp;gt;&lt;/code&gt; element includes several pieces of control data: it indicates which verb to use when submitting the form (&lt;code&gt;POST&lt;/code&gt;), where to submit the form (&lt;em&gt;http://restbucks.com/quotes&lt;/em&gt;), and which content or media type to use when submitting the form (&lt;em&gt;application/vnd.restbucks+xml&lt;/em&gt;). Because the definition of our custom media type includes more than one XML schema (much as the Atom specification defines two schemas, one for feeds and one for entries), the form’s control data needs to further clarify what &lt;em&gt;/quotes&lt;/em&gt; expects to receive in a &lt;code&gt;POST&lt;/code&gt; request. To clarify which schema the &lt;code&gt;POST&lt;/code&gt; request body should adhere to, the &lt;code&gt;&amp;lt;model&amp;gt;&lt;/code&gt; element’s &lt;code&gt;schema&lt;/code&gt; attribute references the &lt;em&gt;rfq.xsd&lt;/em&gt; schema.&lt;/p&gt;

&lt;p&gt;Here, then, we have all the information a client needs to construct and submit a valid request to the &lt;em&gt;/quotes&lt;/em&gt; resource. And all without any fields for the client to fill out.&lt;/p&gt;

&lt;h2&gt;Heavily typed links&lt;/h2&gt;

&lt;p&gt;A heavily typed link is one where the link relation describes not only the relationship to the linked resource, but also the HTTP idioms – the control data – necessary to manipulate that resource.&lt;/p&gt;

&lt;p&gt;Using a heavily typed link our shop could link directly to the &lt;em&gt;/quotes&lt;/em&gt; resource, instead of to a form:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;shop xmlns=&quot;http://schemas.restbucks.com/shop&quot;&amp;gt;
  &amp;lt;link rel=&quot;http://relations.restbucks.com/quotes&quot;
        href=&quot;http://restbucks.com/quotes&quot;
        type=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
&amp;lt;/shop&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here, the definition of the link relation &lt;em&gt;http://relations.restbucks.com/quotes&lt;/em&gt; might be something like: “Indicates a collection of quotes. To request a quote, &lt;code&gt;POST&lt;/code&gt; a &lt;code&gt;&amp;lt;request-for-quote&amp;gt;&lt;/code&gt; with a &lt;code&gt;Content-Type&lt;/code&gt; header of &lt;code&gt;application/vnd.restbucks+xml&lt;/code&gt; to the linked resource.”&lt;/p&gt;

&lt;p&gt;That’s a perfectly respectable way of using links and link relations; in fact, it’s the strategy we employ in &lt;a href=&quot;http://restinpractice.com&quot; target=&quot;_blank&quot; title=&quot;REST in Practice&quot;&gt;&lt;em&gt;REST in Practice&lt;/em&gt;&lt;/a&gt;. But it can have its downsides. Most importantly, it can increase the coupling between the client and any resources that employ link relations.&lt;/p&gt; 

&lt;p&gt;Make no mistake: link relation semantics comprise out-of-band knowledge. There’s no magic here: link relations introduce a degree of coupling between a client and any server-governed resources that adopt them. The trick is to keep this coupling as low as possible. By putting control data in the link relation definition, we perhaps introduce more coupling than is strictly necessary.&lt;/p&gt;

&lt;p&gt;Out-of-band data is less visible, and more difficult and more costly to change, than data that is inlined in the message. Whilst the control data may not change all that often, changes can and do sometimes happen; inlining the data allows these changes to be propagated to clients sooner rather than later. Control data produced at the time the response is generated is generally more recent than control data defined through some out-of-band mechanism.&lt;/p&gt;

&lt;p&gt;Using lightly typed links helps separate semantics from control data. A “light” link relation indicates &lt;em&gt;what&lt;/em&gt; the linked resource means in the context of the current representation – that’s all. This helps mitigate against a second, somewhat more subtle, downside of adding control data to link relations: the tendency to introduce &lt;em&gt;action&lt;/em&gt; semantics. It’s no great step to shorten the link relation value above to &lt;em&gt;http://relations.restbucks.com/quote&lt;/em&gt;, and to rewrite its semantic to read “Indicates an opportunity to request a quote by &lt;code&gt;POST&lt;/code&gt;ing a &lt;code&gt;&amp;lt;request-for-quote&amp;gt;&lt;/code&gt; with a &lt;code&gt;Content-Type&lt;/code&gt; header of &lt;code&gt;application/vnd.restbucks+xml&lt;/code&gt; to the linked resource.” At this point, our link has effectively become an operation. The typed-link-to-form strategy helps us concentrate on describing what a linked resource &lt;em&gt;is&lt;/em&gt;, rather than what a link &lt;em&gt;does&lt;/em&gt;. Link relations do not necessarily imply action semantics, but they can very easily be made to do so.&lt;/p&gt;

&lt;p&gt;(Note: when adding links to representations, I still prefer to use a &lt;code&gt;&amp;lt;link rel=&quot;...&quot; href=&quot;...&quot;&amp;gt;&lt;/code&gt; construct, or something similar, rather than &lt;code&gt;&amp;lt;order-form href=&quot;...&quot;&amp;gt;&lt;/code&gt;. The reason for this is that elements such as &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; separate link syntax from semantic context, as explained &lt;a href=&quot;http://iansrobinson.com/2009/07/16/how-do-you-link/&quot; target=&quot;_blank&quot; title=&quot;How Do You Link?&quot;&gt;here&lt;/a&gt;; and this is a good thing, because what a link ought look like – its syntax – changes far less than what a link might mean in a particular context. By separating these concerns, we make it easier to evolve a distributed application.)&lt;/p&gt;

&lt;p&gt;Interestingly, on the wire, the result of submitting an XForm form looks exactly the same as if we’d simply &lt;code&gt;POST&lt;/code&gt;ed a &lt;code&gt;&amp;lt;request-for-quote&amp;gt;&lt;/code&gt; directly to &lt;em&gt;/quotes&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//Request
POST /quotes HTTP/1.1
Host: restbucks.com
Content-Type: application/vnd.restbucks+xml
Content-Length: ...

&amp;lt;request-for-quote xmlns=&quot;http://schemas.restbucks.com/rfq&quot;&amp;gt;
  &amp;lt;items&amp;gt;
    &amp;lt;item&amp;gt;
      &amp;lt;description&amp;gt;Costa Rica Tarrazu&amp;lt;/description&amp;gt;
      &amp;lt;amount&amp;gt;250g&amp;lt;/amount&amp;gt;
    &amp;lt;/item&amp;gt;
    &amp;lt;item&amp;gt;
      &amp;lt;description&amp;gt;Guatemala Elephant Beans&amp;lt;/description&amp;gt;
      &amp;lt;amount&amp;gt;250g&amp;lt;/amount&amp;gt;
    &amp;lt;/item&amp;gt;
  &amp;lt;/items&amp;gt;
&amp;lt;/request-for-quote&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Knowing this, we could always add both a lightly typed link to a form &lt;em&gt;and&lt;/em&gt; a heavily typed link to our shop representation:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;shop xmlns=&quot;http://schemas.restbucks.com/shop&quot;&amp;gt;
  &amp;lt;link rel=&quot;http://relations.restbucks.com/rfq&quot;
        href=&quot;http://restbucks.com/request-for-quote&quot;
        type=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
  &amp;lt;link rel=&quot;http://relations.restbucks.com/quotes&quot;
        href=&quot;http://restbucks.com/quotes&quot;
        type=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
&amp;lt;/shop&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Two paths to the same result. I don’t recommend doing this: I include simply to highlight how a linked form achieves the exact same result, but with the added beenfit of having inlined control data.&lt;/p&gt;

&lt;h2&gt;Pre-filled forms/self-describing requests&lt;/h2&gt;

&lt;p&gt;Here’s another example of using a typed link to a form:&lt;/p&gt;&lt;p&gt;
  
&lt;/p&gt;&lt;pre&gt;&lt;code&gt;//Request
GET /quotes/1234
Host: restbucks.com
Accept: application/vnd.restbucks+xml

//Response
HTTP/1.1 200 OK
Cache-Control: public
Date: Mon, 26 Jul 2010 10:01:00 GMT
Expires: Mon, 02 Aug 2010 10:01:00 GMT
Content-Type: application/vnd.restbucks+xml
Content-Length: ...

&amp;lt;quote xmlns=&quot;http://schemas.restbucks.com/quote&quot;&amp;gt;
  &amp;lt;items&amp;gt;
    &amp;lt;item&amp;gt;
      &amp;lt;description&amp;gt;Costa Rica Tarrazu&amp;lt;/description&amp;gt;
      &amp;lt;amount&amp;gt;250g&amp;lt;/amount&amp;gt;
      &amp;lt;price currency=&quot;GBP&quot;&amp;gt;4.40&amp;lt;/price&amp;gt;
    &amp;lt;/item&amp;gt;
    &amp;lt;item&amp;gt;
      &amp;lt;description&amp;gt;Guatemala Elephant Beans&amp;lt;/description&amp;gt;
      &amp;lt;amount&amp;gt;250g&amp;lt;/amount&amp;gt;
      &amp;lt;price currency=&quot;GBP&quot;&amp;gt;5.30&amp;lt;/price&amp;gt;
    &amp;lt;/item&amp;gt;
  &amp;lt;/items&amp;gt;
  &amp;lt;link rel=&quot;http://relations.restbucks.com/order-form&quot;
        href=&quot;http://restbucks.com/order-forms/1234&quot;
        type=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
&amp;lt;/quote&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  
&lt;p&gt;The link relation &lt;em&gt;http://relations.restbucks.com/order-form&lt;/em&gt; indicates that the linked resource is something that allows an order to be submitted. Following this link, the client retrieves an order form:&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;pre&gt;&lt;code&gt;//Request
GET /order-forms/1234
Host: restbucks.com
Accept: application/vnd.restbucks+xml

//Response
HTTP/1.1 200 OK
Cache-Control: public
Date: Mon, 26 Jul 2010 10:01:05 GMT
Expires: Mon, 02 Aug 2010 10:01:00 GMT
Content-Type: application/vnd.restbucks+xml
Content-Length: ...
Content-Location: http://restbucks.com/quotes/1234

&amp;lt;model xmlns=&quot;http://www.w3.org/2002/xforms&quot;&amp;gt;
  &amp;lt;instance&amp;gt;
    &amp;lt;quote xmlns=&quot;http://schemas.restbucks.com/quote&quot;&amp;gt;
      &amp;lt;items&amp;gt;
        &amp;lt;item&amp;gt;
          &amp;lt;description&amp;gt;Costa Rica Tarrazu&amp;lt;/description&amp;gt;
          &amp;lt;amount&amp;gt;250g&amp;lt;/amount&amp;gt;
          &amp;lt;price currency=&quot;GBP&quot;&amp;gt;4.40&amp;lt;/price&amp;gt;
        &amp;lt;/item&amp;gt;
        &amp;lt;item&amp;gt;
          &amp;lt;description&amp;gt;Guatemala Elephant Beans&amp;lt;/description&amp;gt;
          &amp;lt;amount&amp;gt;250g&amp;lt;/amount&amp;gt;
          &amp;lt;price currency=&quot;GBP&quot;&amp;gt;5.30&amp;lt;/price&amp;gt;
        &amp;lt;/item&amp;gt;
      &amp;lt;/items&amp;gt;
      &amp;lt;link rel=&quot;self&quot;
            href=&quot;http://restbucks.com/quotes/1234&quot;
            type=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
    &amp;lt;/quote&amp;gt;
  &amp;lt;/instance&amp;gt;
  &amp;lt;submission
    resource=&quot;http://restbucks.com/orders&quot; 
    method=&quot;post&quot; 
    mediatype=&quot;application/vnd.restbucks+xml&quot;/&amp;gt;
&amp;lt;/model&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once again, I’ve used an XForms form model, but this time I’ve pre-filled it with an &lt;code&gt;&amp;lt;instance&amp;gt;&lt;/code&gt; element. Even so, there are no form fields to fill in; all the client needs to do is operate the form according to the inlined control data.&lt;/p&gt;

&lt;p&gt;The interesting thing here is that &lt;em&gt;/order-forms/1234&lt;/em&gt; simply returns a different representation of the quote resource identified by &lt;em&gt;/quotes/1234&lt;/em&gt; (the response indicates as much in its &lt;code&gt;Content-Location&lt;/code&gt; header). By supplying a forms-based representation of the quote, we inline all the information necessary to submit an order to an order processing engine. The client doesn’t need to compose an entity body; it simply needs to operate the form according to its control data. This results in a self-describing message being sent to &lt;em&gt;/orders&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;p&gt;(In a real-world application I’d likely include a signature in the form body. This signature would guarantee that the client hasn’t tampered with the form contents prior to submitting the form to the order processing engine. The effectiveness of the signature depends on an out-of-band trust relationship having been established between the quoting engine and the order processing engine.)&lt;/p&gt;

&lt;p&gt;The result of first following the link to the form, and then submitting the form, is to transition the overall state of the distributed application from &lt;em&gt;Quote Requested&lt;/em&gt; to &lt;em&gt;Order Placed&lt;/em&gt;, as illustrated in the following diagram:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://iansrobinson.com/wp-content/uploads/2010/09/application-state-transition.png&quot; title=&quot;Application state transition&quot; height=&quot;252&quot; width=&quot;450&quot; alt=&quot;Application state transition&quot; class=&quot;size-full wp-image-96&quot;&gt;&lt;/img&gt;&lt;/p&gt;

&lt;p&gt;Every request-response pair transforms application state. Retrieving the form &lt;em&gt;enriches&lt;/em&gt; the client’s understanding of the current application state; that is, it opens up new opportunities for interacting with other resources. &lt;code&gt;POST&lt;/code&gt;ing the form causes the application state to &lt;em&gt;transition&lt;/em&gt; from &lt;em&gt;Quote Requested&lt;/em&gt; to &lt;em&gt;Order Placed&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The fact that the overall state of the application has changed is of no consequence to the server resources involved; the application state model is nowhere baked into the server resources. As far as the quote resource is concerned, it has simply been asked to surface a forms-based representation of itself. As far as the orders resource is concerned, it has simply created a new, subordinate order resource. This change in application state is, however, important to the client.&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;Understand the tradeoffs between inlining and putting control data in an out-of-band mechanism. Use the right controls for the job; understand the many different hypermedia capabilities at your disposal. The best resource for this is Mike Amundsen’s &lt;a href=&quot;http://www.amundsen.com/hypermedia/&quot; target=&quot;_blank&quot; title=&quot;Hypermedia Types&quot;&gt;in-depth study&lt;/a&gt; of the hypermedia capabilities of many different kinds of hypermedia control. Recently, Andrew Wahbe started examining the need for &lt;a href=&quot;http://linkednotbound.net/2010/08/25/m2m-hypermedia/&quot; target=&quot;_blank&quot; title=&quot;&quot;&gt;machine-to-machine hypermedia&lt;/a&gt;, and the differences between controls for machines and controls for humans. Watch his blog for further discussion.&lt;/p&gt;

&lt;p&gt;My understanding of hypermedia controls has been heavily influenced by my experience of the human web, where links and forms predominate. But when we talk about forms in a machine-to-machine context, it’s not the form field elements that are of interest, it’s the control data elements. These control data elements help program the client on the fly. The term “form” as it applies in a machine-to-machine context is likely an inappropriate metaphor; nonetheless, it does emphasize the fact that unsafe requests – and requests that have an entity body – require different hypermedia capabilities from simple &lt;code&gt;GET&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;Because in the past I’ve tended to think form fields are redundant in machine-to-machine scenarios, I’ve avoided using forms at all, and have instead overloaded link relations with control data. But link relations are not a “get out of jail free” card. In overloading link relations, we add unnecessary coupling.&lt;/p&gt;

&lt;p&gt;Coupling, of course, is not an all-or-nothing affair. There are degrees of coupling. We choose to accept some coupling because of the benefits it brings. But that doesn’t mean we should accept more coupling than is necessary; doing so can only inhibit our ability to evolve a distributed application.&lt;/p&gt;</description>
	<pubDate>Thu, 02 Sep 2010 14:22:39 +0000</pubDate>
</item>
<item>
	<title>Daniel Wildt: DanielWildt</title>
	<guid isPermaLink="false">http://danielwildt.wordpress.com/?p=120</guid>
	<link>http://danielwildt.wordpress.com/2010/09/02/pt-empreender-e-arriscado-o-que-voce-tem-a-perder/</link>
	<description>&lt;p&gt;As vezes vejo pessoas falando em empreender, nos riscos, e tudo mais… e pergunto! O que impede você de tentar aplicar algumas horas do seu dia em alguma ideia que você entende que pode dar certo? &lt;/p&gt;
&lt;p&gt;Li recentemente o &lt;a href=&quot;http://astore.amazon.com/daniwildblog-20/detail/0307463745&quot;&gt;livro Rework&lt;/a&gt; da &lt;a href=&quot;http://37signals.com/&quot;&gt;37Signals&lt;/a&gt;, empresa de sucesso no desenvolvimento de softwares que não fazem uma série de coisas. E o fato destes softwares não serem capazes de uma série de coisas é que faz esta empresa tão diferente e com tanto sucesso no mercado.&lt;/p&gt;
&lt;p&gt;Eles tem foco, eles tem objetivo e eles tem a certeza de que o produto que eles fazem possui um nicho de usuários. E eles trabalham este nicho. &lt;/p&gt;
&lt;p&gt;Você já escolheu o nicho que deseja trabalhar?&lt;/p&gt;
&lt;p&gt;Para quem é do mercado de TI, você precisa de no máximo &lt;a href=&quot;http://www.godaddy.com/&quot;&gt;R$50 reais para investir em uma primeira idéia&lt;/a&gt;. Isto se você quiser investir em um domínio. De resto, você encontra soluções gratuitas e/ou open source, e nas nuvens para ajudar você em tudo o que precisar! &lt;/p&gt;
&lt;p&gt;Precisa de um CRM para cuidar do seu negócio? &lt;a href=&quot;http://www.highrisehq.com/?source=DanielWildt+Blog&quot;&gt;Highrise&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Precisa de um software para gerenciar seu projeto e acompanhar seus planos? &lt;a href=&quot;http://www.basecamphq.com/?source=DanielWildt+Blog&quot;&gt;Basecamp&lt;/a&gt; ou &lt;a href=&quot;http://www.pivotaltracker.com/&quot;&gt;PivotalTracker&lt;/a&gt; podem te ajudar!&lt;/p&gt;
&lt;p&gt;Precisa publicar sua aplicação? &lt;a href=&quot;http://appengine.google.com&quot;&gt;Google App Engine&lt;/a&gt;! &lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;E você precisa contratar? Para que? Você já tentou fazer sozinho? E você tem pessoas com a mesma identidade que você? Você tem uma empresa que ouve suas ideias e permite que você crie produtos internamente? Pense nisto também. &lt;/p&gt;
&lt;p&gt;Eu sempre falo aos meus alunos: nunca deixem de programar. Nunca deixem de treinar. Um diretor que tive me falou, as empresas precisam de poucas pessoas nas suas diretorias, mas as empresas sempre vão precisar de bons programadores, no melhor estilo &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Pragmatic_Programmer&quot;&gt;pragmatic programmers&lt;/a&gt;, desenvolvedores atentos no que é importante no desenvolvimento de software. Falo mais sobre “o que é importante” em outro post.  &lt;/p&gt;
&lt;p&gt;E é no sentimento de &lt;a href=&quot;http://en.wikipedia.org/wiki/Do_it_yourself&quot;&gt;“do it yourself” (DIY)&lt;/a&gt; que eu acho que as pessoas precisam investir seu tempo. E pensando no início de uma idéia, meu entendimento fecha com o modelo do &lt;a href=&quot;http://gettingreal.37signals.com/&quot;&gt;Getting Real&lt;/a&gt;, ou quase… eu entendo que podemos usar um time de &lt;strong&gt;até&lt;/strong&gt; três pessoas para lançar um produto novo. Você não precisa de mais pessoas que isto para fazer as coisas acontecerem. E olhando 37Signals que citei anteriormente, é o &lt;a href=&quot;http://gettingreal.37signals.com/ch03_The_Three_Musketeers.php&quot;&gt;modelo dos três mosqueteiros&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;E não é procurando soluções mirabolantes, mas procurando as soluções mais simples possíveis (que por acaso são as mais difíceis). Exemplo, converso com colegas de trabalho sobre alguns produtos a serem lançados, mas nenhum produto pode ter mais que &lt;strong&gt;08 horas de desenvolvimento&lt;/strong&gt;. Como você alcança isto?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://vimeo.com/12704813&quot;&gt;A criação de restrições são interessantes para alcançar estas questões&lt;/a&gt;. E são 08 horas conscientes de desenvolvimento, nada de &lt;a href=&quot;http://gohorseprocess.wordpress.com/extreme-go-horse-xgh/&quot;&gt;eXtreme Go Horse&lt;/a&gt; ou algo do tipo. &lt;/p&gt;
&lt;p&gt;Com foco, uma bela metáfora, e muita simplicidade! &lt;a href=&quot;http://agilemanifesto.org/iso/ptbr/principles.html&quot;&gt;Simplicidade é a arte de maximizar o trabalho que não fazemos&lt;/a&gt;. E é isto que precisamos trabalhar em nós mesmos e com os nossos times. O que eu posso fazer, que é muito simples, e pode me ajudar a colocar a cara no mundo e mostrar minha idéia? &lt;/p&gt;
&lt;p&gt;O quanto de tempo preciso investir para garantir um produto possível de ser colocado em produção? &lt;/p&gt;
&lt;p&gt;Vou precisar virar noites? Não. &lt;a href=&quot;http://jaime-wagner.blogspot.com/2008/05/vida-requer-subjetividade.html&quot;&gt;Tempo é vida&lt;/a&gt;. Cuide dela.&lt;/p&gt;
&lt;p&gt;Durma bem. Use 1 hora do seu dia para investir no seu projeto. Use técnicas para gerenciar seu tempo e dar o foco necessário, para que o mínimo de tempo que você tenha seja útil para alguma coisa no seu projeto. Faça coisas mais simples.  &lt;/p&gt;
&lt;p&gt;Capital de investimento? Será que você precisa? Crie uma restrição! Quem sabe isto ajuda você a lançar uma solução mais rápida? &lt;/p&gt;
&lt;p&gt;Trabalhe o mínimo para entregar o máximo. Outra questão interessante é de repente você ler este texto e pensar: mas eu quero criar uma empresa de treinamento. Não posso gastar apenas 1 hora por dia. &lt;/p&gt;
&lt;p&gt;Pode sim. &lt;/p&gt;
&lt;p&gt;Você pode &lt;a href=&quot;http://akitaonrails.com/2010/07/12/screencast-instalando-um-ambiente-ruby&quot;&gt;criar vídeo aulas&lt;/a&gt;, iniciar vendendo elas para sites que compram este material. Ou fazer vocês mesmo sua forma de distribuição! Pode virar um parceiro no itunes e vender seus vídeos pela loja da apple. Você pode. Pode usar uma plataforma como &lt;a href=&quot;http://www.egenialsas.com.br/&quot;&gt;e-genial / treinatom&lt;/a&gt;. Pode. &lt;/p&gt;
&lt;p&gt;Você não precisa de uma sala e um lugar físico para dar treinamento. Não hoje, não agora. &lt;/p&gt;
&lt;p&gt;Você pode tentar e atingir um mercado muito maior do que você poderia atingir. &lt;/p&gt;
&lt;p&gt;Pense nisto. &lt;/p&gt;
&lt;br&gt;&lt;/br&gt; Tagged: &lt;a href=&quot;http://danielwildt.wordpress.com/tag/37signals/&quot;&gt;37signals&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/agile/&quot;&gt;agile&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/cloud/&quot;&gt;cloud&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/do-it-yourself/&quot;&gt;do it yourself&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/getting-real/&quot;&gt;getting real&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/pragmatic-programmer/&quot;&gt;pragmatic programmer&lt;/a&gt;, &lt;a href=&quot;http://danielwildt.wordpress.com/tag/startup/&quot;&gt;startup&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/danielwildt.wordpress.com/120/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/danielwildt.wordpress.com/120/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/danielwildt.wordpress.com/120/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/danielwildt.wordpress.com/120/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/danielwildt.wordpress.com/120/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/danielwildt.wordpress.com/120/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/danielwildt.wordpress.com/120/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/danielwildt.wordpress.com/120/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/danielwildt.wordpress.com/120/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/danielwildt.wordpress.com/120/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/danielwildt.wordpress.com/120/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/danielwildt.wordpress.com/120/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/danielwildt.wordpress.com/120/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/danielwildt.wordpress.com/120/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=danielwildt.wordpress.com&amp;amp;blog=8452578&amp;amp;post=120&amp;amp;subd=danielwildt&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 11:04:38 +0000</pubDate>
</item>
<item>
	<title>Paulo Caroli: Dreyfus Model and Communication</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-9212598583517336757.post-556814720305131519</guid>
	<link>http://agiletips.blogspot.com/2010/09/dreyfus-model-and-communication.html</link>
	<description>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;It is amazing, you can talk to someone, use words that make perfect sense to both parties and still, they don’t communicate at all. I had this experience last week. The Scrum Teams I have been coaching for some time now were scheduled for a meeting with a manager. It was about certain company standards in the area of reporting. The different Scrum Teams were doing the same thing in slightly different ways, no big differences but enough to be visible. Those differences had a good reason: Different preferences how each team wanted to work. Since the teams are self organizing, there is nothing wrong with this approach and either solution makes perfect sense in their given context.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;However, in that meeting the POs and SMs of the two teams were told that having different reports was not acceptable – that they could be confusing; which they weren’t because we had already moved people around – and that the company would mandate a specific tool enabling anyone to work anywhere without having to get any introduction. This might work if all the teams would do the same kind of work, however, in this setting the different teams do a different kind of work using  different technologies.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;I knew that that specific meeting was scheduled to address that very topic. So, on purpose I did not mention this beforehand to neither of the SMs and POs. I was curious to see how they would react and how they would argue. I wanted to see if I was doing a good job as a coach. It was a textbook show. They simply said: ‘No way! We have delivered working software on time since we started with Scrum, this is how we agreed to work in our Scrum Team and it works great for us. We had people moved around and nobody was confused. Last, there are more pressing issues than how certain reports should look like!’.  Of course, the manager was not pleased. He argued that this had to be done in order to align the whole company and lay a foundation for future improvements. The Scrum Teams replied by explaining some principles and practices of Scrum. They also described how it makes sense to keep on working the same way and that they would be open for some changes when both teams would see the need for it – however, right now they do not welcome it.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;This went on for the best part of the hour. Sadly at the end we were told that we would have to obey with whatever decision the management would come up with. Our reasoning was not understood – we had failed.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;What had happened? Each party was perfectly able to follow and understand each word of the discussion. However, the management side did not extract the same kind of information. We had a semantics disaccord. They understood each single word but did not get the meaning of what we were trying to communicate.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;I’ve come to the conclusion that this could be explained with the &lt;/span&gt;&lt;span lang=&quot;EN-GB&quot; style=&quot;font-family: Arial; font-size: 10pt;&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition&quot;&gt;Dreyfus model of skill acquisition&lt;/a&gt;&lt;/span&gt;&lt;span lang=&quot;EN-GB&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Expert&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Proficient&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Competent&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Advanced Beginner&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Novice&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;The Scrum Teams each had about 6 months of hands-on Scrum experience and discovered first hand what it really means to walk the agile walk. They learned a lot about agile and enhanced their theoretical knowledge with hands-on practical experience. Their limited explicit Scrum knowledge became tacit and abundant. &lt;/span&gt;&lt;span style=&quot;font-family: Arial; font-size: 13px;&quot; class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tacit_knowledge&quot;&gt;Tacit knowledge&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;&gt; is knowledge that is difficult to transfer to another person by means of writing it down or verbalising it. It was exactly this tacit knowledge that was missing on the managers’ side to really understand what we were trying to explain. Same words, total different meaning.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;The Scrum Teams have moved up the Dreyfus model and are around the competent or even proficient level, whereas the management is still novice, advanced beginner at best. We had an interfacing problem and did not communicate on the same skill level. The risk with that is that you think you understand, but don't understand without realizing it.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;I am convinced that this is one of the main challenges when communicating certain topics. You cannot assume that everyone has the same tacit knowledge and thereby the same skill level then you. You need to find a way to describe matters to a novice as tangible as possible. Not an easy feat but a necessity.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; font-family: 'Times New Roman'; font-size: 12pt;&quot; class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; size=&quot;12pt&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt;Consider the Dreyfus Model whenever you head to a meeting where you have to do a lot of explaining. If you are too far apart on the Dreyfus model, the others won’t be able to understand even if they think they do!!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 85%;&quot;&gt;&lt;span lang=&quot;EN-GB&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/9212598583517336757-556814720305131519?l=agiletips.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 02 Sep 2010 08:50:04 +0000</pubDate>
	<author>noreply@blogger.com (Ralph Jocham)</author>
</item>
<item>
	<title>Siva Jagadeesan: sivajag</title>
	<guid isPermaLink="false">https://sivajag.wordpress.com/?p=173</guid>
	<link>http://techbehindtech.com/2010/09/02/compojure-demystified-with-an-example-part-5/</link>
	<description>&lt;p&gt;In this part lets write our own middleware.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&quot;http://techbehindtech.com/2010/08/24/compojure-demystified-with-an-example-part-4/&quot;&gt;part4&lt;/a&gt; you will remember,&lt;/p&gt;
&lt;p&gt;“Middleware are functions that could be chained together to process a request. Middleware functions can take any number of arguments, but the spec stats that first argument should be a handler and function should return a handler. An example for middleware is logging all requests that comes to your webserver.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1) Create a namespace for middleware &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Create src/address_book/middleware.clj&lt;/p&gt;
&lt;pre class=&quot;brush: plain;&quot;&gt;(ns address-book.middleware)

(defn- log [msg &amp;amp; vals]
  (let [line (apply format msg vals)]
    (locking System/out (println line))))

(defn wrap-request-logging [handler]
  (fn [{:keys [request-method uri] :as req}]
    (let [resp (handler req)]
      (log &quot;Processing %s %s&quot; request-method uri)
      resp)))
&lt;/pre&gt;
&lt;p&gt;Our wrap-request-logging is a middleware which takes a handler and returns an handler.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2) Add our middleware to our chain of handlers &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Edit routes.clj&lt;/p&gt;
&lt;pre class=&quot;brush: plain; highlight: [4,22,23];&quot;&gt;(ns address_book.routes
  (:use [compojure.core])
  (:require [address-book.address :as address]
            [address-book.middleware :as mdw]
            [compojure.route :as route]
            [clj-json.core :as json]))

(defn json-response [data &amp;amp; [status]]
  {:status (or status 200)
   :headers {&quot;Content-Type&quot; &quot;application/json&quot;}
   :body (json/generate-string data)})

(defroutes handler
  (GET &quot;/addresses&quot; [] (json-response (address/find-all)))
  (GET &quot;/addresses/:id&quot; [id] (json-response (address/find id)))
  (POST &quot;/addresses&quot; {params :params}  (json-response (address/create params)))

  (route/files &quot;/&quot; {:root &quot;public&quot;})
  (route/not-found &quot;Page not found&quot;))

(def address-book
     (-&amp;gt; handler
         mdw/wrap-request-logging))
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;3) Test our middleware &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now start your server and you can see all requests are getting logged. This is very powerful feature. We can do security etc using middleware. Ring and Compojure comes with some useful middleware. Check them out.&lt;/p&gt;
&lt;p&gt;In next part we will implement edit  and delete functionalities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Source code is now available at &lt;/em&gt;&lt;/strong&gt;&lt;a href=&quot;http://github.com/sivajag/Address-Book&quot;&gt;&lt;strong&gt;&lt;em&gt;github&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;. &lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;Created branches for each part.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;&lt;/br&gt;Filed under: &lt;a href=&quot;http://techbehindtech.com/category/clojure/&quot;&gt;Clojure&lt;/a&gt; Tagged: &lt;a href=&quot;http://techbehindtech.com/tag/clojure-2/&quot;&gt;clojure&lt;/a&gt;, &lt;a href=&quot;http://techbehindtech.com/tag/code/&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://techbehindtech.com/tag/compojure/&quot;&gt;compojure&lt;/a&gt;, &lt;a href=&quot;http://techbehindtech.com/tag/jquery/&quot;&gt;jquery&lt;/a&gt;, &lt;a href=&quot;http://techbehindtech.com/tag/rest/&quot;&gt;REST&lt;/a&gt;, &lt;a href=&quot;http://techbehindtech.com/tag/web/&quot;&gt;web&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/sivajag.wordpress.com/173/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/sivajag.wordpress.com/173/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/sivajag.wordpress.com/173/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/sivajag.wordpress.com/173/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/sivajag.wordpress.com/173/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/sivajag.wordpress.com/173/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/sivajag.wordpress.com/173/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/sivajag.wordpress.com/173/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/sivajag.wordpress.com/173/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/sivajag.wordpress.com/173/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/sivajag.wordpress.com/173/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/sivajag.wordpress.com/173/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/sivajag.wordpress.com/173/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/sivajag.wordpress.com/173/&quot; alt=&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=techbehindtech.com&amp;amp;blog=11954221&amp;amp;post=173&amp;amp;subd=sivajag&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 07:19:37 +0000</pubDate>
</item>
<item>
	<title>Sumeet Moghe: Think Workscapes, not Training</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-8396317.post-3955303707332276850</guid>
	<link>http://feedproxy.google.com/~r/blogspot/sawZ/~3/cJsUj6sS1ho/think-workscapes-not-training.html</link>
	<description>&lt;img src=&quot;http://dl.dropbox.com/u/478762/workscaper2.png&quot; alt=&quot;&quot; style=&quot;margin: 0pt auto 10px; display: block; text-align: center;&quot; title=&quot;&quot;&gt;&lt;/img&gt;A few days back I watched a pretty awesome video by &lt;a href=&quot;http://www.aconventional.com/&quot;&gt;Nick Shackleton Jones&lt;/a&gt; about the &lt;a href=&quot;http://www.youtube.com/watch?v=C-jIWHfFsjI&amp;amp;feature=player_embedded&quot;&gt;Affective Context Model&lt;/a&gt;. Nick told a great story about the importance of the affective context - the emotional metadata that allows us to connect and remember various pieces of information. Nick's also written &lt;a href=&quot;http://www.aconventional.com/2010/05/towards-working-theory-of-learning.html&quot;&gt;a splendid article about this very topic&lt;/a&gt; for those who want more detail. Nick's video was a great illustration of why push-type learning tends to be ineffective and why despite our best efforts, learning is never effective unless an individual feels a strong, apparent need for it. While a huge portion of our training budgets goes towards creating the content for learning, we seem to ignore that people learn only when they see a strong need. As I've mentioned earlier, &lt;a href=&quot;http://www.learninggeneralist.com/2010/05/changing-our-trainer-mindsets.html&quot;&gt;context trumps content in the modern L&amp;amp;D world&lt;/a&gt;, and as L&amp;amp;D professionals we need to be able to create a work context that allows knowledge workers to learn when they experience a strong desire to do so. As &lt;a href=&quot;http://www.learninggeneralist.com/search/label/instructional%20design&quot;&gt;instructional designers&lt;/a&gt;, we need to workscape our training programs so they can provide our learners the affective context around which they can pull and retain information themselves.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Last month, &lt;a href=&quot;http://joshbersin.com/2010/07/12/how-people-learn-it-really-hasnt-changed/&quot;&gt;Josh Bersin wrote a thought-provoking blog post&lt;/a&gt; about how, despite all the advancements in technology and the Gen X/ Y debate aside, the way people learn hasn't really changed. He made some really simple, but astute points:&lt;br&gt;&lt;/br&gt;&lt;ol&gt;&lt;li&gt;Mastery (not in &lt;a href=&quot;http://www.learninggeneralist.com/search/label/dreyfus%20model&quot;&gt;Dreyfus&lt;/a&gt; terms) means being able to apply knowledge - until someone performs a task themselves, they don't really learn it.&lt;/li&gt;&lt;li&gt;People learn by doing.&lt;/li&gt;&lt;li&gt;The purpose of training and development is to accelerate this process - and yet we don't pay adequate attention to 'workplace learning'. We're still stuck in the classroom paradigm.&lt;/li&gt;&lt;li&gt;Management and leadership drive learning in an organisation. L&amp;amp;D has little control over workplace practices; a true learning organisation learns even beyond the traditional boundaries of L&amp;amp;D and it's the responsibility of the management, leadership and really everyone in the organisation to drive this culture.&lt;/li&gt;&lt;/ol&gt;I've found some of this thinking extremely motivating in the context of my new found fascination for &lt;a href=&quot;http://www.jaycross.com/Workscaping.pdf&quot;&gt;workscapes&lt;/a&gt;. In today's article, I want to share with you my thoughts around why we need to evolve towards full-blown workscapes as against a purely course focussed approach. Hopefully some of my thoughts will resonate with your own and I'd love to hear how you feel about this topic.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-weight: bold; font-size: 130%;&quot;&gt;Recognising False Elegance&lt;/span&gt;&lt;br&gt;&lt;/br&gt;I grew up in this industry doing a lot of standup training. I still do a lot of that. I've done a fair bit of elearning and I've seen and created some great courses and some awful courses. I've grown to believe that we live in an age of false elegance. Hear me out. Some of us have made it almost an art form in the way we engage and entertain people. Our training sessions just flow by and people seem so entertained, happy and involved that it's no wonder they rate our programs highly. In fact we make the experience so pleasant and memorable that they do amazingly well in the post-training assessment as well. Coverage is hardly a problem - we cover 95% of our target audience. Yet, when it comes to retention and eventual transfer of learning to the workplace, most of this amazing learning investment is lost.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Take the story further and we automate our flawed training processes by creating &lt;span style=&quot;font-style: italic;&quot;&gt;'engaging elearning'&lt;/span&gt;. People love the slot games and tic-tac-toes that we add into our elearning courses. Best things ever! We now train 100% of our people at a third of the cost and quarter the time. In fact, we throw in bonus courses and still save ourselves a lot of money. Guess what, we still can't make a difference to the bottomline. The really effective elearning is where people actually practice real-world tasks, but we have little time for that post our fascination with card games and flashy animations.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;This is what I call false elegance. Our solutions look really polished and slick, but under the surface they do precious little. We need better approaches and a renewed focus.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-weight: bold; font-size: 130%;&quot;&gt;We're Living in Chaos&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;img src=&quot;http://dl.dropbox.com/u/478762/itdepends.png&quot; alt=&quot;&quot; style=&quot;margin: 0pt auto 10px; display: block; text-align: center; width: 560px; height: 360px;&quot; title=&quot;&quot;&gt;&lt;/img&gt;Dave Snowden's landmark work on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Cynefin&quot;&gt;Cynefin model&lt;/a&gt; will remind you of your workplace. As it turns out, traditional elearning and training focusses on the 'Simple' domain of Cynefin. There are clear cause and effect relationships and therefore it's easy to determine how you can respond to problems in this domain. Definitely easy stuff to teach. With the fast changing nature of business, only simple, repetitive processes fall under this domain. Most knowledge work falls under the Complex, Complicated and Chaotic domains, where we our answer for causality is a broad, &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;It depends...&quot;&lt;/span&gt;. If your job is to train knowledge workers, think of how many times you say those words in a classroom versus giving a clear answer and you'll realise how little of what you teach falls under the Simple domain.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Our obsession with training however has meant that we try to dumb down chaotic problems by trying to break them into several best practice solutions. We then try to find an attractive package for this collection of pseudo-best-practices and push them down the throats of our unsuspecting learners through meaningless games and activities which have no relation to the real world. I'm not surprised people find it difficult to apply classroom learning to their day jobs.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-weight: bold; font-size: 130%;&quot;&gt;We need On-Demand Solutions&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://dl.dropbox.com/u/478762/trainingeh.png&quot; alt=&quot;&quot; style=&quot;margin: 0pt auto 10px; display: block; text-align: center; width: 560px; height: 452px;&quot; title=&quot;&quot;&gt;&lt;/img&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&quot;We have built our education systems on the model of fast food. This is something Jamie Oliver talked about the other day. You know there are two models of quality assurance in catering. One is fast food, where everything is standardised. The other are things like Zagat and Michelin restaurants, where everything is not standardized, they're customized to local circumstances. And we have sold ourselves into a fast food model of education. And it's impoverishing our spirit and our energies as much as fast food is depleting our physical bodies.&quot;&lt;/span&gt; - Sir Ken Robinson&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Have you ever thought of why your employees access Google more than your intranet? Or why new employees seem to use your learning tools more than the grizzly old consultants? It's because on-demand is the real buzzword we should have been thinking of all the time. &lt;a href=&quot;http://wadatripp.wordpress.com/2010/01/22/learning-in-3d-nugget-16-2/&quot;&gt;Information in context, trumps instruction out of context&lt;/a&gt;. The power of Google is in being able to provide answers to people's current problems and needs. A new hire doesn't want to look silly in her new job, so she does all she can to get up-to-speed with her new job. She's happy to go through badly crafted materials on your intranet because it answers her emotional need to feel competent. Isn't it ironic then that we focus all our efforts on creating entertaining sessions and pretty elearning when a similar effort to meet people at the point of need could potentially reap greater rewards?&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Training seeks to solve tomorrow's problems using yesterday's wisdom. I'm not saying yesterday's wisdom is not valuable - indeed it is. All I'm saying that our work is changing in a way that yesterday's wisdom can only guide decision making for the new problems we'll face tomorrow. Our approach has some fundamental drawbacks, which &lt;a href=&quot;http://wadatripp.wordpress.com/2007/02/16/the-big-question/&quot;&gt;Tony Driscoll very eloquently describes as the seven scary problems of our status quo&lt;/a&gt;. To me, it tries to overcomplicate what could be a very simple solution e.g. connecting a newbie to an experienced coach, or finding her some advice. We need to simplify our approach and move the availability of training and education to the workplace.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-weight: bold; font-size: 130%;&quot;&gt;We need Diverse Solutions&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;img src=&quot;http://dl.dropbox.com/u/478762/diversesolutions.png&quot; alt=&quot;&quot; style=&quot;margin: 0pt auto 10px; display: block; text-align: center; width: 560px; height: 345px;&quot; title=&quot;&quot;&gt;&lt;/img&gt;We're beyond the point where a single solution can solve all performance problems. &lt;a href=&quot;http://www.learninggeneralist.com/2009/11/learning-to-learn-in-modern-enterprise.html&quot;&gt;People learn iteratively and over time&lt;/a&gt; and when we look across &lt;a href=&quot;http://www.learninggeneralist.com/2010/01/use-learning-paths-to-develop-right.html&quot;&gt;learning paths for a capability/role&lt;/a&gt;, we'll notice that different outcomes need different learning solutions. More importantly, as &lt;a href=&quot;http://www.learninggeneralist.com/2010/06/sir-ken-robinson-great-inspiration-to.html&quot;&gt;Sir Ken Robinson&lt;/a&gt; says, &lt;span style=&quot;font-style: italic;&quot;&gt;&quot;It's about customizing to your circumstances, and personalizing education to the people you're actually teaching.&quot; &lt;/span&gt;So, the model of courses needs to almost give way to learning suites. I remember my colleague &lt;a href=&quot;http://jchyip.blogspot.com/&quot;&gt;Jason Yip&lt;/a&gt; saying he attended &lt;a style=&quot;font-style: italic;&quot; href=&quot;http://www.amazon.com/Getting-Yes-Negotiating-Agreement-Without/dp/0140157352&quot;&gt;&quot;Getting to Yes&quot;&lt;/a&gt; training that he really benefited from . OTOH, &lt;a href=&quot;http://www.ted.com/talks/al_gore_on_averting_climate_crisis.html&quot;&gt;a little Al Gore talk on TED&lt;/a&gt; has spurred me to learn so much about the climate crisis eventually leading me and my wife to support movements such as &lt;a href=&quot;http://www.350.org/&quot;&gt;350&lt;/a&gt;. And &lt;a href=&quot;http://www.speakingaboutpresenting.com/presentation-myths/learning-styles/&quot;&gt;while learning styles don't really exist&lt;/a&gt;, there are two truths about learning:&lt;br&gt;&lt;/br&gt;&lt;ol&gt;&lt;li&gt;people have different learning preferences and workflows (not &lt;a href=&quot;http://www.businessballs.com/vaklearningstylestest.htm&quot;&gt;VAK&lt;/a&gt; - sorry);&lt;/li&gt;&lt;li&gt;and different topics merit different treatments&lt;/li&gt;&lt;/ol&gt;The key operative word is &lt;span style=&quot;font-style: italic;&quot;&gt;'different'&lt;/span&gt; and we need to be able to craft diverse learning solutions to be able to cater to our audience and our organisational capabilities.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-size: 130%;&quot;&gt;Deep Specialisation in Business, Diverse L&amp;amp;D Skills&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;br&gt;&lt;/br&gt;If whatever I've said until now is true - our age of chaos, the need to bring learning to the workplace, and the need to be diverse; frankly, it's really difficult for a &lt;span style=&quot;font-style: italic;&quot;&gt;'generic'&lt;/span&gt; L&amp;amp;D consultant to achieve all this, without a strong appreciation of the business. The evolution of the modern L&amp;amp;D professional has to be in the direction of specialising and generalising at the same time. This is a bit of an oxymoron, except that learning professionals need to specialise in their organisation's business and generalise in the L&amp;amp;D space. This makes it easy for us to create contextualised solutions for the business that make absolute sense, as well as &lt;a href=&quot;http://www.learninggeneralist.com/2010/05/one-trick-pony-or-problem-solving.html&quot;&gt;pick from a plethora of tools that this age has put at our disposal&lt;/a&gt;. Fortunately this isn't impossible - &lt;a href=&quot;http://www.learninggeneralist.com/2010/05/changing-our-trainer-mindsets.html&quot;&gt;we just need to shift from our 'trainer' mindsets&lt;/a&gt;. As we open our mind to the possibilities, we'll realise that:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;Our job as L&amp;amp;D professionals is to ensure a timely response people's need to learn.&lt;/li&gt;&lt;li&gt;When we need to push learning, we need to &lt;a href=&quot;http://www.aconventional.com/2010/07/trainer-of-future.html&quot;&gt;create the affective context for learning via stories, simulations, and scenarios&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.learninggeneralist.com/2010/08/thoughtworks-university-story-of-our.html&quot;&gt;Training programs with simulated pain points and resultant skill practice&lt;/a&gt; create lasting impact and aid retention.&lt;/li&gt;&lt;li&gt;Our job is not just to teach content, but to also &lt;a href=&quot;http://www.jarche.com/2010/04/instructional-or-formal-whatever/&quot;&gt;create the context for learning in the workplace&lt;/a&gt;. At a minimum, this means helping people &lt;span style=&quot;font-style: italic;&quot;&gt;'learn to learn'&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;We can't possibly account for all the knowledge in the enterprise or teach our way out of trouble. By &lt;a href=&quot;http://www.learninggeneralist.com/search/label/social%20learning&quot;&gt;connecting people to other people&lt;/a&gt; we ensure that collective problems merit collective solutions.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.learninggeneralist.com/2010/07/social-learning-without-technology-7.html&quot;&gt;Not all new solutions are technical&lt;/a&gt; - our facilitation experience still counts for something.&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;/hr&gt;Our training departments aren't dead - they're reborn. All we need to do, is wake up to the reality of our modern world and revel in the options it has given us today. Workscaping can happen at every level - your next training program, your team, your office, and your entire organisation. The key is to think lean and find the most effective and yet the most timely ways for people to learn in the context of their everyday jobs. That's when we can evolve to being true learning organisations.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;What do you think? I'd love to hear your thoughts in the comments section of this post. Don't be bashful, drop in a line or two!&lt;div class=&quot;blogger-post-footer&quot;&gt;© Sumeet Moghe, 2009&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8396317-3955303707332276850?l=www.learninggeneralist.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=cJsUj6sS1ho:V4YwpZ6SJ80:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=cJsUj6sS1ho:V4YwpZ6SJ80:-BTjWOF_DHI&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=cJsUj6sS1ho:V4YwpZ6SJ80:-BTjWOF_DHI&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=cJsUj6sS1ho:V4YwpZ6SJ80:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=cJsUj6sS1ho:V4YwpZ6SJ80:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=cJsUj6sS1ho:V4YwpZ6SJ80:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=cJsUj6sS1ho:V4YwpZ6SJ80:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=cJsUj6sS1ho:V4YwpZ6SJ80:YwkR-u9nhCs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=YwkR-u9nhCs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=cJsUj6sS1ho:V4YwpZ6SJ80:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=cJsUj6sS1ho:V4YwpZ6SJ80:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/sawZ/~4/cJsUj6sS1ho&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Thu, 02 Sep 2010 07:00:41 +0000</pubDate>
	<author>noreply@blogger.com (Sumeet Moghe)</author>
</item>
<item>
	<title>Simon Brunning: Links for 2010-09-01 [del.icio.us]</title>
	<guid isPermaLink="false">http://del.icio.us/brunns#2010-09-01</guid>
	<link>http://feedproxy.google.com/~r/SmallValuesOfCool/~3/DFEzOgSpqSw/brunns</link>
	<description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.guardian.co.uk/music/musicblog/2010/sep/01/gender-stereotypes-indie-music&quot;&gt;Ask the indie professor: Are gender stereotypes still present in indie music?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 02 Sep 2010 07:00:00 +0000</pubDate>
</item>
<item>
	<title>Vivek Singh: DevCamp Bangalore 2010 on September 4th, 2010</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3971530916035134461.post-7693065570648982391</guid>
	<link>http://petmongrels.blogspot.com/2010/09/devcamp-bangalore-2010-on-september-4th.html</link>
	<description>On behalf of ThoughtWorks.&lt;div&gt;------&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;We're happy to announce the third edition of DevCamp Bangalore - DevCamp Bangalore 3 (&lt;/span&gt;&lt;a href=&quot;http://bangalore.devcamp.in/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt; http://devcamp.in/index.php/Bangalore&lt;/span&gt;&lt;/a&gt;&lt;span&gt; ) on Saturday,&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;September 4th, 2010.&lt;/span&gt;&lt;/b&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span&gt;The event will be sponsored &amp;amp; hosted by ThoughtWorks (&lt;/span&gt;&lt;a href=&quot;http://www.thoughtworks.com/&quot; target=&quot;_blank&quot;&gt;&lt;span&gt; www.thoughtworks.com&lt;/span&gt;&lt;/a&gt;&lt;span&gt; ) at their office in Diamond District, Bangalore. ( &lt;a href=&quot;http://is.gd/ejWkd&quot; target=&quot;_blank&quot;&gt;View map&lt;/a&gt; )&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Registration&lt;/b&gt;&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;Like any BarCamp, &lt;a href=&quot;http://devcamp.in/index.php/Bangalore/2010/Registrations&quot; target=&quot;_blank&quot;&gt;registration&lt;/a&gt; is on the wiki and there is no registration fee.&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;span&gt;DevCamp is an un-conference by the hackers, for the hackers and of the hackers. It's a species of BarCamp where anything a lover of computers and technology would consider important or entertaining goes. The first DevCamp took place a little over two years ago, and we've always had a lot of fun being a part of this event; we're hoping to keep that trend going with DCB3.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;What's in store?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;DCB3 is going to be packed with informative &lt;b&gt;presentations, Fishbowl sessions, lightning talks,&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;and much more, so don't miss it!&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;br&gt;&lt;/br&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;b&gt;Interested in doing a session?&lt;/b&gt;&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Please keep in mind the fact that everyone at DevCamp is a hacker, a pro. Assume a high level of exposure and knowledge on the part of your audience, and tailor your sessions accordingly. Avoid 'Hello World' and how-to sessions which can be easily found on the net. First hand war stories, in-depth analyses of topics, and live demos are best.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;br&gt;&lt;/br&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;Add your abstract/presentation topic &lt;a href=&quot;http://devcamp.in/index.php/Bangalore/2010/Proposals&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot;&gt;&lt;br&gt;&lt;/br&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-size: 85%;&quot;&gt;&lt;span&gt;There are just 3 days left, so don't forget to sign up, and do pass the message along to anyone you think would be interested.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;We hope to see you there!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/br&gt;&lt;div&gt;-----&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/3971530916035134461-7693065570648982391?l=petmongrels.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 02 Sep 2010 04:51:08 +0000</pubDate>
	<author>noreply@blogger.com (Vivek Singh)</author>
</item>
<item>
	<title>Sam Newman: links for 2010-09-01</title>
	<guid isPermaLink="false">http://www.magpiebrain.com/2010/09/01/links-for-2010-09-01/</guid>
	<link>http://feedproxy.google.com/~r/Magpiebrain/~3/tCii5xzKIzA/</link>
	<description>&lt;ul class=&quot;delicious&quot;&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://www.exampler.com/blog/2010/09/01/editing-trees-in-clojure-with-clojurezip/&quot;&gt;“Editing” trees in Clojure with clojure.zip&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/clojure&quot;&gt;clojure&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/zip&quot;&gt;zip&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/tree&quot;&gt;tree&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://www.darkcoding.net/software/setting-up-munin-on-ubuntu/&quot;&gt;Graham King » Setting up Munin on Ubuntu&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/ubuntu&quot;&gt;ubuntu&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/munin&quot;&gt;munin&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/monitoring&quot;&gt;monitoring&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/sysadmin&quot;&gt;sysadmin&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/devops&quot;&gt;devops&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://munin-monitoring.org/&quot;&gt;Munin – Trac&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-extended&quot;&gt;A Linux tool for monitoring resource trends&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/apache&quot;&gt;apache&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/resource&quot;&gt;resource&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/analysis&quot;&gt;analysis&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/logging&quot;&gt;logging&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/monitoring&quot;&gt;monitoring&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/sysadmin&quot;&gt;sysadmin&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/devops&quot;&gt;devops&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/munin&quot;&gt;munin&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://lanyrd.com/&quot;&gt;Lanyrd | the social conference directory&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/twitter&quot;&gt;twitter&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/conference&quot;&gt;conference&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/simonwillison&quot;&gt;simonwillison&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://gigix.agilechina.net/2010/9/1/migrating-to-a-decent-scm&quot;&gt;透明思考 | Migrating To A Decent SCM&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-extended&quot;&gt;How to move several thousand devs from clearcase to SVN in 7 days. ish.&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/scm&quot;&gt;scm&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/devops&quot;&gt;devops&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/clearcase&quot;&gt;clearcase&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/svn&quot;&gt;svn&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class=&quot;delicious-link&quot;&gt;&lt;a href=&quot;http://www.graylog2.org/&quot;&gt;Home – Graylog2 – Free Open Source remote TCP/UDP Syslog daemon with Web Interface&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;delicious-extended&quot;&gt;An open-source syslog storage and viewing system using MongoDB and rails&lt;/div&gt;
&lt;div class=&quot;delicious-tags&quot;&gt;(tags: &lt;a href=&quot;http://delicious.com/padark/syslog&quot;&gt;syslog&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/syadmin&quot;&gt;syadmin&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/logging&quot;&gt;logging&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/devops&quot;&gt;devops&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/rails&quot;&gt;rails&lt;/a&gt; &lt;a href=&quot;http://delicious.com/padark/mongodb&quot;&gt;mongodb&lt;/a&gt;)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=tCii5xzKIzA:t8_2LOt6vUk:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=tCii5xzKIzA:t8_2LOt6vUk:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=tCii5xzKIzA:t8_2LOt6vUk:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?i=tCii5xzKIzA:t8_2LOt6vUk:D7DqB2pKExk&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?a=tCii5xzKIzA:t8_2LOt6vUk:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Magpiebrain?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 01 Sep 2010 21:03:12 +0000</pubDate>
</item>
<item>
	<title>Ye Zheng: 咨询师 != 救世主</title>
	<guid isPermaLink="true">http://dreamhead.blogbus.com/logs/74175706.html</guid>
	<link>http://dreamhead.blogbus.com/logs/74175706.html</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://shenheng.blogbus.com/&quot; target=&quot;_blank&quot;&gt;shenheng&lt;/a&gt;对《&lt;a href=&quot;http://dreamhead.blogbus.com/logs/74044317.html&quot; target=&quot;_blank&quot;&gt;系统复杂之路&lt;/a&gt;》评论道：&lt;br&gt;&lt;/br&gt;连自己也维护不了的代码，难道可以靠神一般的咨询师？玩笑开大了吧，咨询师的到来，与葬礼上的神父无异！&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;strong&gt;咨询师会带来天翻地覆的变化，这样的期许本身就是不现实的。&lt;/strong&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;其实，我也不喜欢咨询师。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;做咨询之前，我一直想不通，有什么问题自己搞不定，非要请咨询师。&lt;a href=&quot;http://osthoughts.blogbus.com/&quot; target=&quot;_blank&quot;&gt;founder_chen&lt;/a&gt;说，如果大家都像你一样，咨询就没活干了。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;可惜，世界上还有很多咨询师，后来，我也成了一个。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;做咨询一段时间，我常困惑于我到底可以给客户带来什么。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;于今，我释然了。我只不过关注着一些那些人不曾关注过的东西，比如软件设计，比如Clean Code，比如重构，比如TDD，比如如何做程序员，比如如何做事。而在客户那里，我所做的，只是把这些东西以他们习惯的方式展现给他们。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;我只是打开一扇门。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;做了个培训，结尾，有人问，怎样才能保证设计的一些东西在后续的开发过程中不被破坏。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;好问题，保证不了。&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;真正保证设计不被破坏的是团队，而不是软件设计本身。团队里需要有人知道代码应该写成什么样子，需要有人清楚系统架构是什么样子，需要有人有正义感，在有人无心伤害时，敢于出来喊一嗓子。&lt;/p&gt;
&lt;p&gt;在原有的环境下，这样的人对于其他的工作方式知之甚少。不是他们不努力，很多时候，他们只是不知道自己不知道。我所能带给他们的就是，让他们知道另一片风景的存在。&lt;/p&gt;</description>
	<pubDate>Wed, 01 Sep 2010 15:48:31 +0000</pubDate>
</item>
<item>
	<title>ThoughtWorks Studios: Best practices for adaptive software teams</title>
	<guid isPermaLink="false">http://community.thoughtworks.com/posts/5a0806a3aa</guid>
	<link>http://feedproxy.google.com/~r/ThoughtworksStudios/~3/lHzTQ2CxI5Q/5a0806a3aa</link>
	<description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://community.thoughtworks.com/people/ae2fa901f2&quot;&gt;Adam Monago&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;p&gt;Software teams, in the broader sense, are complex adaptive systems.  They live within organizations populated by many actors, influenced by the methods, practices and behaviors that coexist with them.  Most of all, they have the capability to learn and adapt to each new entrant into their world.  It is for this reason that, we tend to avoid recommending ‘best practices’ that all software teams can follow for success, let alone ‘agility’.&lt;/p&gt;
&lt;p&gt;At &lt;a href=&quot;http://www.thoughtworks-studios.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; title=&quot;ThoughtWorks Studios&quot;&gt;ThoughtWorks Studios&lt;/a&gt;, we have defined our ideal state as being one of &lt;a href=&quot;http://continuousdelivery.com/2010/08/continuous-delivery-vs-continuous-deployment/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; title=&quot;Continuous Delivery&quot;&gt;continuous delivery&lt;/a&gt;: one in which the customers and users of software have maximum ownership and influence of the development process.&lt;/p&gt;
&lt;p&gt;Read the full article at Tech Journal South (&lt;a href=&quot;http://www.techjournalsouth.com/2010/09/best-practices-for-adaptive-software-teams/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; title=&quot;Best practices for adaptive software teams at Tech Journal South&quot;&gt;http://www.techjournalsouth.com/2010/09/best-practices-for-adaptive-software-teams/&lt;/a&gt;)&lt;/p&gt;
&lt;h3&gt;Keywords&lt;/h3&gt;continuous delivery, adaptive software teams, continuous deployment&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?a=lHzTQ2CxI5Q:AhlBRq2ZJKc:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?i=lHzTQ2CxI5Q:AhlBRq2ZJKc:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?a=lHzTQ2CxI5Q:AhlBRq2ZJKc:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?a=lHzTQ2CxI5Q:AhlBRq2ZJKc:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?i=lHzTQ2CxI5Q:AhlBRq2ZJKc:F7zBnMyn0Lo&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?a=lHzTQ2CxI5Q:AhlBRq2ZJKc:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/ThoughtworksStudios?d=dnMXMwOfBR0&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ThoughtworksStudios/~4/lHzTQ2CxI5Q&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 01 Sep 2010 15:27:54 +0000</pubDate>
</item>
<item>
	<title>Sumeet Moghe: Funniest Pecha Kucha Talk Ever</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-8396317.post-5774541527384290960</guid>
	<link>http://feedproxy.google.com/~r/blogspot/sawZ/~3/d6motnILqWs/funniest-pecha-kucha-talk-ever.html</link>
	<description>&lt;center&gt;&lt;/center&gt;&lt;br&gt;&lt;/br&gt;At TWU, I have heaps of fun doing our little P&lt;a href=&quot;http://www.learninggeneralist.com/2010/07/heres-simple-social-learning-technique.html&quot;&gt;echa Kucha Nights&lt;/a&gt; and last week was no exception. Now I upload the slide-decks &lt;a href=&quot;http://www.slideshare.net/tag/twupk&quot;&gt;here&lt;/a&gt;, but I must say that's never a substitute for a live performance. Plus I've always been wary of scaring our speakers with a video camera in the room. Luckily &lt;a href=&quot;http://sghill.blogspot.com/&quot;&gt;Steven Hill&lt;/a&gt; decided to film himself during &lt;a href=&quot;http://sghill.blogspot.com/2010/08/pecha-kucha-how-to-get-100-hits-on-your.html&quot;&gt;his Pecha Kucha talk&lt;/a&gt; and I had no idea his talk was going to be such a laugh riot! I'm actually going to plug Steven's talk as an example of how simple slides and a relaxed presentation style and rate of speech can have a really memorable impact. Don't miss this, it's absolutely worth the watch.&lt;div class=&quot;blogger-post-footer&quot;&gt;© Sumeet Moghe, 2009&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8396317-5774541527384290960?l=www.learninggeneralist.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=d6motnILqWs:oRFvN1OQc4s:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=d6motnILqWs:oRFvN1OQc4s:-BTjWOF_DHI&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=d6motnILqWs:oRFvN1OQc4s:-BTjWOF_DHI&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=d6motnILqWs:oRFvN1OQc4s:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=d6motnILqWs:oRFvN1OQc4s:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=d6motnILqWs:oRFvN1OQc4s:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=d6motnILqWs:oRFvN1OQc4s:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=qj6IDK7rITs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=d6motnILqWs:oRFvN1OQc4s:YwkR-u9nhCs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?d=YwkR-u9nhCs&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?a=d6motnILqWs:oRFvN1OQc4s:gIN9vFwOqvQ&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/blogspot/sawZ?i=d6motnILqWs:oRFvN1OQc4s:gIN9vFwOqvQ&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/sawZ/~4/d6motnILqWs&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;</description>
	<pubDate>Wed, 01 Sep 2010 14:55:04 +0000</pubDate>
	<author>noreply@blogger.com (Sumeet Moghe)</author>
</item>
<item>
	<title>Kailuo Wang: Testing private methods in RSpec</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-15558048.post-5496982923163262233</guid>
	<link>http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.html</link>
	<description>Why testing private methods? Well, it's not really about private vs public, if you want really fine granular unit tests that always only test no more than a couple of lines of code, you will need to do partial mocking and test private methods.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I heard argument that testing private methods exposes too much implementation and thus makes later refactoring harder. My argument is that unit test is part of the implementation. Fine grained &quot;real unit&quot; tests is very easy to read and understand. They help clarify the intent of that couple of lines of code in your target class. If you change implementation code, it should be perfect normal if you also need to change that simple unit test. On the other hand if your tests are in a larger granularity, then in each test, either you test a lot of code or your use a lot of mocking. Either case, chances are whenever you change implementation, you would need to change even more test code.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Another common practice is to extract private methods to another class and make them public and test from there. &lt;a href=&quot;http://kailuowang.blogspot.com/2010/08/what-drives-my-designing-in-tdd.html&quot;&gt;To me, there are only a few valid reasons to introduce a new class (or in general, to design)&lt;/a&gt;,  being able to test private methods isn't one of them. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Alright, with excuses all said (your argument is welcome), here is how I test private methods in ruby with rspec. I defined a global method in a file called describe_internally.rb in my test folder&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;br&gt;&lt;/br&gt;def describe_internally *args, &amp;amp;block&lt;br&gt;&lt;/br&gt;    example = describe *args, &amp;amp;block&lt;br&gt;&lt;/br&gt;    clazz = args[0]&lt;br&gt;&lt;/br&gt;    if clazz.is_a? Class&lt;br&gt;&lt;/br&gt;        saved_private_instance_methods = clazz.private_instance_methods&lt;br&gt;&lt;/br&gt;        example.before do&lt;br&gt;&lt;/br&gt;             clazz.class_eval { public *saved_private_instance_methods }&lt;br&gt;&lt;/br&gt;        end&lt;br&gt;&lt;/br&gt;        example.after do&lt;br&gt;&lt;/br&gt;             clazz.class_eval { private *saved_private_instance_methods }&lt;br&gt;&lt;/br&gt;        end&lt;br&gt;&lt;/br&gt;    end&lt;br&gt;&lt;/br&gt;end&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;br&gt;&lt;/br&gt;then whenever I need to test private methods for a class (say Foo), I use &quot;describe_internally Foo&quot; instead of &quot;describe Foo&quot;. If you prefer, you can organize these two types of tests in the same file as the below example (say Foo is a class with two methods-a public one: &quot;kick&quot; and a private one: &quot;aim&quot; which returns the target to be kicked)&lt;br&gt;&lt;/br&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;br&gt;&lt;/br&gt;describe Foo do&lt;br&gt;&lt;/br&gt;   describe &quot;kick&quot; do&lt;br&gt;&lt;/br&gt;     it &quot;should kick at where aim is&quot; do &lt;br&gt;&lt;/br&gt;        foo = Foo.new         &lt;br&gt;&lt;/br&gt;        foo.should_receive(:aim).with(steve_jobs).and_return :a_place&lt;br&gt;&lt;/br&gt;        foo.kick steve_jobs&lt;br&gt;&lt;/br&gt;        steve_jobs.should be_kicked_at :a_place &lt;br&gt;&lt;/br&gt;     end&lt;br&gt;&lt;/br&gt;   end&lt;br&gt;&lt;/br&gt;end&lt;br&gt;&lt;/br&gt;describe_internally Foo do&lt;br&gt;&lt;/br&gt;   describe &quot;aim&quot; do &lt;br&gt;&lt;/br&gt;      it &quot;should aim at where the butt is&quot; do&lt;br&gt;&lt;/br&gt;           Foo.new.aim(steve_jobs).should be steve_jobs.butt&lt;br&gt;&lt;/br&gt;      end    &lt;br&gt;&lt;/br&gt;   end&lt;br&gt;&lt;/br&gt;end&lt;br&gt;&lt;/br&gt;&lt;/span&gt;&lt;br&gt;&lt;/br&gt;If you need an even more fine control of the scope of where you want private methods exposed, Jay Fields wrote a blog long ago giving another approach to achieve it &lt;a href=&quot;http://blog.jayfields.com/2007/11/ruby-testing-private-methods.html&quot;&gt;http://blog.jayfields.com/2007/11/ruby-testing-private-methods.html&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/15558048-5496982923163262233?l=kailuowang.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot;&gt;&lt;/img&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 01 Sep 2010 13:31:23 +0000</pubDate>
	<author>noreply@blogger.com (Kailuo Wang)</author>
</item>

</channel>
</rss>
