tag:blogger.com,1999:blog-213835362024-03-13T04:27:34.687+02:00David Campey: Mind wellNotable Buckets drawn from the windlass of a life spent coding, coaching, creating.<br>
My credo: "Never waste a drop of talent"Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.comBlogger47125tag:blogger.com,1999:blog-21383536.post-45942967700175354792015-05-15T14:03:00.000+02:002015-05-15T14:03:04.134+02:00Scrum-i-kanban-agilistic-xp-lean-ido-cious<div class="tr_bq">
<div>
Breaking it down:</div>
<div>
<a href="http://en.wikipedia.org/wiki/Scrum_%28software_development%29" target="_blank">scrum</a> <i>i</i> <a href="http://en.wikipedia.org/wiki/Kanban_(development)" target="_blank">kanban</a> <a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">agilistic</a> <a href="http://en.wikipedia.org/wiki/Extreme_programming" target="_blank">xp</a> <a href="http://en.wikipedia.org/wiki/Lean_software_development" target="_blank">lean</a> <a href="http://www.bothsidesofthetable.com/2009/11/19/what-makes-an-entrepreneur-four-lettersjfdi/" target="_blank">i do</a> <a href="http://www.thefreedictionary.com/-ious" target="_blank">cious</a></div>
<br />
Scrumikanbanagilisticxpleanidocious is a word I dreamed up, this is its story.<br />
<h2>
<span style="color: inherit; font-size: inherit;">It sounds like: </span>supercalifragilisticexpialidocious</h2>
</div>
This wonderful word enters many english-speakers vocabulary at an early age thanks to that great coach, <a href="http://en.wikipedia.org/wiki/Mary_Poppins_(character)" target="_blank">Mary Poppins</a>. Even though the sound of it is something quite atrocious.<br />
<br />
For those who (sadly) missed Disney's musical gem, here's a refresher:<br />
<blockquote>
Reporter: There probably aren't words to describe your emotions.<br />
<br />
Mary Poppins: Now, now, now, now, gentlemen, please. On the contrary, there's a very good word. Am I right, Bert?<br />
<br />
Bert: Tell 'em what it is.</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/tRFHXMQP-QU/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/tRFHXMQP-QU?feature=player_embedded" width="320"></iframe><br />
<br />
<br />
<h2>
agile/lean mashings</h2>
<a href="http://4.bp.blogspot.com/--NA-6y4RZ6g/VVXPxSSnOkI/AAAAAAAAKQA/eQbPm82_nVI/s1600/DSC_2057.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/--NA-6y4RZ6g/VVXPxSSnOkI/AAAAAAAAKQA/eQbPm82_nVI/s320/DSC_2057.JPG" width="180" /></a>I was in-flight from Cape Town to Barcelona to give a <a href="http://ale2012.alenetwork.eu/speaker-campey-etal/" target="_blank">talk on contracts</a> at the <a href="http://ale2012.alenetwork.eu/" target="_blank">ALE unconference</a> (yes, back in 2012), overflowing with enthusiasm.<br />
<br />
Looking forward to a mash-up of great people in the European Agile and Lean worlds, I had a think about what we were doing as an industry.<br />
<br />
There is a lot going on, with different schools of thought coming together, clashing, dancing, growing.<br />
<br />
We each choose a particular subset of them all to find a way to create great software.<br />
<br />
"There probably aren't words to describe it all"<br />
<br />
But, "On the contrary, there's a very good word. It's...<br />
<br />
<h2 style="clear: both;">
scrumikanbanagilisticxpleanidocious</h2>
<div>
Bringing together:<br />
<br />
<ul>
<li><a href="http://en.wikipedia.org/wiki/Scrum_%28software_development%29" target="_blank">scrum</a> <i>i</i></li>
<li><a href="http://en.wikipedia.org/wiki/Kanban_(development)" target="_blank">kanban</a></li>
<li><a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">agilistic</a></li>
<li><a href="http://en.wikipedia.org/wiki/Extreme_programming" target="_blank">xp</a></li>
<li><a href="http://en.wikipedia.org/wiki/Lean_software_development" target="_blank">lean</a></li>
<li><a href="http://www.bothsidesofthetable.com/2009/11/19/what-makes-an-entrepreneur-four-lettersjfdi/" target="_blank">i do</a> </li>
<li><a href="http://www.thefreedictionary.com/-ious" target="_blank">cious</a></li>
</ul>
</div>
<div>
(even though the sound of it is something of a process).<br />
<br />
And that's what we do: a weird & wonderful mash-up portmanteau of the bits that fit from what we find in the toolboxes of others.<br />
<br /></div>
<div>
I was so taken with it that I stood up in front of a room of people, many of whom I admired, but (mostly) hadn't met and said it as the first lightning talk. That was the start of a very #alesome conference.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-mQ067ZFjBjM/VVXQzWtzKCI/AAAAAAAAKQM/My2_nvvl8xI/s1600/DSC_2059.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://2.bp.blogspot.com/-mQ067ZFjBjM/VVXQzWtzKCI/AAAAAAAAKQM/My2_nvvl8xI/s640/DSC_2059.JPG" width="640" /></a></div>
<br />
<br /></div>
<div>
Enjoy the word, use it for awesome.<br />
<br />
:D</div>
Anonymoushttp://www.blogger.com/profile/18369890438370913658noreply@blogger.com0Barcelona, Barcelona, Spain41.3850639 2.173403499999949441.1944764 1.8506799999999495 41.5756514 2.4961269999999494tag:blogger.com,1999:blog-21383536.post-6156612116429761932015-05-12T14:40:00.001+02:002015-05-15T10:26:31.302+02:00CoderDojo Cape TownA few years back I met a young soul exploring software development. He had programmed some robots, learnt some python and gotten himself to a python conference to meet other geeks.<br />
<br />
His name was Sam, he was 10. And he needed someone to help him get unstuck and take the next steps.<br />
<div>
<br />
I really, really wanted to teach youngsters coding.<br />
<div>
<br /></div>
<div>
By this stage, I'd seen too many well-meaning attempts die in analysis paralysis trying to figure out a curriculum, where to recruit learners etc, et cetera ad nauseam.<br />
<br />
<h2>
Just do it</h2>
<br />
Instead, I said: "Why don't you come to my office for 2 hours on a Tuesday afternoon? I'll help you where you get stuck."<br />
<br />
<div>
A few years later and up to 15 (fifteen) 7-14 year-olds (seven to fourteen year-olds) come to our boardroom every Tuesday for coderdojo.<br />
<br />
<a href="http://4.bp.blogspot.com/-TJLIRH4T4uY/VVHx3LFSEHI/AAAAAAAAKPM/bkX6CqfEFX8/s1600/DSC_2779.JPG"><img border="0" src="http://4.bp.blogspot.com/-TJLIRH4T4uY/VVHx3LFSEHI/AAAAAAAAKPM/bkX6CqfEFX8/s400/DSC_2779.JPG" /></a><br />
<br />
Our neighbours Esteq have offered up their boardroom for overflow, which is amazing.<br />
<br />
<a href="http://1.bp.blogspot.com/-eLHJPJW0b7U/VVHxsKiJy7I/AAAAAAAAKPE/caleTqlfvKY/s1600/DSC_3174.JPG"><img border="0" src="http://1.bp.blogspot.com/-eLHJPJW0b7U/VVHxsKiJy7I/AAAAAAAAKPE/caleTqlfvKY/s400/DSC_3174.JPG" /></a><br />
<br />
<h2>
Format</h2>
<br />
It is (lightly) organised chaos, in the manner of a self-organised learning environment. It closely mirrors professional software development.<br />
<br />
We do a standup (what did you do last week, what will you do this week, who wants to help) and emotional check-in (using charts4hearts) to kick off each class. Then the kids pair/swarm to find interesting things to do. Sweets are at 4pm or for completing collaboratively-chosen missions.<br />
<br />
<h2>
CoderDojo</h2>
</div>
<div>
coderdojo (<a href="http://coderdojo.com/" target="_blank">coderdojo.com</a>) "free coding clubs for young people": It's a thing, and when I looked at it, found that it's similar to what we do, so we signed up and took up their flag.<br />
<br />
Our dojo page is at <a href="https://zen.coderdojo.com/dojo/113" target="_blank">zen.coderdojo.com/dojo/113</a>.<br />
<br />
<h2>
Syllabus</h2>
<br />
We have no official syllabus, but a collection of activities. Over time, this has evolved into:<br />
<ul>
<li><a href="http://armorgames.com/play/6061/light-bot-20" target="_blank">lightbot 2.0</a>: program the robot through all the puzzles </li>
<li><a href="https://scratch.mit.edu/" target="_blank">scratch</a>: do the tutorial, remix something </li>
<li><a href="http://wordpress.com/" target="_blank">wordpress.com</a> (make a blog) </li>
<li><a href="http://openbookproject.net/thinkcs/python/english3e/hello_little_turtles.html" target="_blank">hello little turtles</a>: generally get started with the first few points and then explore </li>
<li>turtle quest: a skills tree I developed covering drawing squares, triangles (then a house), input, and functions. </li>
<li><a href="https://codecombat.com/" target="_blank">code combat</a>: battle the dungeon, beat the free levels </li>
<li><a href="https://inventwithpython.com/" target="_blank">invent your own computer games with python</a> (book): work through the chapters (10 yrs+ for reading level) </li>
</ul>
<h2>
Next steps</h2>
We've reached the limit of what we can do in our boardroom (overflowed already) and what I can personally do. We have:<br />
<ul>
<li>a great uchi deshi (back room) WhatsApp channel with keen helpers </li>
<li>an agreement from the CEO at an epic company in the Waterfront to run one at their training room. </li>
<li>a keen facilitator in the southern suburbs to train including kids from the Cape Flats </li>
<li>a school in Sea Point looking to start a coding club </li>
<li>a potential venue at the Science Centre </li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-GnNhSiK0ZEw/VVHzVdSnraI/AAAAAAAAKPY/tcFoFltX7m0/s1600/DSC_2956.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="http://3.bp.blogspot.com/-GnNhSiK0ZEw/VVHzVdSnraI/AAAAAAAAKPY/tcFoFltX7m0/s400/DSC_2956.JPG" width="400" /></a></div>
<div>
<br /></div>
<br />
If you're in Cape Town, come collaborate with us, (check out our <a href="https://zen.coderdojo.com/dojo/113" target="_blank">dojo page</a> for details) this is your invitation.<br />
<br />
If you're somewhere else in the world and you want to get involved, check out <a href="http://coderdojo.com/">coderdojo.com</a> for a dojo near you.</div>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/18369890438370913658noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-5759551061228439872015-04-10T10:45:00.003+02:002015-04-10T10:47:53.051+02:00CodeSpeed2: It's alive!<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
We've gotten together again (a little under two years later) to do some more work on codespeed2.</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-5lGngE8QMdE/VSeKdCNOEQI/AAAAAAAAKOQ/cCVIYOu36vQ/s1600/DSC_3101.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-5lGngE8QMdE/VSeKdCNOEQI/AAAAAAAAKOQ/cCVIYOu36vQ/s1600/DSC_3101.JPG" height="225" width="400" /></a></div>
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
Achieved:</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<span style="font-size: 12.8000001907349px;"> - unassisted deploy by Maciej</span></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<div style="font-size: 12.8000001907349px;">
- get the runner working with the new json data format (protocol v1) (yay)</div>
<div>
- some niggly bug fixes</div>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<b><br /></b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
Matt has put together screenshots based on submission of the first new runner result (against the two-year old data dump we used for testing).</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<b>Home page</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<img alt="Inline images 3" class="CToWUd a6T" height="276" src="https://mail.google.com/mail/u/0/?ui=2&ik=61ddff15d4&view=fimg&th=14c9e7d334c7cd8c&attid=0.4&disp=emb&realattid=ii_14c9e7b1234bd3f4&attbid=ANGjdJ91LPDTaZNcX9Q0ElRHzeu5oFB9uTVmUEX7iQOgiUFWwxIm1YavJzbcjmnPyG1gL9zXnnG1_auxQoRf8GeTMxpBz_gipaoiFESBLcHT4QgfCMQOLfimm-OYtlA&sz=w1124-h552&ats=1428589263306&rm=14c9e7d334c7cd8c&zw&atsh=1" style="cursor: pointer; outline: 0px;" tabindex="0" width="562" /><br />
<div class="a6S" dir="ltr" style="left: 474px; opacity: 1; position: absolute; top: 362px;">
<div aria-label="Download attachment image.png" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Download" id=":3m1" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="aSK J-J5-Ji aYr" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -219px -129px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
<div aria-label="Save attachment image.png to Drive" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Save to Drive" id=":3m2" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="wtScjd J-J5-Ji aYr aQu" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -41px -47px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
</div>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<b>Changes from last known revision in old data dump (pretty old)</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<img alt="Inline images 4" class="CToWUd a6T" height="289" src="https://mail.google.com/mail/u/0/?ui=2&ik=61ddff15d4&view=fimg&th=14c9e7d334c7cd8c&attid=0.2&disp=emb&realattid=ii_14c9e7bba123539b&attbid=ANGjdJ_LoIgwsHfdoHWlSF5HAEB0GFfKcHpy0A5I0rHlxf8iE66Q7odPzHdZ4JfdjJ04x-4NdW5Ia5EMTxEmn1xl27Ov1G8_kRXRbFXqwBTqRcfUq0kz5kL4JDVO7tk&sz=w1124-h578&ats=1428589263306&rm=14c9e7d334c7cd8c&zw&atsh=1" style="cursor: pointer; outline: 0px;" tabindex="0" width="562" /><br />
<div class="a6S" dir="ltr" style="left: 474px; opacity: 0.01; position: absolute; top: 774px;">
<div aria-label="Download attachment image.png" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Download" id=":3m4" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="aSK J-J5-Ji aYr" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -219px -129px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
<div aria-label="Save attachment image.png to Drive" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Save to Drive" id=":3m5" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="wtScjd J-J5-Ji aYr aQu" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -41px -47px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
</div>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<b>Nice spiky timing data :)</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<img alt="Inline images 1" class="CToWUd a6T" height="270" src="https://mail.google.com/mail/u/0/?ui=2&ik=61ddff15d4&view=fimg&th=14c9e7d334c7cd8c&attid=0.1&disp=emb&realattid=ii_14c9e78e9f569c9f&attbid=ANGjdJ97X0ZscSob7gCI2bAAOLflfieW13BbNKcJHKe_xLWMZ6ETyRsKBchyDNBZ7ipkpAsdfjEla0E1R4am4y6y-QtwBrffBYkMMvrGeu750nqHt-K_mFdnv5ubyUI&sz=w1124-h540&ats=1428589263306&rm=14c9e7d334c7cd8c&zw&atsh=1" style="cursor: pointer; outline: 0px;" tabindex="0" width="562" /><br />
<div class="a6S" dir="ltr" style="left: 474px; opacity: 0.01; position: absolute; top: 1152px;">
<div aria-label="Download attachment image.png" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Download" id=":3lv" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="aSK J-J5-Ji aYr" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -219px -129px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
<div aria-label="Save attachment image.png to Drive" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Save to Drive" id=":3lw" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="wtScjd J-J5-Ji aYr aQu" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -41px -47px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
</div>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<b>The history of that module (also based on old testing data dump)</b></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<img alt="Inline images 2" class="CToWUd a6T" height="282" src="https://mail.google.com/mail/u/0/?ui=2&ik=61ddff15d4&view=fimg&th=14c9e7d334c7cd8c&attid=0.3&disp=emb&realattid=ii_14c9e7a066fb79b3&attbid=ANGjdJ8tyA-pwzfhQGsS5WyfeHyM18_fp9CJ7B4r0zorMoi8JmtvKVEvAarh_nJzjBU9c06FXgTmTLuQYC6CbZSjsP-MRkXrH90g9kDpvDKw66fGvNe7Tr4FmMyuIf0&sz=w1124-h564&ats=1428589263307&rm=14c9e7d334c7cd8c&zw&atsh=1" style="cursor: pointer; outline: 0px;" tabindex="0" width="562" /><br />
<div class="a6S" dir="ltr" style="left: 474px; opacity: 0.01; position: absolute; top: 1527px;">
<div aria-label="Download attachment image.png" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Download" id=":3ly" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="aSK J-J5-Ji aYr" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -219px -129px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
<div aria-label="Save attachment image.png to Drive" class="T-I J-J5-Ji aQv T-I-ax7 L3 a5q" data-tooltip-class="a1V" data-tooltip="Save to Drive" id=":3lz" role="button" style="-webkit-box-shadow: none; background: rgba(0, 0, 0, 0.6); border-radius: 3px; border: 1px solid rgb(115, 115, 115); box-shadow: none; color: #444444; cursor: pointer; display: inline-block; font-size: 11px; font-weight: bold; height: 24px; line-height: 23px; margin-left: 8px; margin-right: 0px; min-width: 0px; outline: 0px; padding: 0px; position: relative; text-align: center; white-space: nowrap; width: 30px;" tabindex="0">
<div class="wtScjd J-J5-Ji aYr aQu" style="background: url(https://ssl.gstatic.com/mail/sprites/newattachmentcards-1203a0f412c82bdc576da4b309729e7f.png) -41px -47px no-repeat; cursor: pointer; display: inline-block; height: 21px; position: relative; vertical-align: middle; width: 21px;">
</div>
</div>
</div>
</div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
<br /></div>
<div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 12.8000001907349px;">
Now we just need to set up the nightlies and see more continuous data :)</div>
Anonymoushttp://www.blogger.com/profile/18369890438370913658noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-88527620294036658152013-07-05T12:42:00.000+02:002013-07-19T16:10:05.525+02:00CodeSpeed2: First Graphs<h2>
First Graphs</h2>
In week 2 of CodeSpeed2, the rewrite of CodeSpeed for pypy and the PSF, we got our first graphs up.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-hW1CYmrs3v8/UekSpGkMTII/AAAAAAAAIIk/xoAnOwsdByc/s1600/DSC_4095.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="http://1.bp.blogspot.com/-hW1CYmrs3v8/UekSpGkMTII/AAAAAAAAIIk/xoAnOwsdByc/s400/DSC_4095.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Malte & Matt just having coaxed a benchmark run into the first bar chart</td></tr>
</tbody></table>
<br />
By the end of the week, we had the first cut on three graphs.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-TNWptr7JVRo/UelHgNvDhSI/AAAAAAAAIJY/myg-VnGC3Vo/s1600/20130705_Revision_graph.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="130" src="http://2.bp.blogspot.com/-TNWptr7JVRo/UelHgNvDhSI/AAAAAAAAIJY/myg-VnGC3Vo/s320/20130705_Revision_graph.PNG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Revision timings</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-Bz1JHEDrNWU/UelHh74FkKI/AAAAAAAAIJg/ff-nbmFwf_M/s1600/20130705_normalized_graph.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="129" src="http://4.bp.blogspot.com/-Bz1JHEDrNWU/UelHh74FkKI/AAAAAAAAIJg/ff-nbmFwf_M/s320/20130705_normalized_graph.PNG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Normalised data</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-xvXQ1QGfPkE/UelHinnhIKI/AAAAAAAAIJo/jzsWCOz83c0/s1600/20130705_history_graph.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="134" src="http://1.bp.blogspot.com/-xvXQ1QGfPkE/UelHinnhIKI/AAAAAAAAIJo/jzsWCOz83c0/s320/20130705_history_graph.PNG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">History graph</td></tr>
</tbody></table>
<br />
These are being drawn from bench mark runner output data submitted via the Cyclone endpoint, persisted to MongoDB, fetched from the API, represented in an Angular.js object and rendered with d3.js.<br />
<h2>
API</h2>
<div>
The API is served up via Cylcone and so far we have the endpoints below.</div>
<h4>
Upload</h4>
<div>
<pre style="background-color: white; color: #bb8844; font-family: 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, monospace; font-size: 12px; line-height: 1.4;">/api/raw_benchmark_runner_baseline_output
/api/raw_benchmark_runner_output</pre>
</div>
<h4>
Retrieval</h4>
<div>
<pre style="background-color: white; color: #bb8844; font-family: 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, monospace; font-size: 12px; line-height: 1.4;">/api/c_python_normalized_benchmarks
/api/benchmark_history
/api/benchmark_result</pre>
</div>
<br />
For usage details, tests are in <code>/src/test</code> in the repository <a href="http://bitbucket.org/pypy/codespeed2">bitbucket.org/pypy/codespeed2</a>.<br />
<h2>
Taxonomy</h2>
Also in this week we had some meaningful discussion about what terms mean in this context.<br />
<br />
Best summarised in the following sentence:<br />
<blockquote class="tr_bq">
The runner runs Benchmarks (which are Modules e.g. ai.py) and produces Benchmark_Runner_Output data which contains [one or more] BenchMark_Results</blockquote>
A key observation: the system under test is pypy and the modules (e.g. ai) are the benchmarks being run against that.<br />
<br />
<h2>
Up next: User Experience / Flow</h2>
In the next week we'll be crafting a first take on how users select and navigate data. D3 gives us some interesting options for hyper-linking in the SVG itself.Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0Cape Town, South Africa-33.9248685 18.424055299999964-34.7681915 17.133161799999964 -33.081545500000004 19.714948799999963tag:blogger.com,1999:blog-21383536.post-62415182302344397472013-04-29T14:00:00.000+02:002013-07-19T15:55:34.684+02:00CodeSpeed2: Inception<div dir="ltr">
What're we doing in the CodeSpeed re-write? Well, to get us all on the bus, in our first iteration we started off the first day with an inception deck.<br />
<br />
<h2>
The Inception Deck</h2>
As discussed in Jonathan Rasmusson's Agile Samurai:<br />
<br />
<blockquote>
Many projects get killed before they even get out of the starting blocks.<br />
This is mostly because of the following reasons:<br />
<ol>
<li>They fail to ask the right questions.</li>
<li>They don’t have the courage to ask the tough ones.</li>
</ol>
</blockquote>
So, seeing as we're a courageous bunch and wanted to avoid the fail, we started with an inception deck.<br />
<b><br /></b>
</div>
<h3>
<b>Why are we here?</b>
</h3>
<br />
This project is funded by the PSF and donated time from Information Logistics and is beeing overseen by Maciej Fijalkowski.<br />
The answer we came up with to the question "why are we here?" was:<br />
<blockquote>
Because PSF likes us enough to rewrite codespeed <br />
So that: it has tests on python code and javascript that let you do TDD<br />
So that: Maciej or any interested dev can easily test and implement a feature in an afternoon... and know the answer to: "Does it work?"</blockquote>
<div dir="ltr">
<b><br /></b></div>
<div dir="ltr">
<h3>
<b>Meet the </b><b>Neighbours</b></h3>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-fDQpZGNy-kw/UdbSZWNaH0I/AAAAAAAAH8o/gLujh_PnQ7w/s1600/neighbours.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="224" src="http://2.bp.blogspot.com/-fDQpZGNy-kw/UdbSZWNaH0I/AAAAAAAAH8o/gLujh_PnQ7w/s320/neighbours.png" width="320" /></a></div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
<strong>IL Team:</strong> Matt, Malte, Dave</div>
<div dir="ltr">
<strong>PyPy devs:</strong> Maciej, Alex, ...</div>
<div dir="ltr">
<strong>PSF:</strong> in particular: Jessie, Brett CPython test</div>
<div dir="ltr">
<strong>Greater Community:</strong><br />
Twisted: JP Calderon,<br />
Apple: Glyph,<br />
Linaro,<br />
ARM/Raspberry,<br />
Calxeda<br />
CTPUG: Simon & DavidM</div>
<div dir="ltr">
<b><br /></b></div>
<br style="clear: both;" />
<div dir="ltr">
<h3>
<b>Show the solution</b></h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Pjh2PzyHQTU/UegNFVxuvWI/AAAAAAAAIHw/uZdol64FT-A/s1600/codespeed_solution.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="http://1.bp.blogspot.com/-Pjh2PzyHQTU/UegNFVxuvWI/AAAAAAAAIHw/uZdol64FT-A/s400/codespeed_solution.png" width="400" /></a></div>
<div>
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<blockquote>
"munch munch munch" -- fijall</blockquote>
<br />
Technologies we chose to get started:<br />
<ul>
<li>cyclone io</li>
<li>mongo db</li>
<li>angular.js</li>
<li>d3.js</li>
</ul>
</div>
<div dir="ltr">
<b><br /></b></div>
<div dir="ltr">
<h3>
<b>What's going to give?</b></h3>
</div>
<div dir="ltr">
We'd rather deliver features more slowly and have tests, quality is very important. We are building dev tools here.<br />
<br />
The product can be extended after we're done with this phase.</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
<h3>
<b>What's it going to take?</b></h3>
</div>
<div dir="ltr">
We have 6 weeks</div>
<div dir="ltr">
1: API serving, receiving uploads<br />
2: First graphs<br />
3: ++<br />
4-6: Smart search, statistics</div>
<div dir="ltr">
<br /></div>
<div dir="ltr">
<h3>
<b>What Keeps you up at night?</b></h3>
Not much really, Excited.</div>
<div dir="ltr">
<h3>
<b>Elevator Pitch</b></h3>
For maciej, codespeed2 is a benchmark run visualiser that lets you understand performance.</div>
<div dir="ltr">
Unlike codespeed it is extensible.</div>
<h3>
And, we're off!</h3>
With that quick summary done, we all headed off into the first week.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-fq0lm0mS3ao/UegE7fyiu6I/AAAAAAAAIHg/QqdRcnYhM-s/s1600/codespeed_repo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="http://4.bp.blogspot.com/-fq0lm0mS3ao/UegE7fyiu6I/AAAAAAAAIHg/QqdRcnYhM-s/s400/codespeed_repo.png" width="400" /></a></div>
<br />
In the first week: we got the backend up and running, accepting all the different formats from the runner and persisting to MongoDB. Check out <a href="http://bitbucket.org/pypy/codespeed2">bitbucket.org/pypy/codespeed2</a> for the blow-by-blow.<br />
<br />
Next post: <a href="http://campey.blogspot.com/2013/07/codespeed2-first-graphs.html">week 2 update</a>.Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-34408959282191821302012-03-25T00:02:00.000+02:002012-03-25T00:02:22.952+02:00Code Retreat Take 3<p>Today I hosted the <a href="http://www.meetup.com/Cape-Town-Software-Developers/events/48572072/">third code retreat</a> at <a href="http://www.informationlogistics.co.za/">Information Logistics</a>.</p>
<p>Today was a great success with six awesome developers from around Cape Town pitching up, three of whom I'd never met. We started out with coffee and intros then watched <a href="http://vimeo.com/18955165">Corey's intro</a> to the technique.</p>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-t8WnxN8iyUU/T234GBIsRTI/AAAAAAAAALI/OjQY3Ew8Rsc/s1600/DSC_0780.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="88" src="http://4.bp.blogspot.com/-t8WnxN8iyUU/T234GBIsRTI/AAAAAAAAALI/OjQY3Ew8Rsc/s400/DSC_0780.JPG" width="400" /></a></div>
<h3>Sessions</h3>
<p>We had three sessions before lunch with great pairing, everyone was experienced in <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> so going was good. The pairs explored approaches to <a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway's game of Life</a>, from implementing the rules to different approaches to the universe/environment.</p>
<p>I heard the cries of panic at a stack overflow; we tried a pattern matching approach which ended up newing up the universe and creating lenses. We also got better at facetious implementation and avoiding <a href="http://sourcemaking.com/refactoring/primitive-obsession">primitive obsession</a> generated some great insights on seams and testability. And lots of laughter.</p>
<p>Each session ended after 45 minutes with my annoying alarm going off and us deleting our code (sometimes gratefully). There were enough people today for each session to be with someone new which was excellent.</p>
<h3>Lunch</h3>
<p>Then we sat down to a nice long Thai lunch at Chai-Yo where war stories were shared and a bit more context built. A game of foosball wrapped up the lunch-time and then it was back to coding.</p>
<h3>Pairing without talking</h3>
<p>We had one session after lunch: which for me was the highlight. We tried pairing without talking, with one partner writing tests and the other implementing. This was pure fun, trying to balance leading with tests and challenging er .. challenges. It was almost like a game of chess with each partner playing their move with relish.</p>
<h3>Closing Circle</h3>
<p>This brought us to 15:30 where we had the closing circle, discussing learnings, surprises and things we would change.</p>
<p>Learnings/surprises:
<ul><li>Tests can drive architecture quickly</li>
<li>Fluent syntax for building tests was an easy refactor, and fun</li>
<li>Pairing is all about Attitude, we were all able to pair successfully even though we'd just met</li>
<li>Different people with diferent backgrounds can think very similarly</li>
<li>New adventures in resharper</li>
<li>NUnit TestCase... now we can't go back</li>
<li>The fun of silent pairing</li>
<li>Finding other people who love code</li>
</ul>
</p>
<p>Things we'd change:
<ul><li>More people <a href="http://www.meetup.com/Cape-Town-Software-Developers/events/57708672/">next time</a></li>
<li>Order something more filling at lunch</li>
<li>Bring better dev gear (keyboards/mice/faster laptop)</li>
<li>If the group is big enough, try pair facilitation</li>
</ul>
</p>
<p>And, finally, the group photo.</p>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-0z_WWp-ZZ-I/T236baxKdGI/AAAAAAAAALU/SJ2TSuyan80/s1600/DSC_0781.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="http://3.bp.blogspot.com/-0z_WWp-ZZ-I/T236baxKdGI/AAAAAAAAALU/SJ2TSuyan80/s400/DSC_0781.JPG" width="400" /></a></div>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-44069556582438305582011-12-19T20:39:00.000+02:002011-12-19T20:39:56.516+02:00Scrum Safari 2011: Lightning Talk VideosOn day 2 of the <a href="http://campey.blogspot.com/2011/09/cape-town-scrum-gathering-2011-outline.html">Cape Town Scrum Gathering</a> (a.k.a. Scrum Safari) there were a few lightning talks in the afternoon. I was lucky enough to nab the last slot.<br />
<p><a href="https://twitter.com/#!/patrick_vine">Patrick Vine</a> was at hand to capture the talks and they were posted on vimeo by the <a href="http://www.scrum.org.za/">sugsa</a> committee.</p>
<p>I've collated links to the talks on vimeo with my (somewhat terse) notes from the gathering.</p>
<h3>Annu Augustine: Saying No</h3>
<p>Step 1: Don't say the word no!<br />Instead: not now, let's explore, what if?<br />Listen, understand context, then use the same language<br />To motivate prioritization, show lack of connection to the goal
<br /><a href="http://vimeo.com/29251667">Watch Saying No on vimeo</a>
</p>
<h3>Cara Turner: Achievable Goals</h3>
<p>Maybe we achieved it?<br />Cara took us through how to frame a goal to assist success.
<br /><a href="http://vimeo.com/29257791">Watch Achievable Goals on vimeo</a>
</p>
<h3>Brent: Agile Success</h3>
<p>How to tame the dragon: we can't tame a two headed dragon<br />Client induction is important to get on the same page<br />Working software is different: "We don't build ships like this" -- indeed.
<br /><a href="http://vimeo.com/29257883">Agile Success</a>
</p>
<h3>Pat Vine: Fixed Price Scrum</h3>
<p>Why? The customer wants:<br /><ul>
<li>to know cost</li>
<li>to reduce risk</li>
<li>requirement for tender</li>
</ul>
Fixed cost helps some things: scope, date.<br />Backlog management? + on the end<br />
<a href="http://vimeo.com/29254363">Watch Fixed Price Scrum on vimeo</a>
</p>
<h3>Carlo Kruger: Your sprint review sux</h3>
<p>15 minute tester demo of the sprint!<br /><a href="http://en.wikipedia.org/wiki/Ken_Schwaber">Ken</a>: no applause please, we're just doing our job. If we pattern praise, bad things won't come out.<br />Purpose of the review is to inspect and adapt the product, we need to be exposed to failure to expose learning.<br />If we raise the stakes, we remove space. Rather remove untrusted people. <br />We are inspecting the work of the whole team in a facilitated conversation.<br />Format: Set stage, gather data, generate insight, choose focus.
<br /><a href="http://vimeo.com/29253187">Watch Your sprint review sux on vimeo</a>
</p>
<h3>David Campey: Agile Contracting</h3><p>Check-in: who has seen their contract?<br />There is a tension between customer collaboration and contract negotiation.<br />We do team weeks with money for nothing, <a href="http://www.unboxedconsulting.com/">unboxed</a> does pay for points, <a href="http://www.scrumalliance.org/profiles/46-gabrielle-benefield">Gabby Benefield</a> is suggesting a series of fixed price projects.<br />Some inspection of our contract.<br />This talk relates to my <a href="http://campey.blogspot.com/2011/06/agile-contracting.html">agile contracting series</a>.
<br /><a href="http://vimeo.com/29254892">Watch Agile Contracting on vimeo</a>
</p>
<br/>
<p>All in all a great storm of lightning to spark off new ideas. See you at the next gathering?</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com1tag:blogger.com,1999:blog-21383536.post-91341929118137799252011-09-18T22:46:00.000+02:002013-07-19T16:20:53.984+02:00Cape Town Scrum Gathering 2011: Outline<br />
All of us at Information Logistics took the break from routine to take part in the <a href="http://www.scrum.org.za/gathering-2">Scrum Safari</a>. My mind's still processing the influx of conversations from last week's gathering in Somerset West.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Q4FEAUp0XFI/UelK5nohBSI/AAAAAAAAIJ4/HVNZlr9cnYo/s1600/scrumsafari.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="http://2.bp.blogspot.com/-Q4FEAUp0XFI/UelK5nohBSI/AAAAAAAAIJ4/HVNZlr9cnYo/s400/scrumsafari.jpg" width="400" /></a></div>
<br />
<br />
<br />
Excellent event as usual, well done to the committee and everyone else who helped out in some way. And thanks to all who came along and made this event great.<br />
<br />
Outline of my experience (<a href="http://www.scrum.org.za/gathering-2/speaker-information">speaker details</a>):<br />
<br />
Day 1<br />
<br />
<ol>
<li>Welcome with Austin / Mitch</li>
<li>Boris Gloger's keynote on Agile and Management</li>
<li>Sigi's Leadership talk</li>
<li>Manoj: "It's about the culture, stupid"</li>
<li>Serious Play with Thorsten</li>
<li>Evening chat</li>
</ol>
<div>
Day 2</div>
<div>
<ol>
<li>Scrum clinic - was both doctor and patient</li>
<li><a href="http://campey.blogspot.com/2011/12/scrum-safari-2011-lightning-talk-videos.html">Lightning talks</a> (with a pop-in at the Agile Jazz and Games sessions)</li>
<li>Lean vs Agile keynote with [x]</li>
<li>Team game of pool to wrap up</li>
</ol>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-gPdXs9URY3Q/TnZV3GQYB3I/AAAAAAAAAKU/3nElIyzlsJc/s1600/IMAG1015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="http://4.bp.blogspot.com/-gPdXs9URY3Q/TnZV3GQYB3I/AAAAAAAAAKU/3nElIyzlsJc/s320/IMAG1015.jpg" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
This little red scrum user group book is already sporting twenty-five pages of notes to process, so I'll be attempting to linkify the above list with posts <strike>over the next few weeks</strike> at some point.</div>
</div>
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com2Erinvale Hotel, Lourensford Rd, Cape Town 7130, South Africa-34.0785524 18.8689753-34.1048559 18.8294933 -34.0522489 18.9084573tag:blogger.com,1999:blog-21383536.post-57570832379340357822011-09-16T22:30:00.003+02:002011-09-16T22:30:54.696+02:00Day One at the Gatehouse<div class="separator" style="clear: both; text-align: left;">
For the last while we've been building and putting the finishing touches on our new offices at the Gatehouse in Century City.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Pbn7iZSwkVM/TnOr8dsUcpI/AAAAAAAAAKM/HMcuRfbKej4/s1600/IMAG0341.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://2.bp.blogspot.com/-Pbn7iZSwkVM/TnOr8dsUcpI/AAAAAAAAAKM/HMcuRfbKej4/s320/IMAG0341.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
The main event is three 20 square metre team rooms. The rooms are visually connected with big glass windows but have closing doors for when things get rowdy (or sensitive).<br />
<br />
It's all shiny and new-smelling, the aircon/heating works wonderfully (how often do workspaces miss out on that crucial detail?!) and we have our foosball table plonked in the middle of the common area.<br />
<br />
Building has beautiful internal spaces, (scary) talking elevator, wheelchair accessibility, smart lighting, across the road from the Colosseum mini-mall and is a brief walk away from Canal Walk.<br />
<br />
Joy.<br />
<br />
Today was officially my first full day at the new offices. I spent today pairing with Luke on some enhancements to his project. We set up a mini task-board and happily hacked the day away.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-WxfWdNeaqRo/TnOvMhZv9TI/AAAAAAAAAKQ/QKhY9igh-uU/s1600/IMAG0392.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://3.bp.blogspot.com/-WxfWdNeaqRo/TnOvMhZv9TI/AAAAAAAAAKQ/QKhY9igh-uU/s320/IMAG0392.jpg" width="320" /></a></div>
<br />
<br />
Looking forward to growing our company in the new space.Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-76503397707227050692011-09-15T21:30:00.000+02:002011-09-16T21:29:02.213+02:00Our own medicineThis is the third in my <a href="http://campey.blogspot.com/2011/06/agile-contracting.html">Agile Contracting series</a>.<br />
As with the previous post, this is a verbatim copy of my speech notes, with some mark-up.
<br />
<code>[DL]</code>
<br />
<br />
<h2>
It's about the Why</h2>
Time for our own medicine [mime spoon] joke about mirroring.<br />
<br />
Well, we're working towards alignment, but we also feel the need for a contract.<br />
<br />
It's time for some of our own medicine. Bring out the User story. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-xxSnFk_-T2Q/TnJPw2yF1cI/AAAAAAAAAKE/jwowI88k8yw/s1600/2728096478_554e5768fd.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="http://2.bp.blogspot.com/-xxSnFk_-T2Q/TnJPw2yF1cI/AAAAAAAAAKE/jwowI88k8yw/s400/2728096478_554e5768fd.jpg" width="400" /></a></div>
<br />
<h2>
User Stories</h2>
If we were to write the user story for our contract what would it look like?<br />
<ul>
<li>As a software developer, I want a contract, so that...</li>
<li>As a team, we want a contract, so that...</li>
<li>As a software company, I want a contract so that?</li>
</ul>
<div>
Do we really know?</div>
<div>
<br /></div>
<code>[ to C]</code>
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://farm3.static.flickr.com/2115/5725641861_a36b7aefdb.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="200" src="http://farm3.static.flickr.com/2115/5725641861_a36b7aefdb.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">19th Century Contract<br />
(picture by <a href="http://www.flickr.com/photos/58558794@N07/">kladcat</a>)</td></tr>
</tbody></table>
Okay, no fair. That's not a story, that's an epic.<br />
<br />
And we want the things we want in epics because.. well we're playing catch up, everone else has them.<br />
<br />
Everyone else has them so that makes it good? *side-eye* That's a discussion better left for later.<br />
<code>[C]</code>
<br />
<h2>
Scary Power</h2>
So we know the scary thing about user stories is: like goals, once we define them we set the ball in motion.<br />
<br />
We know the why and the what and the how will inevitably follow.<br />
<br />
So, let's see what this baby can do.<br />
<blockquote>
As a team,<br />
we want this,<br />
so that this great thing happens.</blockquote>
<h2>
Feel the power</h2>
<blockquote>
As a team we want: access to a product owner<br />
so that: we get answers and resolutions quickly and don't have to guess or debate</blockquote>
How: add a clause to the contract!<br />
<br />
<blockquote>
As a team we want: a variable backlog<br />
So that: we can do what is actually needed as we discover it</blockquote>
How: add a clause to the contract!<br />
<br />
<blockquote>
As a team we want: an agile release plan<br />
So that: the client can have expectations that match reality</blockquote>
How: add a clause to the contract.<br />
<br />
<blockquote>
As a team we want: anything<br />
Because of this good reason</blockquote>
How: Add a clause to the contract.<br />
<br />
<br />
So, what do these clauses look like? I'll tell you about ours soon.<br />
First off, some more stories:<br />
<br />
<blockquote>
As a board/person paying<br />
I want to know when we will be expected to pay<br />
so that I can budget and do financial calculations</blockquote>
How: make it clear in the contract<br />
<br />
<blockquote>
As the end user<br />
I want to play with the software early<br />
so that I can stress less and get what I want</blockquote>
How: expose delivery mechanisms in the contract.<br />
<br />
<br />
We can really get our teeth into this product: "the contract" if we bring our formiddable armada to bear on it.<br />
<br />
<h2>
Behaviour Driven Development</h2>
So, what's next? BDD... behaviour driven development.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-LHtLSAaBgxA/TnJRo_jqz9I/AAAAAAAAAKI/gREwWLQ00zw/s1600/3236641811_92aa29d49f.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="http://2.bp.blogspot.com/-LHtLSAaBgxA/TnJRo_jqz9I/AAAAAAAAAKI/gREwWLQ00zw/s320/3236641811_92aa29d49f.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Crazy Crayon Physics Scenario<br />
(picture by <a href="http://www.flickr.com/photos/slopjop/">slopjop</a>)</td></tr>
</tbody></table>
<blockquote>
Given a team working on 2 week sprints<br />
When the sprint commitment is not achieved<br />
Then : these are penalties/discounts</blockquote>
[discussion, examples]<br />
<br />
<br />
<blockquote>
Given a team on hourly Time & Materials<br />
When we run a four week month and everything goes well<br />
Then this is the process and financials</blockquote>
[discussion, smiles]<br />
<br />
<br />
<blockquote>
Given a team paid on Time and Materials<br />
When we get to April 2011 and everyone takes the gap and gets 2 weeks leave<br />
Then how does this baby hold up</blockquote>
[nervous laughter?, discussion]<br />
And what happens to the release plan?
<br />
<br />
<blockquote>
Given a client with cash-flow problems<br />
When they stop paying<br />
Then what do we do?</blockquote>
[explain illusion attern of decline, discussion]<br />
<br />
<h2>
TDD</h2>
The next tool we have is Test Driven Development.<br />
<br />
Pure TDD involves only writing a line of code if you can write a test that makes the product fail.<br />
<br />
So we use scenarios and more focused tests to actually create a contract from the ground up that is tested, testable and has no cruft.<br />
<br />
Then run that by a lawyer <i>with the tests</i> and ask what extra tests you should add.<br />
<br />
<a href="http://campey.blogspot.com/2011/06/agile-contracting.html">Back to Agile Contracting series index.</a>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com2tag:blogger.com,1999:blog-21383536.post-1220994127762194622011-09-15T10:53:00.000+02:002011-09-15T12:55:43.628+02:00Done since last stand-upIn the past we've had the problem of "zoodling" at stand-up (<a href="http://blog.crisp.se/2010/09/01/henrikkniberg/1283373060000">"What to do when scrum doesn't work"</a> Henrik Kniberg SG Cape Town 2010) because you're not quite sure which tasks you've done in the last 24 hours.<br />
<br />
One suggestion is only moving tasks in standup; I find this most unsatisfying. It's great to be able to move that damn task in the heady joy of your victory dance.<br />
<br />
A small innovation that has made a big difference on our task boards is adding a "Done since last stand-up" column. Move your item there on completion, and it sits there, glowing with goodness for all to see, until the next stand-up.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-EsMI-VS1m5M/TnG6lEt-0zI/AAAAAAAAAKA/jbRMjttIbUs/s1600/donesincelast.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="http://3.bp.blogspot.com/-EsMI-VS1m5M/TnG6lEt-0zI/AAAAAAAAAKA/jbRMjttIbUs/s320/donesincelast.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Done since last stand-up in action</td></tr>
</tbody></table>
<br />
<br />
At the next stand-up you just hunt for your initials in that column and you know what you've been doing.<br />
<br />
That is if you were actually working on tasks on the board, if not, well it helps to bring people back onto the board, we like our work to be visible.<br />
<br />
It also helps to make it visible when people have "gone dark" or their task is taking too long.<br />
<br />
And immediately after stand-up the tasks can all move into the Done column.Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-52022722259216967312011-07-17T18:57:00.006+02:002011-07-17T19:24:04.976+02:00The House of Agile<p><em>This post is still in progress, at the moment it's a lightly marked up copy of my full form speech draft of this section. I'll edit it at some point, but for now at least it's up :)</em></p>
<a href="http://campey.blogspot.com/2011/06/agile-contracting.html">Series intro</a>
<h2>The House of Pain?</h2>
<p>The first time I read the manifesto, well... [reverie]...</p>
<p>Who here has read the manifesto? Can you remember the first time you read it?</p>
<blockquote><p>"we are uncovering better ways of developing software by doing it and helping others do it."</p><p>
"Through this work we have come to value:"</p>
</blockquote>
<p>Did you laugh when you read "working software over comprehensive documentation"?</p>
<p>Did you take a hopeful breath when you read "individuals and interactions over processes and tools"?</p>
<p>Did you shake your head ruefully at: "customer collaboration at contract negotiation"?</p>
<p>Or feel frustrated and trapped at "responding to change over following a plan"?</p>
<p>Maybe you felt exactly the opposite?</p>
<p>Why is this first encounter with the manifesto such an emotional one?</p>
<p>Each of these statements contains within it a tension, between open and free on the the one hand and shut and trapped on the other.</p>
<code>[L]</code>
<h2>Four Walls</h2>
<p>We can view these things on the right as walls drawn in on a floorplan for an engagement. We have a choice how we build those walls.</p>
<p><em>There are two extremes:</em></p>
<p>If we choose to build rigid solid, safe, fear-based, spike encrusted walls... we can build ourselves an amazing safe impenetrable, protected ... prison. And live in that prison for months, or years, walking around in the prison yard, feeling frustrated everytime the walls get in the way. But not really knowing what is wrong [ like neo in the matrix]</p>
<p>If we choose to eschew, to disregard, walls entirely, we stand naked in the elements, without a roof over our heads and can end up wandering aimlessly in the wilderness. Like .. hippies flolloping on the hills of woodstock, hey it's fun, it's like cool, um, like what now? Of course, some well knit teams of marines can roam this wilderness, but even they long to have a roof over their heads every now and then.</p>
<p>As neither of these is too attractive, what do we do?
<p>The Buddhists have a concept of right view: "to recognise our ignorance and humbly seek the middle path."
<h2>Walking through walls</h2>
<code>[DL]</code>
<p>Very philosophical, Lets make that more real: Riaan goes to visit his friend Lenny at work and starts to notice all the same patterns, but then... someone walks through a wall!</p>
<blockquote>What? You can't just change the scope?
You fixed a bug without logging it?
That guy just walked through a wall!
<code>[gropes around]</code>
"Hey, you have doors"
</blockquote>
<p>Lenny looks at Riaan long and hard and says, "Uh, yeah, we can walk through walls here." Then to rub it in: "Sometimes we don't get to actually walk through the wall, but at least we can see through it.. we call this a window."</p>
<h2>A False Dichotomy</h2>
<code>[DC]</code>
<p>So, these walls can work for us how..</p>
<p>If we look back at the manifesto:</p>
<blockquote>Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over sticking to a plan
</blockquote>
<p>A conclusion it that it is left or right. Or that we have to tread some sort of compromise between the two.</p>
<p>This is a false dichotomy.</p>
<code>[long pause]</code>
<h2>Door and Window Makers</h2>
<code>[C]</code>
<p>The two don't necessarily contradict. The things on the right are walls, and if built correctly can support, facilitate and improve the flow of things on the left.</p>
<p>The problem is the things on the right are often more tangible, sellable, productisable. We can really get lost in processes, tools, contract negotiation, plans, and documentation when dealing with customer. And we can build walls that disregard and limit the things on the left.</p>
<p>This is why we have to keep these values in mind at every turn while designing and improving our houses.</p>
<p>Scrum, xp and friends contain frameworks, patterns and methodologies of getting through or over walls, And sometimes.. a wrecking ball, sometimes an idea, and sometimes designs for doors and windows that we can build into these walls.</p>
<h2>History Lesson</h2>
<p><code>[UR, sit] [history lesson]</code> snowbird, light, xp scrum, fowler on head, cockburn: lightweight lightweight.</p>
<p>Here I related <a href="http://agilemanifesto.org/history.html">the history of the manifesto</a>, particularly that the manifesto is the meeting of the minds of the door and window makers, who sought to share and find the essence of their door and window patterns.</p>
<h2>Alignment</h2>
<p>The key to achieving success in all of this is recognising our values, recognising that we share those values [look SR] with the client, and making sure that our decisions to build are informed by our shared values.</p>
<code>[DR]</code>
<p>This is known as alignment. Long term relationships are built on alignment.</p>
<p>In the words of Seth Godin:
<blockquote>"Alignment isn't something you say. It's something you do. Alignment is demonstrated when you make the tough calls, when you see if the thing that matters the most to you is also the thing that matters the most to the other person."
</blockquote>
<p>It's a search engine wanting to give you search results as much as you want to get them.</p>
<p>Or a holistic market that wants to give you healthy food as much as you want to buy it.</p>
<p>Or a software company that wants to give you great product as much as you want to buy it.</p>
<h2>And so?</h2>
<code>[C]</code>
<p>So how does this relate to contracting? We now have some background to how I think about these agile values and can now use this foundation to deliver some of our own medicine to the values. Then I'll show you what we do at IL and the financial bits.</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-44735792883531646132011-06-10T21:11:00.006+02:002011-12-20T09:12:11.280+02:00Agile ContractingIn this series of blog posts I'll be posting the content of my recent talk at <a href="http://www.scrum.org.za/">SUGSA</a> Cape Town. Read Cara Turner's <a href="http://www.scrum.org.za/community/past-cpt-events/5-may-event-agile-contracting">Event Report</a> for a good overview.<br />
<a href="http://3.bp.blogspot.com/-FbIly1ii4aI/TimKYQ8-X5I/AAAAAAAAAJ0/nLJDXB1uzWw/s1600/manifesto.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5632184958475722642" src="http://3.bp.blogspot.com/-FbIly1ii4aI/TimKYQ8-X5I/AAAAAAAAAJ0/nLJDXB1uzWw/s400/manifesto.jpg" style="cursor: hand; cursor: pointer; display: block; height: 219px; margin: 0px auto 10px; text-align: center; width: 386px;" /></a>
<br />
These posts will be mainly based on my original speech notes; <strike>the video with actual content will be up at some point soon</strike>.<br />
<h2>
Introduction</h2>
My fellow software developers.<br />
It gives me great joy to be looking out at people who care about getting better at creating software.<br />
<a href="http://4.bp.blogspot.com/-MtXK_EY1a88/TimI1h3mNFI/AAAAAAAAAJk/DVIY_J4KgoU/s1600/sugsa-audience.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5632183262209520722" src="http://4.bp.blogspot.com/-MtXK_EY1a88/TimI1h3mNFI/AAAAAAAAAJk/DVIY_J4KgoU/s400/sugsa-audience.jpg" style="cursor: hand; cursor: pointer; display: block; height: 106px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a>
<br />
Tonight I'll be talking about contracts. Huh? Has this guy not read the <a href="http://agilemanifesto.org/">manifesto for agile software development</a>? we should be talking about customer collaboration, not contract negotiation, right?<br />
Maybe. Just maybe I'll show you how our contracts can facilitate customer collaboration.<br />
<a href="http://2.bp.blogspot.com/-TfPS6fejoZw/TimJW-6zxMI/AAAAAAAAAJs/AEUYLIaT2bA/s1600/taskboard.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5632183836943303874" src="http://2.bp.blogspot.com/-TfPS6fejoZw/TimJW-6zxMI/AAAAAAAAAJs/AEUYLIaT2bA/s400/taskboard.jpg" style="cursor: hand; cursor: pointer; float: left; height: 311px; margin: 0 10px 10px 0; width: 184px;" /></a><br />
Tonight I will share with you
<br />
<ul>
<li>some of my insights into the manifesto for agile software development,</li>
<li>then give our contracts some of our own medicine, to see how we can get them to jump through hoops</li>
<li>how this works at <a href="http://www.informationlogistics.co.za/">Information Logistics</a> and</li>
<li>then finally present a few financial models that support agile contracting.</li>
</ul>
<div style="clear: both;">
<h2>
Sections</h2>
These will be linkified as soon as they're written, for now they're promises.<br />
<ol>
<li><a href="http://campey.blogspot.com/2011/07/house-of-agile.html">House of agile</a></li>
<li><a href="http://campey.blogspot.com/2011/09/our-own-medicine.html">Our own medicine</a></li>
<li>Information Logistics — <a href="http://www.informationlogistics.co.za/company.html">company</a></li>
<li>Financial Models — graphs based on <a href="http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts">Peter Stevens' 10 Contracts</a></li>
</ol>
</div>
<h2>
More talks</h2>
I've subsequently presented some of this material as a <a href="http://campey.blogspot.com/2011/12/scrum-safari-2011-lightning-talk-videos.html">lightning talk at Scrum Safari 2011</a>. It's also been proposed as a topic at Agile Africa 2012Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-44078554613617199702011-05-02T23:26:00.008+02:002011-05-03T02:22:57.770+02:00GAE on Hudson with Mercurial & BitbucketThis post details getting <a href="http://hudson-ci.org/">Hudson</a> to automatically poll a <a href="https://bitbucket.org/">bitbucket</a> <a href="http://mercurial.selenic.com/">mercurial</a> repository and deploy the <a href="http://code.google.com/appengine/">google app engine</a> <a href="http://code.google.com/appengine/docs/python/gettingstarted/helloworld.html">python hello world</a> project.
<h2>Debian install</h2>
Just installed hudson on our Debian Lenny box using these <a href="http://wiki.hudson-ci.org/display/HUDSON/Installing+Hudson+on+Ubuntu">useful aptitude instructions</a>.
<h2>hg plugin</h2>
<p>To get the plugin to install, go to the Hudson admin page, and manage plugins, then select available plugins. You should see ... nothing!</p>
<p>A careful reading of <a href="http://wiki.hudson-ci.org/display/HUDSON/Plugins">installing plugins</a> hints that this is expected behaviour, since hitting this page starts the download and a restart is required to see the plugins.</p>
<p>In my case a reload of the page was sufficient and, then I had the long, long, list of plugins available.</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-BtpmKjoAjIM/Tb9Kqt4Ix1I/AAAAAAAAAJE/V1M3iymBVCw/s1600/hudson-mercurial.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 391px;" src="http://4.bp.blogspot.com/-BtpmKjoAjIM/Tb9Kqt4Ix1I/AAAAAAAAAJE/V1M3iymBVCw/s400/hudson-mercurial.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5602278559202199378" /></a>
<p>Tick box, click install, see the above success screen.</p>
<p>Click button, restart hudson, ready to go.</p>
<h2>Configuration</h2>
<p>This required some playing about, I was trying to do as little as possible; as it turns out I haven't needed the jdk or any of the other config paths, just click create new job.</p>
<p>After entering the details of my bitbucket repo (and turning off private, have to figure out login), setting it to poll the repo, and figuring out an appropriate shell command, e.g. </p>
<blockquote><code>/home/campey/google_appengine/appcfg.py update $WORKSPACE --email=dev.campey@gmail.com --passin < /home/campey/dev.campey.password</code></blockquote>
<p>the build runs on save! And fails — red globe!</p>
<p>First run failed because I hadn't changed the app name. So back to app.yaml, edit, <code>hg commit</code>, wait, ... and blue globe!</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-lf39TFPmI5U/Tb9FaGl1dBI/AAAAAAAAAI8/-jWZ8yiEsyQ/s1600/hudson-history.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 382px; height: 105px;" src="http://3.bp.blogspot.com/-lf39TFPmI5U/Tb9FaGl1dBI/AAAAAAAAAI8/-jWZ8yiEsyQ/s400/hudson-history.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5602272776220406802" /></a>
<p>Yay!</p>
<p>Next steps: getting the dev server to daemonize for local/grid testing.</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-62029781593302204932010-09-05T21:45:00.011+02:002013-07-19T17:14:03.186+02:00Magic EstimationIn <a href="http://borisgloger.com/">Boris Gloger</a>'s "Estimation in Depth" deep dive at the <a href="http://southafrica.scrumgathering.org/">South African Scrum Gathering</a> he introduced us to Magic estimation.<br />
<h3>
Intro</h3>
Boris introduced it a little something like this:<br />
<blockquote>
So you've got a backlog of about 100-200 items and you have a backlog estimation meeting. First thing to do is put a numerical estimate on everything in the backlog. Using magic estimation this should take 10-15 minutes.</blockquote>
At which most of the room burst into laughter.<br />
I mean, he's got to be kidding, right? Estimation is a slog of negotiation and explanation preceding multiple rounds of <a href="http://www.planningpoker.com/">planning poker</a>. 1-3 minutes an item if you're <a href="http://www.urbandictionary.com/define.php?term=cooking%20on%20gas">cooking on gas</a>.<br />
<a href="http://3.bp.blogspot.com/_PyasagsZ3QA/TIP7kwmen0I/AAAAAAAAAHw/LcPR-ZvzS8Q/s1600/P9010213.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5513526977771773762" src="http://3.bp.blogspot.com/_PyasagsZ3QA/TIP7kwmen0I/AAAAAAAAAHw/LcPR-ZvzS8Q/s400/P9010213.JPG" style="cursor: hand; cursor: pointer; display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a>
<br />
Well, we left the deep dive room for a patch of floor and the results were... astounding. Okay, I'll say it: magic.<br />
<h3>
Function of Estimation</h3>
At the bar that evening, I found myself explaining it as follows.<br />
Estimation is a function that maps stories to complexity. Poker is one algorithm for the mapping, magic is another.<br />
<blockquote>
estimation ( story ) = complexity</blockquote>
Poker is an algorithm in which the whole team engages with each item sequentially, having an up-front discussion to attempt to have a good understanding and thus have an agreement when the cards are revealed.<br />
Magic estimation is then a kind of parallel sort, each actor applying his internal evaluation function to the set.<br />
And it happens in silence.<br />
It starts out with each actor sorting his subset into complexity point bins, then each actor evaluates the full set (already estimated by at least one team member) and moves only those that appear to be anomalies. As the process iterates, convergence is reached as we find stable points that all internal models can agree on.<br />
<h3>
Mechanism</h3>
<a href="http://2.bp.blogspot.com/_PyasagsZ3QA/TIP8xzYFKQI/AAAAAAAAAH4/Iwtrr08e000/s1600/P9020227+crop.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5513528301366618370" src="http://2.bp.blogspot.com/_PyasagsZ3QA/TIP8xzYFKQI/AAAAAAAAAH4/Iwtrr08e000/s400/P9020227+crop.jpg" style="cursor: hand; cursor: pointer; float: right; height: 400px; margin: 0 10px 10px 0; width: 325px;" /></a><br />
The "magic estimation check list" was put together by Gennine and Alister in our output session and is a good summary of the rules of the game.<br />
The image to the right is their flip-chart poster. I've repeated their points with some elaboration below.<br />
<ol>
<li>Start with the Product Backlog of user stories</li>
<li>Team will play, product owner will watch (and learn)</li>
<li>Lay the estimation estimation cards down on the floor, spaced out as per their values (as in the perspective picture above) e.g. <pre>123 5 8 13 20 40</pre>
</li>
<li>Hand out user stories to team</li>
<li>Explain rules: no talking, no non-verbal communication</li>
<li>Each team member estimates, place stories at points</li>
<li>Each team member checks estimates, re-estimate and move if desired (once all own cards are down)</li>
<li>Product owner marks fall-outs (too large or keeps bouncing)</li>
<li>Discuss fall-outs until reach agreement</li>
</ol>
Estimation is done!! It's surprising when you get to the end, and that's it.<br />
A final check if anyone has a burning need to move any items helps to get everyone to realise they're happy with the result.<br />
<h3>
Fall-Outs</h3>
A bit more on the fall outs from point 8.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://upload.wikimedia.org/wikipedia/commons/f/fe/JdlV_osc_5.156.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://upload.wikimedia.org/wikipedia/commons/f/fe/JdlV_osc_5.156.gif" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Some stories start to bounce around like oscillators from <a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway's Game of Life</a>, the product owner must watch for these and pull them out for more explanation. Once the game is done, the team can investigate what the differences of opinion were and get clarification from the product owner. I've tried switching to poker at this point, which has worked quite well.<br />
Some stories make their way out to the 100+ boundary. When stories end up here, the product owner pulls these out too. These need either: explanation from the product owner to break down the confusion that led to the high complexity, or breaking down into estimable chunks.<br />
<h3>
vs Poker</h3>
<a href="http://4.bp.blogspot.com/_PyasagsZ3QA/TIP90cpNUDI/AAAAAAAAAIA/afXzxaZtJOY/s1600/P9010214.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5513529446315675698" src="http://4.bp.blogspot.com/_PyasagsZ3QA/TIP90cpNUDI/AAAAAAAAAIA/afXzxaZtJOY/s400/P9010214.JPG" style="cursor: hand; cursor: pointer; float: left; height: 400px; margin: 0 10px 10px 0; width: 300px;" /></a>
<br />
Before trying it, I'd thought it would be okay, but not as good as poker at getting to good estimates.<br />
Now, I feel it's as good if not better than poker at getting to estimates. Poker does foster communication, but this can be done independently of estimation if you're doing magic.<br />
Avoiding the conversations of poker allows us to avoid arguments and, in the words of Oscar Wilde, <br />
<blockquote>
"Arguments are to be avoided; they are always vulgar and <span style="font-style: italic;">often convincing</span>."</blockquote>
Without the convincing influence, magic estimation is able to capture each team member's instant conclusions that Malcolm Gladwell discusses in <a href="http://www.gladwell.com/blink/index.html">Blink</a>, then get all of those to agree. Or disagree.<br />
Being part of a complex dynamic system feels like a kind of magic as it converges. Getting to this picture with around 80 items in about 5 minutes... was magic!Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com6tag:blogger.com,1999:blog-21383536.post-91850013871350349302010-09-02T23:05:00.003+02:002010-09-02T23:18:03.380+02:00Open Space @ CPT Gathering<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PyasagsZ3QA/TIASI0fP8KI/AAAAAAAAAGQ/UCJjyenujYk/s1600/P9020260.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 172px;" src="http://1.bp.blogspot.com/_PyasagsZ3QA/TIASI0fP8KI/AAAAAAAAAGQ/UCJjyenujYk/s400/P9020260.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5512425886639452322" /></a>
<p>The <a href="http://en.wikipedia.org/wiki/Open_Space_Technology">open space</a> marketplace in action this morning at the Cape Town Scrum Gathering. Fun being part of a complex dynamic system.</p>
<p>Sessions I convened today:</p>
<ul>
<li>Agile contracting</li>
<li>Job swapping (bus 2 bus) for cross pollination</li>
</ul>
<p>Sessions I attended, paraphrased:</p>
<ul>
<li>Extreme public openness; what (code, practice) should we share?</li>
<li>Team psychology</li>
<li>Wildcard ad-hoc group</li>
<li>Trust</li>
<li>Working environments</li>
<li>Feeling oppressed? Let's make a play. w/ Alan Cyment</li>
</ul>
<p>Will be attempting to blog my notes and impressions from these "soon". Looking forward to getting all of the scribe's notes from the day.</p>
<p>Second half to an excellent gathering. Well done <a href="http://www.scrum.org.za/">sugsa</a>!</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com1tag:blogger.com,1999:blog-21383536.post-34116171113512606122010-09-02T07:44:00.004+02:002010-09-02T08:02:33.410+02:00Cape Town Scrum Gathering<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PyasagsZ3QA/TH8510bXsYI/AAAAAAAAAGI/KujgQVrtFqc/s1600/P9020233.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 237px;" src="http://4.bp.blogspot.com/_PyasagsZ3QA/TH8510bXsYI/AAAAAAAAAGI/KujgQVrtFqc/s400/P9020233.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5512188065694069122" /></a>
<p>Cape Town gathering day 1 concluded in a networking event where I caught a few moments of Henrik's improv on the baby grand at the Westin Grand.</p>
<p>Before I plunge into day 2, a sketch of what stood out on day 1.</p>
<h3>Henrik's Keynote</h3><p><a href="http://www.crisp.se/henrik.kniberg">Henrik Kniberg</a>'s keynote was excellent, setting the tone for the gathering. He revisited the core scrum values (not the agile values) with frequent references to the "<a href="http://www.amazon.co.uk/Agile-Software-Development-SCRUM-Schwaber/dp/0130676349">black book</a>" and closed by stoking the scrumban fire a bit.</p>
<h3>Deep dive: Boris Gloger</h3>
<p>Estimation in depth. Wow, <a href="http://borisgloger.com/">Boris</a> broke my brain in three fabulous ways:</p>
<ol>
<li>Magic estimation — parallel sorting algorithm to achieve estimation of hundreds of items in minutes.</li>
<li>Contracting on business value, not time and materials — with an exit for the client if they're satisfied before the fixed cost is reached.</li>
<li>Changing Level of Done - choose the set of constraints (definition of done) that allow you to start delivering features, then change the constraints and get everything to done again.</li>
</ol>
<p>More to come. Off to the wildcard that is open spaces!</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com1tag:blogger.com,1999:blog-21383536.post-89852340978470476592010-08-31T19:37:00.006+02:002010-08-31T22:37:32.405+02:00Requirements Management<span style="font-style:italic;"><a href="http://za.linkedin.com/pub/mohamed-bray/4/554/175">Mohamed Bray</a> <a href="http://www.scrum.org.za/events/requirements-management">Sugsa August 2010</a></span>
<p>This month's sugsa was a cross-talk from the Business Analysis community.</p>
<h2>The Talk</h2>
<p>Mohamed described an iterative process as just multiple quick failures (wagile, thanks <a href="http://scrumcoaching.wordpress.com/">Karen</a>), if we decide to skimp on requirements. His stat was that 70% of defects are injected during the requirements phase. After gathering, the challenge becomes requirements management and <em>communication</em>. This communication is difficult because the audience is broad and diverse.</p>
<p>Requirements communication should have a few characteristics.</p>
<ul>
<li>connect: we need collaboration and traceability</li>
<li>actionable: when is it done? get commitment (intention ≠ commitment)</li>
<li>units: time & money</li>
</ul>
<p>Communication is not just representation.</p>
<h3>Babok</h3>
<p>Interesting (and new) fact to me is the existence of the <a href="http://www.theiiba.org/AM/Template.cfm?Section=Body_of_Knowledge">Business Analysis Body of Knowledge</a> (BABOK). Although the $30 pdf ($60 for print) price has put it onto my library backlog, and not too near the top.</p>
<h2>Questions</h2>
<h3>Traceability</h3>
<p><a href="http://za.linkedin.com/in/peterhundermark">Peter Hundermark</a> probed a bit on whether traceability was really important.</p>
<p>To me, as a developer, traceability had always meant the lengthy and painful process at the end of waterfall where we point to screens an show where each feature can be found.</p>
<p>Mohamad extended this backwards to linking requirements to stakeholders and the origin of the item, so that we can get feedback on the intention when required. "Where it came from and where it went". Which is actually quite appealing.</p>
<h3>BA Smells</h3>
<p><a href="http://www.scrumalliance.org/profiles/50963-marius-de-beer">Marius de Beer</a> was looking for the "smells" or indicators that BA has gone bad.</p>
<p>Requirements that are not quick to apprehend are smelly. They should be easy to interpret upfront. In that context, 90% of requirements are not clear. As an example, when we talk about oranges, you should get a vivid picture of an orange in your head.</p>
<h3>Context-free</h3>
<p>Asking context free questions is a technique to probe further while attempting to listen with a solution in mind.</p>
<h2>Parting thought</h2>
<p>The difference between regular analysts and BBND analysts (Mohamad's employer) is that they are 100% responsible for delivery.</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-76462412071709368082010-06-07T20:26:00.006+02:002010-06-07T20:52:01.048+02:00Intellisense: Re-show info<h3>Complete Word</h3>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PyasagsZ3QA/TA0-fFET74I/AAAAAAAAAFw/cPBRW8OsEKc/s1600/CompleteWord.png"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 232px; height: 60px;" src="http://3.bp.blogspot.com/_PyasagsZ3QA/TA0-fFET74I/AAAAAAAAAFw/cPBRW8OsEKc/s400/CompleteWord.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5480105025236889474"></a>
<p>A long while back I included the "Complete Word" shortcut:</p>
<p><code>Ctrl-Space</code></p>
<p>in my coding practice, avoiding the tricks I had developed to prompt the visual studio intellisense back into giving me suggestions for word completion.</p>
<p>This saves a lot of "micro-time" and improves flow.</p>
<h3>Parameter Info</h3>
<p>Another time when I found myself coaching intellisense is when looking at the parameter info. This would be achieved, e.g. by re-typing a comma or the opening <code>(</code> of a method call.</p>
<p>On Friday I realised there had to be a keyboard short-cut, tonight I <a href="http://www.mobydisk.com/softdev/techinfo/dotnetkeyboard.html">hunted</a>, and found the treasure:</p>
<p><code>Ctrl-Shift-Space</code></p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PyasagsZ3QA/TA0_PMd40FI/AAAAAAAAAF4/--qg9uqZYPw/s1600/ParameterInfo.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 57px;" src="http://4.bp.blogspot.com/_PyasagsZ3QA/TA0_PMd40FI/AAAAAAAAAF4/--qg9uqZYPw/s400/ParameterInfo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5480105851856932946" /></a>
<p>Ahhh, the joy!</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com1tag:blogger.com,1999:blog-21383536.post-86853878305890842912010-05-12T12:53:00.005+02:002010-05-20T12:36:26.482+02:00SQL XML Element contents from varchar column<h2>The problem</h2>
Stored in a varchar column, <code>payload_xml</code>, we have xml that looks something like this:
<code><pre>
<?xml version="1.0" encoding="utf-16"?>
<ReceiveMoneyParameters
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<PaymentArrangementExternalReference>
<u>JT00009084</u>
</PaymentArrangementExternalReference>
...
</ReceiveMoneyParameters>
</pre></code>
I need to return the underlined section as a varchar.
<h2>The solution</h2>
With the help of Tim Chapman's article <a href="http://articles.techrepublic.com.com/5100-10878_11-6140404.html">Shred XML data with XQuery</a>, I've arrived at the following code:
<!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
<span class="kwrd">select cast</span>(<span class="kwrd">cast</span>(<span class="kwrd">cast</span>(payload_xml <span class="kwrd">as</span> nvarchar(<span class="kwrd">max</span>)) <span class="kwrd">as</span> xml)
.query(<span class="str">'data(//ReceiveMoneyParameters/PaymentArrangementExternalReference)'</span>)
<span class="kwrd">as</span> <span class="kwrd">varchar</span>(<span class="kwrd">max</span>)) <span class="kwrd">as</span> PaymentArrangementExternalReference,</pre>
Which is, admittedly a bit of a mess, but each part has its purpose, and it works!
<h2>Observations</h2>
Interesting observations from inside out:
<ul>
<li>cast as <code>nvarchar</code> so that the encoding matches <code>"utf-16"</code></li> otherwise sql server fails with the cryptic '<code>XML parsing: ... unable to switch the encoding</code>'
<li><code>data()</code> function returns the actual content of the node, not the whole node</li>
<li>I didn't need to use <code>[]</code> indexers because there is only one element.</li>
</ul>
Lesson learned: use the xml datatype for the column.
<h2>Update</h2>
<p>To handle different namespaces, e.g.</p>
<pre> <?xml version="1.0" encoding="utf-16"?>
<PremiumDistributionRequest
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Payment>
<PaymentId
xmlns="http://il.net.za/Agreement/Payment">
<u>14079</u>
</PaymentId>
</pre>
<p>add a namespace declaration to the query as follows:</p>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<pre class="csharpcode">
<span class="kwrd">select</span> @x.query(
<span class="str">'declare namespace ap="http://il.net.za/Agreement/Payment";
data(//PremiumDistributionRequest/Payment/ap:PaymentId)'</span>)</pre>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com3tag:blogger.com,1999:blog-21383536.post-12402626413266780242010-02-18T11:01:00.007+02:002010-02-18T12:00:39.942+02:00Fitnesse - MyFirstTest<p>Last night I ran through <a href="http://blog.cornetdesign.com/2005/11/fitnesse-and-net-a-basic-tutorial/">a basic tutorial</a> on Fitnesse and .net. It went a little something like this.</p>
<h3>Download and run Fitnesse</h3>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PyasagsZ3QA/S30LEZyOHZI/AAAAAAAAAE4/xit9lJZ-18s/s1600-h/fitnesse-jar.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 79px; height: 74px;" src="http://3.bp.blogspot.com/_PyasagsZ3QA/S30LEZyOHZI/AAAAAAAAAE4/xit9lJZ-18s/s320/fitnesse-jar.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5439516095202336146" /></a><p><a href="http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad">Download</a>, double-click. And then...</p><p>Huh? I double clicked the jar file, got a question about enabling network comms, and nothing else happened.</p>
<p>What had actually happened was some files were extracted and the server started running and listening for connections.</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PyasagsZ3QA/S30MZqNU1UI/AAAAAAAAAFI/uWD1K9bWwFc/s1600-h/fitnesse-cmd.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 78px;" src="http://2.bp.blogspot.com/_PyasagsZ3QA/S30MZqNU1UI/AAAAAAAAAFI/uWD1K9bWwFc/s400/fitnesse-cmd.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5439517559899870530" /></a>
<p>Best plan for getting started is to run it as above from the command line using <code>"[path to java bin]java.exe -jar fitnesse.jar</code></p>
<h3>Create a test page</h3>
<p>The tutorial pointed to <a href="http://www.fitnesse.org/FitNesse.DotNet.DotNetFitServer">FitNesse.DotNet.DotNetFitServer</a>, which is an empty wiki page. Throwing caution to the wind, I bravely soldiered on.</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PyasagsZ3QA/S30HxJaVJKI/AAAAAAAAAEo/0lhbnwpV3QA/s1600-h/ErrorsOccurred.png"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 84px; height: 133px;" src="http://1.bp.blogspot.com/_PyasagsZ3QA/S30HxJaVJKI/AAAAAAAAAEo/0lhbnwpV3QA/s320/ErrorsOccurred.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5439512465854768290" /></a>
<p>All looked fine until I clicked the test button and was presented with a nice red X in the upper right corner, clicking on which yielded the detail: <code>
java.io.IOException: Cannot run program "fit.FitServer": CreateProcess error=2, The system cannot find the file specified</code>, which I was pretty much expecting, so off I went to find a suitable program.</p>
<p>I downloaded both <a href="http://www.syterra.com/FitSharp.html">FitSharp</a> and <a href="http://www.syterra.com/FitnesseDotNet.html">FitnesseDotNet</a> because I couldn't tell which would be right for me. Updating the <code>TEST_RUNNER</code> to the full path to the FitServer.exe from the FitnesseDotNet distribution did the trick (FitSharp is for slim testing and has a different <code>COMMAND_PATTERN</code> and <code>TEST_RUNNER</CODE>).</p>
<h3>Create & Hook fitnesse to the .net Class</h3>
<p>Initially fitnesse couldn't find the type in any of the loaded assemblies. Removing the namespaces (as per a useful comment), got it to hook up, and I did a little "dance, or a jig".</p>
<h3>Get to Green</h3>
<p>Well, not quite green because one of the quotients in the table is incorrect. But the tests shows up this as an incorrect result.</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PyasagsZ3QA/S30Kl-NFtDI/AAAAAAAAAEw/l9TwZY58bBk/s1600-h/MyFirstTest.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://4.bp.blogspot.com/_PyasagsZ3QA/S30Kl-NFtDI/AAAAAAAAAEw/l9TwZY58bBk/s320/MyFirstTest.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5439515572402762802" /></a>
<p>Yay.</p>
<p>Next step is figuring out what fixture to use to get complex types into fitnesse.</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-19942981633043563752010-01-21T11:23:00.005+02:002010-01-21T11:45:27.559+02:00DOS Copy file aggregation<p>Just learned something new about the DOS copy command from <a href="http://www.howtogeek.com/howto/keyboard-ninja/keyboard-ninja-concatenate-multiple-text-files-in-windows/#comment-19300">this comment</a> on a keyboard ninja article.</p>
<code>copy /a *.txt aggregate.txt</code>
<p>Will aggregate the contents of all the <code>.txt</code> files into <code>aggregate.txt</code>. This is useful to me for <code>.csv</code> files.</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PyasagsZ3QA/S1ggpLYWjwI/AAAAAAAAAEg/WlmFJ8HJTRI/s1600-h/copy.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 310px; height: 139px;" src="http://1.bp.blogspot.com/_PyasagsZ3QA/S1ggpLYWjwI/AAAAAAAAAEg/WlmFJ8HJTRI/s400/copy.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5429125242596790018" /></a>
<p style='text-align:center;'><em><code>(to disambiguate: 1.txt contains "one one one" &c.)</code></em></p>
<p>So cool; not often I find out something new about DOS.</p>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-36647101669514972082009-08-20T10:36:00.006+02:002009-08-20T12:42:21.216+02:00Microsoft.SqlServer.Management.Smo Missing Backup<h2>Or, how I learned to read the assembly name</h2>
<h3>In which I include dll's</h3>
I was trying out <a href="http://www.geekpedia.com/tutorial180_Backup-and-restore-SQL-databases.html">this tutorial on Geekpedia</a> and the references were invalid. I removed the two (<code>Microsoft.SqlServer.Smo</code> and <code>Microsoft.SqlServer.ConnectionInfo</code>: yes, the dll names are missing the <code>.Management</code> part from the namespace they contain) and re-added them. Simple enough.
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PyasagsZ3QA/So0ZRqab6jI/AAAAAAAAAEU/CNx75YKz1ss/s1600-h/Sdk.Sfc.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 105px;" src="http://1.bp.blogspot.com/_PyasagsZ3QA/So0ZRqab6jI/AAAAAAAAAEU/CNx75YKz1ss/s400/Sdk.Sfc.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5371977721756510770" /></a>
Then there was an issue with the unreferenced <code>Microsoft.SqlServer.Management.Sdk.Sfc</code>, after running <a href="http://www.aghausman.net/dotnet/could-not-load-file-or-assembly-microsoftsqlservermanagementsdksfc.html">the installers</a> (all just said repairing), I found the dll, but I'm not sure if it was there before. The dll in this case has the same name as the namespace, unlike the previous two dll's which are missing the <code>.Management</code> portion, so I was looking in the wrong part of the list.
<h3>In which I question my sanity</h3>
All was relatively sane up to this point, then I started to think I was crazy. The Backup class was missing from the namespace. I checked the documentation for <code>Microsoft.SqlServer.Management</code> and sure enough, <code>Backup</code> was there.
After turning to google for a while and reading all about people finding and GACing the dll, I headed to <code>%systemroot%/assembly</code> to see what I had. It was at this point that I saw there was a dll <code>Microsoft.SqlServer.SmoExtended</code>. Inquisitively, I added a reference to this dll.
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PyasagsZ3QA/So0X7Q3YvAI/AAAAAAAAAEM/1VhgbzaWJZY/s1600-h/Microsoft.SqlServer.Management.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 385px; height: 155px;" src="http://1.bp.blogspot.com/_PyasagsZ3QA/So0X7Q3YvAI/AAAAAAAAAEM/1VhgbzaWJZY/s400/Microsoft.SqlServer.Management.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5371976237429865474" /></a>
And, lo! the classes were found.
Looking at <a href="http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.backup.aspx">the documentation for the <code>Backup</code> class</a>, I now notice:
<blockquote>The <b>Backup</b> object provides programmatic access to Microsoft SQL Server backup operations.
<br/><b>Namespace:</b> Microsoft.SqlServer.Management.Smo
<br/><b>Assembly:</b> Microsoft.SqlServer.SmoExtended (in microsoft.sqlserver.smoextended.dll)</blockquote>
<h3>A curious discovery</h3>
So, multiple dlls can add classes to the namespace. Who knew? Not me.
And, w.r.t. <code>Microsoft.SqlServer.Management.Smo</code>, their structure must have changed somewhere between the dlls that Andrew Pociu (Geekpedia) was using (I'm assuming 9.x) and the 10.0 dlls.
<h3>Post-script: local help is outdated</h3>
<p>While writing this post, I thought to check <a href="ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/smo9mref/html/f0a63a06-ebfa-bb1e-c32c-0613f45118fa.htm">my local help</a> where the documentation is out of date, so perhaps I have a valid excuse.
<blockquote>
The <b>Backup</b> object provides programmatic access to Microsoft SQL Server backup operations.
<br/><b>Namespace:</b> Microsoft.SqlServer.Management.Smo
<br/><b>Assembly:</b> Microsoft.SqlServer.Smo (in microsoft.sqlserver.smo.dll)
</blockquote>
finAnonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com6tag:blogger.com,1999:blog-21383536.post-75647238179798638952009-05-26T09:50:00.008+02:002009-05-27T11:02:51.063+02:00WSP in TFS: A few more parameters<p>After my last post on <a href="http://campey.blogspot.com/2009/05/building-wsp-in-tfs.html">building WSP in TFS</a>, I was at a stage where I thought the WSP file was ready to go. It's recognised by <a href="http://www.rarlab.com/">WinRAR</a>, opening it up in there shows the expected dll's.</p>
<p>But there was something missing...</p>
<h3>feature.xml</h3>
Attempting to deploy the WSP threw:
<blockquote>Failed to find the XML file at location '12\Template\Features\IL.SharePoint.Workflows\feature.xml'</blockquote>
<p>This <a href="http://technet.microsoft.com/en-us/library/cc263123.aspx">TechNet page on InstallFeature</a> clears up the exact cause being a missing feature.xml. It also cleared up that the 'root' of the WSP is equivalent to <code>12\Template\Features\</code> a location in the "12 hive".
<p>Opening up the WSP, sure enough there was no sign of feature.xml, so it was time to head back into <code>WSPbuilder.exe -help</code> where I found...</p>
<h3>-12path</h3>
<p>The default for the 12path is the current directory, here again, since we're not running from the project directory, the current directory isn't much good, so I needed to set the 12 path.</p>
<p>Setting the 12path to the location of the feature.xml got it included in the WSP, but the manifest.xml included it in the <code>RootFiles</code> element. Based on our manually built WSP, we saw we needed it to be in the <code>FeatureManifests</code> element.</p>
<p>After some searching I looked again at the <a href="http://www.keutmann.dk/sharepointblog/wspbuilder/wspdemo.jpg">before build image</a> on the WSPBuilder CodePlex site. Turns out this is rather useful once you know what you're looking at. There you'll see the path <code>WSPDemo/12/Template/FEATURES/WSPDemo/</code>; after seeing that, it dawned on me that I had actually read something about "putting the contents of your 12 hive into the project folder" - so <span style="font-style:italic;">that's</span> what they meant.</p>
<p>So finally the files were included in the WSP in the right location:</p>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PyasagsZ3QA/Sh0BpaFzmEI/AAAAAAAAAEE/sdJ0colxAQk/s1600-h/WSPcontents.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="http://4.bp.blogspot.com/_PyasagsZ3QA/Sh0BpaFzmEI/AAAAAAAAAEE/sdJ0colxAQk/s400/WSPcontents.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5340426544021215298" /></a>
<h3>-DeploymentTarget GAC</h3>
Because of the way our solution is set up we need to target the GAC, we were getting:
<blockquote><Assembly Location="IL.SharePoint.Workflows.dll" DeploymentTarget="WebApplication" />
</blockquote>
in the <code>manifest.xml</code>. Changing the <code>DeploymentTarget</code> from the default of <code>Auto</code> to <code>GAC</code>yielded the required:
<blockquote><Assembly Location="IL.SharePoint.Workflows.dll" DeploymentTarget="GlobalAssemblyCache" /></blockquote>
<h3>-BuildCAS False</h3>
<p>The default for this is <code>True</code>, with it on, the manifest file was spammed full of CAS information and trying to deploy gave the error:
<blockquote>The solution "IL.SharePoint.Workflows.wsp" needs to add Code Access Security policies. If you fully trust this solution, use the -allowCasPolicies parameter to deploy.</blockquote>
True, using <code>-allowCasPolicies </code> did remove the error, but adding <code>-BuildCAS False</code> cleaned up the manifest file and removed the need for this switch to <code>stsadm</code>.
<h3>Revised WSPBuilder command line</h3>
All this meant the following amended <code>Exec</code> command in the tfsbuild.proj.
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> <</span><span style="color: #a31515;">Exec</span><span style="color: blue;"> </span><span style="color: red;">Command</span><span style="color: blue;">=</span>'<span style="color: blue;">"C:\Program Files\WSPTools\WSPBuilderExtensions\WSPBuilder" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -DeploymentTarget GAC </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -BuildCAS false </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -SolutionPath "$(OutDir)" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -BinPath "$(OutDir)" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -OutputPath "$(WspDir)" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -12Path "$(OutDir)12" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -WSPName IL.SharePoint.Workflows.wsp</span>'</p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> /></span></p>
</div>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0tag:blogger.com,1999:blog-21383536.post-54450481586170336022009-05-14T11:33:00.008+02:002009-05-14T16:29:17.571+02:00Building WSP in TFS<p>We needed to build a Sharepoint WSP file in TFS as part of our continuous integration process. Already using <a href="http://wspbuilder.codeplex.com/">WSPBuilder</a> interactively we just needed to get it into the team build and copied to the staging location.</p>
<h3>WSPBuilder</h3>
<p>Brian Farnhill discusses the process of <a href="http://pointstoshare.spaces.live.com/Blog/cns!AEC42F315B4528B0!3290.entry">building a WSP in TFS</a> by first including it in the project file (<a href="http://alex-tfs.blogspot.com/2009/01/tfs-build-and-wspbuilder.html">summary by Alex Degaston</a>). This pointed me in the right direction, but I really just wanted to build the WSP in the team build after check-in.</p>
<p>We just copied the basics from Brian's post, and hoped it would work, and amazingly, we had a WSP file. Frustratingly, the WSPBuilder will happily create a WSP file even if it finds nothing to put in it.</p>
<p>After some experimenting on the command line, it turns out you need to specify both SolutionPath and BinPath to get WSPBuilder to build successfully, using the <a href="http://www.woodwardweb.com/vsts/30_useful_team.html">team build property</a> OutDir worked for this. Including the feature.xml and workflow.xml as content in the root of the project ensures they're in the output folder.</p>
<p>The default name for the WSP is the folder name, so to override this, use WSPName.</p>
<h3>File drop</h3>
<p>The easiest way to get the files out was to override BeforeDropBuild and put them in the OutDir. I'm using xcopy for this as it's easier to test on the command line (also, using the copy task would require (I think) further nesting the copy operation because of the <a href="http://manicprogrammer.com/cs/blogs/michaelruminer/archive/2008/02/23/teambuild-outdir-item-expansion-and-why-your-copy-task-gave-you-nothing.aspx">order of item expansion</a>). They're then ready for the team build to perform the drop to the staging location.</p>
<h3>Finally</h3>
<p>All this boils down to this two liner added to the TFSBuild.proj:</p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> <</span><span style="color: #a31515;">Target</span><span style="color: blue;"> </span><span style="color: red;">Name</span><span style="color: blue;"> =</span>"<span style="color: blue;">BeforeDropBuild</span>"<span style="color: blue;"> ></span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> <</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> <</span><span style="color: #a31515;">WspDir</span><span style="color: blue;">></span>$(SolutionRoot)\Code\IL.SharePoint.Workflows\DeploymentFiles<span style="color: blue;"></</span><span style="color: #a31515;">WspDir</span><span style="color: blue;">></span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> </</span><span style="color: #a31515;">PropertyGroup</span><span style="color: blue;">></span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> <</span><span style="color: #a31515;">Exec</span><span style="color: blue;"> </span><span style="color: red;">Command</span><span style="color: blue;">=</span>'<span style="color: blue;">"C:\Program Files\WSPTools\WSPBuilderExtensions\WSPBuilder" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -SolutionPath "$(OutDir)" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -BinPath "$(OutDir)" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -OutputPath "$(WspDir)" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> -WSPName IL.SharePoint.Workflows.wsp</span>'<span style="color: blue;"> </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> /></span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> <</span><span style="color: #a31515;">Exec</span><span style="color: blue;"> </span><span style="color: red;">Command</span><span style="color: blue;">=</span>'<span style="color: blue;">xcopy /E /Y /I </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> "$(WspDir)" </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> "$(OutDir)DeploymentFiles"</span>'<span style="color: blue;"> </span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> /></span></p>
<p style="margin: 0px; padding: 0px;"><span style="color: blue;"> </</span><span style="color: #a31515;">Target</span><span style="color: blue;">></span></p>
</div>Anonymoushttp://www.blogger.com/profile/17296053036602866729noreply@blogger.com0