<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-7882101066258810221</atom:id><lastBuildDate>Tue, 28 Jul 2009 12:00:03 +0000</lastBuildDate><title>Iterative Excellence</title><description>Iterative thoughts on the agile development of software, teams and people.</description><link>http://www.planningcards.com/blog/</link><managingEditor>noreply@blogger.com (Tim Mackinnon)</managingEditor><generator>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-5106589540315422238</guid><pubDate>Tue, 28 Jul 2009 12:00:00 +0000</pubDate><atom:updated>2009-07-28T13:00:03.974+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>iPhone</category><category domain='http://www.blogger.com/atom/ns#'>tips</category><title>Using an iPhone with WEP wireless</title><description>Something that I didn't find obvious when trying to connect my iPhone to an old router using WEP security (which isn't really that secure, but sometimes recycling old pieces of kit is the right thing to do) - is how you specify a password.&lt;br /&gt;&lt;br /&gt;I kept trying to connect, using the password I had configured the router to use, however the iPhone simply wouldn't connect. Eventually after a bit of searching I discovered the trick:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use the 13 hex digits of WEP key1 (generated from your passphrase) but PREFIX it with a $ for the iPhone. e.g. $3a01e1071e5054c9c30d01e3e1&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Apparently this is some Apple convention, which is totaly obscure...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-5106589540315422238?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2009/07/using-iphone-with-wep-wireless.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-3373233931569589926</guid><pubDate>Mon, 27 Jul 2009 09:47:00 +0000</pubDate><atom:updated>2009-07-27T15:07:15.759+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>firefox</category><category domain='http://www.blogger.com/atom/ns#'>Mac</category><title>Firefox 3.5 - DuplicateTab and OSX compression</title><description>I've long been a fan of the &lt;a href="http://www.mozilla.com/en-US/firefox/personal.html"&gt;Firefox&lt;/a&gt; web browser. I know that on a Mac many people use Safari - and I tried exclusively using Safari when I first got my Mac, however I missed the huge catalogue of browser extensions that are available in Firefox, and I also couldn't get used to how bookmarks work in Safari.&lt;br /&gt;&lt;br /&gt;I'm not saying that bookmarks are perfect in Firefox - but in Safari I never really got comfortable with the layout of bookmarks (it doesn't seem to map onto a simple folder metaphor - e.g. I never worked out the difference between the Collections and Bookmarks "top level folders" in the manage bookmarks window). Somehow it all seemed a bit cumbersome - when all I really wanted was to categorize a few pages. Firefox is much better in this respect, particularly with its Awesome Bar and keyword tagging (where I mainly don't bother with folders and just keyword tag - particularly now that the XMarks extension suggests tags for me). I will say that my only complaint is that if I want to simply view all my links with a particular tag - its not so easy. There is "recent tags" but if it's not so recent then I'm a bit out of luck. You can open the "Organise Bookmarks" window and then start filtering - but having another window seems a bit cumbersome - I guess I miss being able to type something like - tag:iphone in the awesome bar...&lt;br /&gt;&lt;br /&gt;Of course its this kind of thing that Add-On's are designed for - and there is a tag filtering add-on called TagSifter (which has a nice Tag cloud), however its not yet available for Firefox 3.5. However you can get around this by editing the manifest of an add-on and manually changing the MaxVersion requirement. &lt;span style="font-weight: bold;"&gt;But&lt;/span&gt; there are a few tricks to be aware of when using a Mac - as follows:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download the add-on to disk (you may ironically have to launch Safari to do this as the plugin may indicate it doesn't support Firefox 3.5 and so won't let you install it - or right-click and use save as...)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Append .zip to the .xpi file, which will let you use the Finder extract the add-on into a folder&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the extracted folder, locate the "install.rdf" file, and open it with a text editor. Find the line: em:MaxVersion= and change the number to 3.5.*&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The following is the important part on a Mac&lt;/span&gt; - you need to re-compress the extracted folder, however if you right click on the actual folder you end up with everything being zipped one level too deep. Thus you need to select all of the files inside the folder and then right click and select Compress. You will get a .zip file inside the folder which you can then rename to something like &lt;original&gt;-3.5.xpi and then you can move your new file into the parent directory.&lt;/original&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finally, you should now be able to drag your new .xpi into Firefox and it will prompt you to install the new add-on&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Hopefully this helps anyone else who upgrades to Firefox 3.5 and still has 3.0 extensions that they want to use in the newer version. I found this worked for both &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/998"&gt;TagSifter&lt;/a&gt; as well as another favourite add-on, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/28"&gt;DuplicateTab&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;reference: &lt;a href="http://forums.mozillazine.org/viewtopic.php?t=381227&amp;amp;sid=b483d8f327fd53728c8273a908d76190"&gt;forums.mozillazine.org&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-3373233931569589926?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2009/07/firefox-35-duplicatetab-and-osx.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-118614662819140341</guid><pubDate>Tue, 07 Apr 2009 12:12:00 +0000</pubDate><atom:updated>2009-04-08T07:20:58.084+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>iPhone</category><title>ReDo iPhone productivity app</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.planningcards.com/site/images/stories/iterex/reDo.png"&gt;&lt;img style="float:right; margin:20px 0 10px 10px;cursor:pointer; cursor:hand;width: 125px; height: 125px;" src="http://www.planningcards.com/site/images/stories/iterex/reDo.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I've always been interested in PDA's right from my first Casio programmable calculator (which had notes and calendar functionality). Following on from that early experience were a series of Palm devices (one even having a bulky clip-on phone module), a Sony Ericsson P910i, an HTC Windows Mobile device (very unreliable), back to the P910i, and then finally an iPhone 3G.&lt;br /&gt;&lt;br /&gt;Of them all, I really like the iPhone, although I do miss many of the features that I had on those previous devices (some of which will appear in the 3.0 OS). Of course the nice thing about PDA's is the ability to buy or write your own applications to fill in the gaps.&lt;br /&gt;&lt;br /&gt;While I briefly toyed with writing Palm applications, I never invested the time to write something "shrink wrapped" for it. The tools seemed quite cumbersome, and it felt like a very primitive exercise to write anything of note. However I have always maintained a list of ideas for things that I want on a phone/pda to help me in day to day activities.&lt;br /&gt;&lt;br /&gt;Late in 2008 - when I decided to upgrade our office to using iPhones, part of my selection decision was based around revisiting writing applications for mobile devices. I felt that Objective-C was a good match for my previous Smalltalk experience and XCode is a respected development environment.&lt;br /&gt;&lt;br /&gt;Today, I am pleased to say that I have successfully released my first iPhone application, ReDo. It's a practical "does what it says on the tin" application, that ticks off one of those items in that "helping me getting things done" checklist I've been mentally carrying around.&lt;br /&gt;&lt;br /&gt;You can get a copy of ReDo on the &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=310575223"&gt;App Store&lt;/a&gt; or on the &lt;a href="http://www.iterex.co.uk/iphone"&gt;Iterex iPhone"&lt;/a&gt; page. Needless to say - I've been using it a while to maintain lists of items I need to remember to redo when I give a presentation, or pack for a vacation. Hopefully others will find it as useful as I do.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Update: I have received several unsolicited emails with very encouraging feedback, so it seems that others are ReDoing items as well.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-118614662819140341?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2009/04/redo-iphone-productivity-app.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-5196263159996308647</guid><pubDate>Wed, 03 Dec 2008 09:05:00 +0000</pubDate><atom:updated>2008-12-03T12:05:32.727Z</atom:updated><title>Rescuing Posts From the Past</title><description>Its very easy to lose parts of your past, and while Google, Yahoo and Msn do good jobs of indexing and caching our records you do often find broken links to historical information.&lt;br /&gt;&lt;br /&gt;In an effort to simplify my infrastructure (and save save some money) I have decided to change my ISP. I blame it on the &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; - well actually the iPhone has given me a reason to properly sync some of those podcasts I've been meaning to listen to. I dutifully located some of my favorite blogs which have podcasts: &lt;a href="http://industry-misinterpretations.cincomsmalltalk.com/"&gt;Industry Misinterpretations&lt;/a&gt; and &lt;a href="http://www.hanselminutes.com/"&gt;Hanselminutes&lt;/a&gt;. I also found some new contenders, &lt;a href="http://twit.tv/FLOSS"&gt;Floss Weekly&lt;/a&gt; and the &lt;a href="http://www.fool.co.uk/expert/money-talk.aspx"&gt;Motley Fool Moneytalk&lt;/a&gt;. I like having a diverse set of topics to listen to on the way to work - possibly this is akin to mental &lt;em&gt;calisthenics&lt;/em&gt;?&lt;br /&gt;&lt;br /&gt;Anyway it was the latter podcast (Motley Fool) which had an old conversation on ISP's, which caused me to re-evaluate my situation. Looking at some of the comparison sites I found that I was paying double for a lesser service - with the final kicker being a series of technical problems with my ISP in the last few days. That was it, I decided to switch - and I have been suprised how much easier it is to do this now. The last time I did it was more than 10 years ago, and I still remember  how convoluted it was to get everything changed over.  This time most things seem quite automatic - you request a MAC code (similar to the PAC code for  a phone) and enter it into your new providers website, and then you cross your fingers (I guess).&lt;br /&gt;&lt;br /&gt;Of course once the die is cast, there are other things to consider. Something I did a long time ago, was use a mail redirector (I use &lt;a href="http://www.pobox.com/"&gt;Pobox.com&lt;/a&gt;) - and while its a paid service - they have been very reliable and helpful over the years. I guess these days most people use &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; for email, but before Google you generally used the email address from your ISP, and so it was painful to mail all of your contacts and get them to change your email details if you changed. This is where a redirector pays off - you keep the same email address and you just login to your service and move the destination to wherever you want email to go. This is perfect when changing ISP's (I pointed my mail redirector to deliver to the address of my ISP) but it also occurs to me that its great for technical problems as well. Even Google suffered some technical problems a few weeks ago, and for this its easy to divert your email somewhere else (or indeed - just multicast your email to several locations so that you have a backup to go to in the case of problems).&lt;br /&gt;&lt;br /&gt;This leads me back to rescuing data from the past. In doing my final tidy up, I discovered some of my first blog &lt;a href="http://pintside.blogspot.com/"&gt;posts&lt;/a&gt;, and also some &lt;a href="http://www.planningcards.com/Thoughts/dolphin.html"&gt;Smalltalk projects&lt;/a&gt; that I had forgotten were hosted on my ISP's server. I still use those libraries, and while they are version controlled on my network they may still be useful to others and so it makes sense to move them from the old &lt;cite&gt;&lt;a href="http://www.macta.f2s.com/"&gt;http://www.macta.f2s.com&lt;/a&gt;&lt;/cite&gt; to my main website, &lt;a href="http://www.planningcards.com/Thoughts"&gt;Iterex Planning Cards&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hopefully this post leaves some breadcrumbs for anyone doing some archaeology...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-5196263159996308647?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/12/rescuing-posts-from-past.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-6380633132397658490</guid><pubDate>Thu, 16 Oct 2008 00:37:00 +0000</pubDate><atom:updated>2008-12-12T14:50:34.007Z</atom:updated><title>Printing From a Mac to a Shared XP Printer</title><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Having tested the water, and moved from Windows XP to Mac Leopard OSX - it has been driving me crazy that I can't easily print at home.&lt;br /&gt;&lt;br /&gt;It seemed like it was supposed to work - the Add Printers dialog has a button for Windows printers - but it just remained blank. My old Vaio laptop could see my Desktop's printer, but not the Mac.&lt;br /&gt;&lt;br /&gt;I searched on the internet, and learned about Cups but that didn't work.&lt;br /&gt;&lt;br /&gt;At one point I considered a &lt;a href="http://www.edimax.com/en/produce_detail.php?pd_id=24&amp;amp;pl1_id=7&amp;amp;pl2_id=33"&gt;hardware solution&lt;/a&gt; from Edimax, and then tonight I happened to type in the magic search words "Windows XP LPR" and boom - there it was, the &lt;a href="http://iharder.sourceforge.net/current/macosx/winmacprinter/"&gt;magic recipe&lt;/a&gt; for printing from OSX Leopard. It lists some very detailed steps, and there are a lot of them, but by god it works.&lt;br /&gt;&lt;br /&gt;Many thanks for &lt;a href="http://iharder.sourceforge.net/resume/"&gt;R Harder&lt;/a&gt; for publishing this...&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-6380633132397658490?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/10/printing-from-mac-to-shared-xp-printer.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-4204916062563577682</guid><pubDate>Thu, 16 Oct 2008 00:09:00 +0000</pubDate><atom:updated>2008-12-03T10:21:07.200Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Review</category><category domain='http://www.blogger.com/atom/ns#'>Hardware</category><category domain='http://www.blogger.com/atom/ns#'>Mac</category><category domain='http://www.blogger.com/atom/ns#'>Software</category><title>First Impressions of a Mac Air and OSX</title><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;After hearing countless colleagues extol the benefits of Macs and OSX, I decided that my next laptop would be a Mac.&lt;br /&gt;&lt;br /&gt;My &lt;a href="http://www.notebookcheck.net/Sony-Vaio-VGN-SZ.1750.0.html"&gt;Sony Vaio&lt;/a&gt; has been a great workhorse - running Windows XP and carefully managed so that it was kept free from too many software addons, it has been a relatively stable environment. I tend to reboot it once a month and its suspended and resumed several times a day without incident. However it is slightly heavy (the laptop is 1.6kg however the power supply is another 500g) particularly if you carry it around all day between meetings (I certainly didn't want anything weighing more).&lt;br /&gt;&lt;br /&gt;For me the ultimate laptop allows light weight development on the move, as well as allowing for email and presentations while on client sites. I really was interested in a &lt;a href="www.apple.com/uk/macbookpro/"&gt;MacBook Pro&lt;/a&gt; - however the weight was just too much for me to lug around every day, so I decided that the &lt;a href="www.apple.com/uk/macbookair/"&gt;Mac Air&lt;/a&gt; might just fit the bill.&lt;br /&gt;&lt;br /&gt;There is lots of information already written about the Mac Air, needless to say its not cheap but you do get a quality machine.&lt;br /&gt;&lt;br /&gt;For me its definitely been a relief walking around with something so light on my back - and its not just the machine, but also the miniature power supply that goes with it.&lt;br /&gt;&lt;br /&gt;On the usability front, the screen is small but bright - the autosensing brightness adjustment is cool but I disabled it as I found that moving my head while typing in low light conditions caused it to change brightness in a distracting way. The backlit keyboard is surprisingly useful (even though I am mostly a touch typist).&lt;br /&gt;&lt;br /&gt;The trackpad works very well - I thought the Vaio was good, but this is excellent particularly the gesture support for scrolling and navigating forwards and backwards (annoyingly many applications, even those from apple, don't support it - thank god for multi clutch).&lt;br /&gt;&lt;br /&gt;On the not so well, the European keyboard is not well layed out - the miniture Enter key is silly (not sure what happened to Apple design on that one), I also find the use of the four keys on the bottom left of the keyboard (Fn, Ctrl, Alt, Cmd) to be very confusing. I am never sure which key to hit to move forward by word (Alt-Left), to Delete a character (Fn-Backspace) - it seems that surely 3 keys could do the job somehow.&lt;br /&gt;&lt;br /&gt;On the OSX front - its good, but maybe I was hoping to be amazed and I'm not. I like that its built on top of Unix - although I'm not a mega command line freak (still its nice to use it from time to time, although I wasn't expecting to have to use "shutdown -r now" when I found that one day Finder Restart refused to restart my machine). I also find the menubar and the concept of having to quit applications rather than close a window to be a little confusing. It definitely drives me crazy that you can't invoke menu items using Alt-Mnemonic Letter - in fact while many apps have good keyboard support its often an afterthought.&lt;br /&gt;&lt;br /&gt;Spotlight is working very well for me, its my graphical command line, and its very efficient. TimeMachine is also an excellent idea - and the way it works is nicely thought out (I was impressed to notice that Araxis Merge makes use of it to allow diffs against automatic file history which is very neat).&lt;br /&gt;&lt;br /&gt;In many apps, I often find that funny dialog boxes obscure application screens and they can't be moved around, or if you switch to another application athen then back again, any dialog windows just disappear (e.g. Add Printer). The file dialog is also quite confusing, it took me ages to spot where you create a new directory (the new folder button tucked away at the bottom), or how you know the context of a file you are saving (the drop down folder list displays your directory history in a vertical list box). I also miss miss the windows task bar with its running buttons - I think that was a more intuitive way to see what was running rather than the little dots below applications in the Dock (or if you use expose, its flashy but I don't find its little animated mini windows particularly good for switching quickly between multiple Pages documents, and Cmd-` is a little awkward).&lt;br /&gt;&lt;br /&gt;Overall, a change is always good for the system - its not a revolutionary change that the fans predict, but its definitely a pleasant one.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-4204916062563577682?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/10/first-impressions-of-mac-air-and-osx.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-3492817605424190943</guid><pubDate>Mon, 31 Mar 2008 22:40:00 +0000</pubDate><atom:updated>2008-04-02T01:10:55.854+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Appreciative Inquiry</category><category domain='http://www.blogger.com/atom/ns#'>Retrospectives</category><title>Practicing Receiving...</title><description>&lt;p&gt;Scott Hanselman has a &lt;a title="StandingOnTheirShouldersAndPayingItForward.aspx" href="http://feeds.feedburner.com/~r/ScottHanselman/~3/221209137/StandingOnTheirShouldersAndPayingItForward.aspx"&gt;poignant post&lt;/a&gt; about thanking those who helped you get to where you are now. It's so easy to forget to say thank you - so it was good to read Scott's story and think about who I might thank.&lt;/p&gt; &lt;p&gt;While I'm sure we all have have many appreciations of our own to give, I wanted to call out something just as important - How to properly receive appreciation from someone and just say "Thank you", or "Your Welcome".&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.timetothink.com/uk/index.php?option=com_content&amp;amp;task=view&amp;amp;id=57&amp;amp;phpMyAdmin=9cf86980e10a84c94518cc4163592ee0"&gt;Nancy Kline&lt;/a&gt; in “&lt;a href="http://www.timetothink.com/uk/tttstore/index.php?main_page=product_info&amp;amp;cPath=1&amp;amp;products_id=1"&gt;Time to Think&lt;/a&gt;” writes:  &lt;p&gt;&lt;em&gt;¨In exploring why so few people appreciate each other directly, I discovered the problem lies in people doing such a lousy job of receiving. Being appreciated increases your intelligence. It helps you to think better. So don’t utter a hissing “humph”… Those dismissive responses actually insult the person who paid you the compliment. And insults are a thinking inhibitor. &lt;strong&gt;Just say Thank You&lt;/strong&gt;."&lt;/em&gt;  &lt;p&gt;This is one of the &lt;a href="http://jaoo.dk/london-2008/file?path=/qcon-london-2008/slides//TimMackinnon_AgileAndBeyond.pdf"&gt;messages&lt;/a&gt; I talked about at &lt;a href="http://jaoo.dk/london-2008/tracks/show_track.jsp?trackOID=108"&gt;QCon London&lt;/a&gt;, where I also explored the relationship between Agile Development and Appreciative Inquiry. Too often we forget to practice saying thank you, as well as feeling comfortable saying your welcome.  &lt;p&gt;Nancy also writes that "Lasting relationships exhibit a 5:1 ratio of appreciation to criticism".  &lt;p&gt;I know I often struggle to balance the ratio in this direction. So just like Scott - maybe its time to practice redressing that balance - but also don't forget to practice receiving kind words as well...    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-3492817605424190943?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/03/standing-on-their-shoulders.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-6269420920717285307</guid><pubDate>Tue, 25 Mar 2008 16:51:00 +0000</pubDate><atom:updated>2008-03-25T16:53:32.629Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Programming</category><category domain='http://www.blogger.com/atom/ns#'>Smalltalk</category><category domain='http://www.blogger.com/atom/ns#'>Dolphin</category><title>Smalltalk Announcement Experiences</title><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;In a &lt;a href="http://www.planningcards.com/blog/2008/03/announcements-framework-for-dolphin.html"&gt;previous post&lt;/a&gt;, I described how I was interested in trying out the Announcements Framework in Dolphin Smalltalk and seeing how it changed my code.&lt;/p&gt; &lt;p&gt;Having ported the code to Dolphin, I set about looking at places where I had used Symbolic events and seeing how I might make use of some of the features of Announcements. &lt;/p&gt; &lt;p&gt;I noticed a common pattern in my GUI components (Dolphin has a very interesting GUI compositional model that bears further discussion in a separate post because it really is quite elegant) where I was looking for specific events on my model in order to update a tree widget. &lt;/p&gt;&lt;pre class="csharpcode"&gt;(Array with: aStoryProject backlog with: aStoryProject plan)&lt;br /&gt;        do:&lt;br /&gt;            [:each | &lt;br /&gt;            each&lt;br /&gt;                when: &lt;span class="rem"&gt;#itemUpdated:&lt;/span&gt;&lt;br /&gt;                    send: &lt;span class="rem"&gt;#onItemUpdated:&lt;/span&gt;&lt;br /&gt;                    to: self;&lt;br /&gt;                when: &lt;span class="rem"&gt;#itemAdded:&lt;/span&gt;&lt;br /&gt;                    send: &lt;span class="rem"&gt;#onBacklogChanged:&lt;/span&gt;&lt;br /&gt;                    to: self;&lt;br /&gt;                when: &lt;span class="rem"&gt;#itemRemoved:&lt;/span&gt;&lt;br /&gt;                    send: &lt;span class="rem"&gt;#onBacklogChanged:&lt;/span&gt;&lt;br /&gt;                    to: self]&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I decided to make two changes - the first being adding "," concatenation to my model (copying the idea that impressed me with AnnouncementSet), and then implementing #when:do: in the resulting ModelSet object. This made my code a little more compact:&lt;/p&gt;&lt;pre class="csharpcode"&gt;(aStoryProject backlog , aStoryProject plan)&lt;br /&gt;        when: StoryCardUpdatedAnnouncement &lt;br /&gt;        do: [:ann | ann treeModelUpdate: self model: treeModel];&lt;br /&gt;&lt;br /&gt;        when: StoryCardAddedAnnouncement, StoryCardRemovedAnnouncement &lt;br /&gt;        do: [:ann | ann recalculateFilterFor: self ].&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I also created a hierarchy of StoryCard announcements, which I could then add methods to (in this case #treeModelUpdate:model: and #recalculateFilterFor:) and then call in my announcement Blocks. This change reduced a lot of clutter in my code, as these methods replaced the #onXXXX: methods that were sitting in several GUI components (some confusingly inherited, and some blatantly copy and pasted). The use of the "," operator for the Added and Removed announcements also feels a little more expressive as well.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As I worked through more examples, I also noticed that if my models start announcing changes, then I need a way to conveniently tie those announcements to GUI objects in a Dolphin manner:&lt;/p&gt;&lt;pre class="csharpcode"&gt;model: anIteration&lt;br /&gt;    | velocityProposer |&lt;br /&gt;    super model: anIteration.&lt;br /&gt;&lt;br /&gt;    teamSizePresenter model: (anIteration aspectValue: #teamSize).&lt;br /&gt;&lt;br /&gt;    velocityProposer := VelocityProposer &lt;span class="kwrd"&gt;for&lt;/span&gt;: anIteration.&lt;br /&gt;&lt;br /&gt;    suggestedVelocityPresenter model: &lt;br&gt;      (velocityProposer aspectValue: #suggestedVelocityRangeString).&lt;br /&gt;    suggestedVelocityPresenter model aspectAnnounces: VelocityChanged.&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The above code shows how a normal number presenter can be bound to a #teamSize aspect of anIteration model. However it's also useful to bind to other types of aspects like #suggestedVelocityRangeString which can change dynamically by way of an Announcement (in this case VelocityChanged). This is analogous to the Dolphin #aspectTriggers: method, but instead works for announcements.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I'm still feeling my way through converting to using Announcements, however so far I have been quite pleased with the results. They haven't been ground breaking changes, but they certainly feel tidier&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-6269420920717285307?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/03/smalltalk-announcement-experiences.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-1492940371419707473</guid><pubDate>Tue, 25 Mar 2008 14:29:00 +0000</pubDate><atom:updated>2008-03-25T17:00:34.121Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Programming</category><category domain='http://www.blogger.com/atom/ns#'>Smalltalk</category><category domain='http://www.blogger.com/atom/ns#'>Dolphin</category><title>Announcements Framework for Dolphin Smalltalk</title><description>&lt;p&gt;I while ago I read an interesting article about &lt;a title="http://www.cincomsmalltalk.com/userblogs/vbykov/blogView?showComments=true&amp;amp;entry=3310034894" href="http://www.cincomsmalltalk.com/userblogs/vbykov/blogView?entry=3310034894"&gt;Cincom Announcements&lt;/a&gt;, which pointed out that while most things in Smalltalk are an object in their own right - triggered events have traditionally only been a Symbol (possibly due to the 640k limit of the early Digitalk Smalltalk).&lt;/p&gt; &lt;p&gt;For me, Smalltalk has always been a language and environment that has so many good examples of how things should be done (MVC, Refactoring, Images, IDE's etc), so understanding how this was fixed was something that greatly interested me.&lt;/p&gt; &lt;p&gt;I frequently program in &lt;a href="http://www.object-arts.com"&gt;Dolphin Smalltalk&lt;/a&gt; in my spare time, so I was curious how the use of Announcements might change my code. I had already noticed that as my &lt;a href="http://www.planningcards.com/site/professional"&gt;Iterex tracking application&lt;/a&gt; became bigger it became more awkward to keep track of what events I was generating, and I was sometimes looking for a good place to put common functionality that appeared in event handlers (I have written about some of my experiences in a &lt;a href="http://www.planningcards.com/blog/2008/03/smalltalk-announcement-experiences.html"&gt;later post&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;With this in mind, I decided to port the Cincom VisualWorks Announcements package to Dolphin to try it out. Unfortunately my initial attempt was not completely successful - the VisualWorks implementation is surprisingly large (although a large part of this is an extensive suite of unit tests). While I was able to quickly file-in the code and get most things to compile, there was a subset of tests that I couldn't get to pass. These dealt with a language feature of Cincom that is not available in other Smalltalk's - namely &lt;a href="http://en.wikipedia.org/wiki/Ephemeron"&gt;ephemerons&lt;/a&gt;. While I thought I understood the purpose of these, I was never able to code something that would emulate them to the extent that the tests would pass.&lt;/p&gt; &lt;p&gt;After a few attempts, it occurred to me that I had seen an implementation in Squeak Smalltalk and so I was curious about how this had been done. It turns out that there are actually 3 or more implementations, however I hadn't realised this at the time: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;A minimal implementation as part of the &lt;a href="http://www.wiresong.ca/OmniBrowser/"&gt;OmniBrowser&lt;/a&gt; framework and described in the thread: &lt;a title="http://www.wiresong.ca/air/articles/2006/06/11/announcements" href="http://www.wiresong.ca/air/articles/2006/06/11/announcements"&gt;Announcements in Omnibrowser&lt;/a&gt;&amp;nbsp; &lt;li&gt;An &lt;a href="http://mc.lukas-renggli.ch/announcements.html"&gt;extended version&lt;/a&gt; of the initial OmniBrowser implementation slightly generalized and separately packaged.  &lt;li&gt;A &lt;a href="http://www.squeaksource.com/AXAnnouncements.html"&gt;complete port&lt;/a&gt; of the original announcement framework as found in Cincom VisualWorks.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I started out with #2 above, and was quickly taken by how compact the implementation is, although I was also slightly disappointed with how small its suite of tests was (there are tests, but they are very minimal). To understand the limitations of the implementation, I decided to augment the basic tests with those provided with the Cincom implementation.&lt;/p&gt; &lt;p&gt;As I copied each test, I ran it, and if it failed I considered whether it was an important requirement for a basic implementation, or whether it was a more esoteric requirement that I could cover later (in that case I moved the test to a separate package). I ended up with an interesting hybrid of the two implementations.&lt;/p&gt; &lt;p&gt;The Squeak implementation #2 uses a global singleton announcer object whereas the VisualWorks implementation uses an event table on each object - I found that the latter is also much more natural in Dolphin, and in fact as there is already an event table for objects (either directly in the case of Model objects and their subclasses, or indirectly via an external dictionary for other objects) I was able to simply add Announcement in the same place.&lt;/p&gt; &lt;p&gt;I was also quite taken by both Squeak and Cincom's use of AnnouncementSet - and simply implementing concatenation on Announcement to return the composite Set:&lt;/p&gt;&lt;pre class="csharpcode"&gt;, anAnnouncementClass&lt;br /&gt;    ^ AnnouncementSet with: self with: anAnnouncementClass&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;Furthermore, I was inspired by how the Squeak implementation takes this a step further and also delegates to Announcement or AnnouncementSet to see if it #handles: a particular announcement (this is a a neat simplification of code). This fitted in nicely with the Dolphin implementation as I simply added #handles: to symbol so that it can treat both Annoucements and Symbols similarly in the original code:&lt;/p&gt;&lt;pre class="csharpcode"&gt;triggerAnnouncement: anAnnouncement &lt;span class="kwrd"&gt;for&lt;/span&gt;: anObject&lt;br /&gt;    ...&lt;br /&gt;    self keysAndValuesDo: [:announcementKey :actions |&lt;br /&gt;                (announcementKey handles: announcementToTrigger) &lt;br&gt;          ifTrue: [toAnnounce addAll: actions]].&lt;br /&gt;&lt;br /&gt;    announcementToTrigger &lt;span class="kwrd"&gt;class&lt;/span&gt; broadcast: announcementToTrigger to: toAnnounce&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;It's also worth mentioning that the last line of the above method paves the way for Meta-Announcments. By delegating to the Announcement class to broadcast its event you have control on how events are sent, and in the Dolphin implementation I have added the following:&lt;/p&gt;&lt;pre class="csharpcode"&gt;broadcast: anAnnouncementInstance to: anEventSet&lt;br /&gt;    super broadcast: anAnnouncementInstance to: anEventSet.&lt;br /&gt;    &lt;br /&gt;    self broadcastMeta: anAnnouncementInstance&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Where #broadcastMeta: allows the client to subscribe to MetaAnnouncement's and hence subscribe to all announcements for debugging purposes or simply as a more convenient way to know that events have happened:&lt;/p&gt;&lt;pre class="csharpcode"&gt;broadcastMeta: anAnnouncementInstance&lt;br /&gt;    self announce: (MetaAnnouncement &lt;span class="kwrd"&gt;for&lt;/span&gt;: anAnnouncementInstance).&lt;br /&gt;    self == ObservableAnnouncement ifFalse:&lt;br&gt;          [ self superclass broadcastMeta: anAnnouncementInstance].&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I haven't played around with these MetaAnnouncments much (but did write some tests for them) - but certainly the debugging aspect strikes me as being particularly useful. This simple trick might be something interesting to roll into the Squeak and Cincom implementations.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Having successfully ported Announcements to Dolphin, I have found that they have simplified some of my code (a topic for a future post). I was also pleased to find that they work well with the Dolphin packaging system and I had no troubles creating my final .exe using the standard tools.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The final Dolphin packages can be downloaded from the &lt;a href="http://www.planningcards.com/site/index.php?option=com_content&amp;amp;task=blogcategory&amp;amp;id=25&amp;amp;Itemid=68"&gt;Iterex Dolphin Announcements&lt;/a&gt; page.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-1492940371419707473?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/03/announcements-framework-for-dolphin.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-4946115606440358900</guid><pubDate>Sun, 20 Jan 2008 20:00:00 +0000</pubDate><atom:updated>2008-01-20T19:57:29.153Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>writing</category><title>Offline Blog Writing With WLW</title><description>&lt;p&gt;When I first looked into blog writing, most offline blog writers were fairly clunky - however in the background I have been tracking Windows Live Writer as it always looked easy to use.&lt;/p&gt; &lt;p&gt;To meet my new years resolution of blogging I decided I would give it a spin. Installation was pretty simple, and while it took me a few moments to figure out how to configure it for Blogger - I easily found some clues online, namely enter the url of your weblog (in my case I am hosting it on my website - &lt;a href="http://www.planningcards.com/blog/index.html"&gt;http://www.planningcards.com/blog/index.html&lt;/a&gt;) and make sure you use your full blogger gmail account.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.google.com/365nice/R5OnpJYLO4I/AAAAAAAAAHw/8CcF8bOO42U/image%5B7%5D?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="301" alt="image" src="http://lh3.google.com/365nice/R5OnqJYLO5I/AAAAAAAAAH4/d96UNCFbPSY/image_thumb%5B3%5D?imgmax=800" width="383" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I have to say, my first impressions are very good. As I often travel, being able to author ideas while offline is very important to me.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-4946115606440358900?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/01/offline-blog-writing.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-7882101066258810221.post-3963644549027754984</guid><pubDate>Sun, 20 Jan 2008 17:52:00 +0000</pubDate><atom:updated>2008-01-20T17:54:33.755Z</atom:updated><title>New Years Resolutions</title><description>Having had several attempts at blogging in the past, but having typically written papers or given presentations I thought it was time to try and see if I can find a rhythm to documenting my thoughts and ideas in 2008.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7882101066258810221-3963644549027754984?l=www.planningcards.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.planningcards.com/blog/2008/01/new-years-resolutions.html</link><author>noreply@blogger.com (Tim Mackinnon)</author></item></channel></rss>