<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6477557</id><updated>2011-09-14T17:18:21.932-05:00</updated><category term='music'/><category term='squeak seaside programming web'/><category term='arc oreilly'/><title type='text'>Fuming Incense Stencher</title><subtitle type='html'>a geek prattling on</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>84</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6477557.post-4262804953361665792</id><published>2008-08-09T09:30:00.001-05:00</published><updated>2008-08-09T09:35:01.830-05:00</updated><title type='text'>He's Gone</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/OYA16z2-xFg&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/OYA16z2-xFg&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-4262804953361665792?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=sEke7x4CKSM' title='He&apos;s Gone'/><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/4262804953361665792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=4262804953361665792' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/4262804953361665792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/4262804953361665792'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2008/08/hes-gone.html' title='He&apos;s Gone'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-7901157527505838163</id><published>2008-07-07T13:30:00.003-05:00</published><updated>2008-07-07T13:47:25.485-05:00</updated><title type='text'>Learning to prepare eel</title><content type='html'>From "Kyoto's Never-Changing Scene", Gourmet, May 2007, p. 225&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;It took him a good three years to learn to slice eel correctly, he said, but at least eight to learn  how to properly insert the skewers. "I've only been in the kitchen for ten years, so I haven't mastered it yet.  Every eel is different.  I'm still benkyo [studying] every day," he said, smiling at Matsuno, who smiling back, had the last word: "It takes a lifetime, " she said.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Just to provide more context, this is the junior cook at an eel restaurant in Kyoto. They serve eel - not sushi, not tempura, not noodles - just eel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-7901157527505838163?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/7901157527505838163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=7901157527505838163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/7901157527505838163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/7901157527505838163'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2008/07/learning-to-prepare-eel.html' title='Learning to prepare eel'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-3350106180692956838</id><published>2008-02-11T07:54:00.000-06:00</published><updated>2008-02-11T08:14:50.598-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Orchard Lounge vs. Kubrick</title><content type='html'>This would have been awesome in my more &lt;i&gt;experimental&lt;/i&gt; days.  Check out &lt;a href="http://www.orchardlounge.com/videos.html"&gt;Orchard Lounge vs. Kubrick&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;BTW, their &lt;a href="http://www.orchardlounge.com/mixes.html"&gt;free mixed tapes&lt;/a&gt; are killer.  Here is their &lt;a href="feed://www.orchardlounge.com/rss/mixes.xml"&gt;podcast&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-3350106180692956838?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/3350106180692956838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=3350106180692956838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/3350106180692956838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/3350106180692956838'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2008/02/orchard-lounge-vs-kubrick.html' title='Orchard Lounge vs. Kubrick'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-1195785745176065804</id><published>2008-01-31T19:12:00.000-06:00</published><updated>2008-01-31T19:19:27.782-06:00</updated><title type='text'>Python Autotester (Leopard only)</title><content type='html'>I've been doing some Python development lately.  Sadly, I could not find an equivalent to Ruby's ZenTest::Autotest.  However, there is &lt;a href="http://somethingaboutorange.com/mrl/projects/nose/"&gt;nose&lt;/a&gt; which will run anything test-like in its search path. Then there is Pyobjc  pre-installed on Leopard, and Leopard has the new carbon  FSEvents API.  All I need to do is glue all of those together.  Can't be that hard!  Fortunately, those famous last words held up this time.  Here's a pastie for it:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/f675e6b1"&gt;http://pastebin.com/f675e6b1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-1195785745176065804?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/1195785745176065804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=1195785745176065804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/1195785745176065804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/1195785745176065804'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2008/01/python-autotester-leopard-only.html' title='Python Autotester (Leopard only)'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-4814992425478044195</id><published>2008-01-29T23:36:00.000-06:00</published><updated>2008-01-30T11:07:22.948-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arc oreilly'/><title type='text'>O'Reilly Arc Book</title><content type='html'>In honor of &lt;a href="http://arclanguage.org"&gt;Arc&lt;/a&gt; being made available, I created an O'Reilly book cover here &lt;a href="http://www.oreillymaker.com/link/8528/arc/"&gt;http://www.oreillymaker.com/link/8528/arc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Update: fixed the misspelling of parentheses.&lt;br /&gt;Here is the original (funnier?) &lt;a href="http://www.oreillymaker.com/link/7957/arc/"&gt;"parenthesises" version&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-4814992425478044195?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/4814992425478044195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=4814992425478044195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/4814992425478044195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/4814992425478044195'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2008/01/oreilly-arc-book.html' title='O&apos;Reilly Arc Book'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-1578904492833226682</id><published>2008-01-25T20:08:00.000-06:00</published><updated>2008-01-25T20:20:02.920-06:00</updated><title type='text'>Amen, Brother</title><content type='html'>&lt;a href="http://patricklogan.blogspot.com/2008/01/dynamic-languages-should-tools-suck.html"&gt;Dynamic Languages: Should the Tools Suck?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm tired of hearing "Ruby is the new Smalltalk" (even from Kent Beck!!)  I prefer "Smalltalk, it's like Ruby with tools."&lt;br /&gt;&lt;br /&gt;Here's something I was playing around with using these archaic tools from the 80's ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.squeaksource.com/Autotester.html"&gt;Autotester&lt;/a&gt;-&lt;a href="http://wilkesjoiner.com/AutotesterFirst.mov.zip"&gt;a demo video&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-1578904492833226682?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/1578904492833226682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=1578904492833226682' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/1578904492833226682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/1578904492833226682'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2008/01/amen-brother.html' title='Amen, Brother'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-5616953148984843902</id><published>2007-12-19T20:30:00.000-06:00</published><updated>2007-12-19T20:59:10.912-06:00</updated><title type='text'>If Steve Yegge were really talking to a young programmer...</title><content type='html'>...then I hope he wouldn't recommend Javascript (or ES4)!  It may suck less than Java, but come on.  &lt;br /&gt;&lt;br /&gt;To any young programmer daring for greatness, I have 3 recommendations.  &lt;ol&gt;&lt;br /&gt;&lt;li&gt;Learn Lisp.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Learn Smalltalk.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Learn Prolog.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;You'll be forced to deal with the other languages at some point.  There is no sense in crushing your idealism right out of the gate.&lt;br /&gt;&lt;br /&gt;This is in reference to: &lt;a href="http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html"&gt;http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-5616953148984843902?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/5616953148984843902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=5616953148984843902' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/5616953148984843902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/5616953148984843902'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2007/12/if-steve-yegge-were-really-talking-to.html' title='If Steve Yegge were really talking to a young programmer...'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-2779391860075260915</id><published>2007-11-12T07:58:00.000-06:00</published><updated>2007-11-12T08:10:08.945-06:00</updated><title type='text'>OOPSLA '08 - Nashville!!</title><content type='html'>OOPSLA has long been on my conference todo list.  Since it will come here next year, I won't have an excuse for not going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-2779391860075260915?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/2779391860075260915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=2779391860075260915' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/2779391860075260915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/2779391860075260915'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2007/11/oopsla-08-nashville.html' title='OOPSLA &apos;08 - Nashville!!'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-5485782669515514457</id><published>2007-10-19T11:28:00.000-05:00</published><updated>2007-10-19T11:35:28.922-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='squeak seaside programming web'/><title type='text'>New Seaside Tutorial</title><content type='html'>If you haven't tried &lt;a href="http://seaside.st"&gt;Seaside&lt;/a&gt; out, you no longer have an excuse.&lt;br /&gt;&lt;a href="http://www.swa.hpi.uni-potsdam.de/seaside/tutorial"&gt;http://www.swa.hpi.uni-potsdam.de/seaside/tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a good idea to get up to speed so that you can enjoy &lt;a href="http://gemstonesoup.wordpress.com"&gt;GLASS&lt;/a&gt; when it becomes available.&lt;br /&gt;&lt;br /&gt;For general introduction to Squeak, try &lt;a href="http://squeakbyexample.org/"&gt;http://squeakbyexample.org/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-5485782669515514457?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/5485782669515514457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=5485782669515514457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/5485782669515514457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/5485782669515514457'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2007/10/new-seaside-tutorial.html' title='New Seaside Tutorial'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-5154770541434925868</id><published>2007-10-18T12:42:00.000-05:00</published><updated>2007-10-19T07:46:53.290-05:00</updated><title type='text'>iPhone SDK, Ubuntu 7.10, Leopard Oct 26th, ...</title><content type='html'>It's like my newsreader is stuck in an infinite loop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-5154770541434925868?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/5154770541434925868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=5154770541434925868' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/5154770541434925868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/5154770541434925868'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2007/10/iphone-sdk-ubuntu-710-panther-oct-26th.html' title='iPhone SDK, Ubuntu 7.10, Leopard Oct 26th, ...'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-1831208050538680663</id><published>2007-10-07T09:56:00.000-05:00</published><updated>2007-10-07T10:04:06.550-05:00</updated><title type='text'>What I look for in a programming language</title><content type='html'>Through a series of posts, I stumbled upon &lt;a href="http://www.cincomsmalltalk.com/userblogs/ralph/blogView?showComments=true&amp;entry=3335803396"&gt;this little gem by Ralph Johnson&lt;/a&gt;:&lt;blockquote&gt;Some people like languages with a lot of features. I prefer simple languages. Smalltalk makes "constructor" be a convention. Arithmetic is in the library, not in the language. Control structures and exception handling are from the library, not in the language.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-1831208050538680663?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/1831208050538680663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=1831208050538680663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/1831208050538680663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/1831208050538680663'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2007/10/what-i-look-for-in-programming-language.html' title='What I look for in a programming language'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-3851715351608236724</id><published>2007-03-22T09:30:00.000-05:00</published><updated>2007-03-22T10:03:13.556-05:00</updated><title type='text'>PLEASE READ, American jailed in Nicaragua</title><content type='html'>This is a childhood friend of one of my friends.  This has received almost no U.S. press coverage, with the exception of the &lt;a href="http://online.wsj.com/article/SB117426483422241025.html?mod=googlenews_wsj"&gt;Wall Street Journal&lt;/a&gt;.  Please help get the word out.  &lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8YChhOHrFA4"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/8YChhOHrFA4" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.friendsofericvolz.com/"&gt;http://www.friendsofericvolz.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.myspace.com/freeericvolz"&gt;http://www.myspace.com/freeericvolz&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-3851715351608236724?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/3851715351608236724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=3851715351608236724' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/3851715351608236724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/3851715351608236724'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2007/03/please-read-american-jailed-in.html' title='PLEASE READ, American jailed in Nicaragua'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-114988759533880910</id><published>2006-06-09T15:52:00.000-05:00</published><updated>2006-06-09T16:13:15.363-05:00</updated><title type='text'>Pzizz</title><content type='html'>&lt;a href="http://maczot.com/?mod=blogzot"&gt;From MacZOT&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;MacZOT.com Fans want &lt;a href='http://www.pzizz.com' target='_blank'&gt;Pzizz&lt;/a&gt; because 'According to the National Sleep Foundation, sleep deprivation and its effect on work performance may be costing U.S. employers some $18 billion each year in lost productivity. Another study pushes this cost to over $100 billion.' - &lt;a href='http://www.super-solutions.com/SleepDeprivation_WorkerProductivity.asp'&gt;link to full article&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-114988759533880910?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/114988759533880910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=114988759533880910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114988759533880910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114988759533880910'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/06/pzizz.html' title='Pzizz'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-114745295459826192</id><published>2006-05-12T11:52:00.000-05:00</published><updated>2006-05-12T12:16:15.376-05:00</updated><title type='text'>Sophie - Squeak App</title><content type='html'>&lt;a href="http://www.futureofthebook.org/sophie/"&gt;Sophie&lt;/a&gt;  is an example of a nice looking Squeak app, a true rarity.  It appears to be using &lt;a href="http://tweak.impara.de"&gt;Tweak&lt;/a&gt; and I think some custom widgets.  It's been a while since I looked at Tweak so I'm not sure how much is the default versus custom L&amp;F.  &lt;a href="http://www.geeksrus.com/sophie"&gt;Here are some some screencast.&lt;/a&gt;  I definitely need to read up more about it.&lt;br /&gt;&lt;br /&gt;Screenshot of Sophie Countdown widget.&lt;br /&gt;&lt;img src="http://wilkesjoiner.com/sophie-49.jpg"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-114745295459826192?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/114745295459826192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=114745295459826192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114745295459826192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114745295459826192'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/05/sophie-squeak-app.html' title='Sophie - Squeak App'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-114556233518831159</id><published>2006-04-20T14:42:00.000-05:00</published><updated>2006-04-20T15:52:26.296-05:00</updated><title type='text'>Croquet 1.0 beta is here</title><content type='html'>From David Smith's &lt;a href="http://croqueteer.blogspot.com/2006/04/croquet-10-beta-sdk-released.html"&gt;blog&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Find out more at &lt;a href="http://www.opencroquet.org"&gt;http://www.opencroquet.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can view some movies from Mark McCahill's Croquet-Bento blog &lt;a href="http://croquet-bento.blogspot.com/2006/04/croquet-sdk-released.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Very cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-114556233518831159?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/114556233518831159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=114556233518831159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114556233518831159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114556233518831159'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/04/croquet-10-beta-is-here.html' title='Croquet 1.0 beta is here'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-114166616188142953</id><published>2006-03-06T10:38:00.000-06:00</published><updated>2006-03-06T12:09:59.490-06:00</updated><title type='text'>Congratulations to DabbleDB</title><content type='html'>&lt;a href="http://www.dabbledb.com/about/"&gt;DabbleDB&lt;/a&gt; won &lt;a href="http://undertheradarblog.com/2006/03/03/and-the-winner-is/"&gt;Best of Show and Make It Easy&lt;/a&gt; categories at the &lt;a href="http://undertheradarblog.com/web-20-beyond-the-bubble/"&gt;Under the Radar&lt;/a&gt; conference. &lt;br /&gt;&lt;br /&gt;This is well deserved recognition.  DabbleDB is a fantastic product with a very clean interface and exceptional attention to detail.  Writing this sort of dynamic data storage and manipulation is wonderful application of Smalltalk and &lt;a href="http://www.seaside.st"&gt;Seaside&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To read more about it Rowan Bunning has a post &lt;a href="http://www.cincomsmalltalk.com/userblogs/rowanb/blogView?showComments=true&amp;entry=3319042815"&gt;here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-114166616188142953?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/114166616188142953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=114166616188142953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114166616188142953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114166616188142953'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/03/congratulations-to-dabbledb.html' title='Congratulations to DabbleDB'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-114022882301127736</id><published>2006-02-17T20:06:00.000-06:00</published><updated>2006-02-17T20:13:43.023-06:00</updated><title type='text'>Metric time (Who needs sleep?)</title><content type='html'>Does anybody remember the SNL skit about converting to metric time, 100 hour days, 100 days in a month, 10 months a year.  The solution was government subsidized speed during waking hours and Quaaludes to sleep.  &lt;a href="http://www.sky.com/skynews/article/0,,30000-13507653,00.html"&gt;Apparently this may not be to far off&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;I remember my dad telling me that in 60's they were saying that because we were becoming so much more efficient that we would have more free time.  People would work 20 hours a week rather than 40.  Too bad the exact opposite happened.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-114022882301127736?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/114022882301127736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=114022882301127736' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114022882301127736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114022882301127736'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/02/metric-time-who-needs-sleep.html' title='Metric time (Who needs sleep?)'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-114020732047710768</id><published>2006-02-17T13:57:00.000-06:00</published><updated>2006-02-17T14:15:20.506-06:00</updated><title type='text'>Neighborhood victory!</title><content type='html'>My neighborhood has been involved in very heated debate over a Conservation overlay for the past year.  This is basically a light version of a Historic District.  Our councilman took a survey last Spring and said that the neighborhood was in favor of the overlay.  Those opposed did their own survey a few months later and said the neighborhood was against the overlay.  After several months and many meetings that culminated with the longest meeting in Nashville City Council history, it may all be over.  The city council decided to conduct its own survey.  &lt;a href="http://www.tennessean.com/apps/pbcs.dll/article?AID=/20060217/NEWS0202/60217007/-1/RSS"&gt;According to the local paper&lt;/a&gt; the results are in and the neighborhood voted &lt;b&gt;2-1 against the overlay&lt;/b&gt;.  My hats off to some on both sides who attempted to present honestly the pros and cons on the issues, and to those who spent many hours of their own time championing their cause.  With the exception of our councilman, who behaved like an arrogant teenager, the community treated each other with as much respect as one can hope for with such a hot button issue.  It was nice to see democracy at work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-114020732047710768?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/114020732047710768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=114020732047710768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114020732047710768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114020732047710768'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/02/neighborhood-victory.html' title='Neighborhood victory!'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-114014620065257739</id><published>2006-02-16T21:07:00.000-06:00</published><updated>2006-02-16T21:16:40.690-06:00</updated><title type='text'>Quit posting Dvorak on /.</title><content type='html'>&lt;a href="http://www.pcmag.com/article2/0,1895,1923151,00.asp"&gt;Exhibit ZZZZZ&amp;#8734;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't even think he believes this tripe. I wish I could make a living posting complete crap.  Maybe &lt;a href="http://www.gartner.com/"&gt;Gartner&lt;/a&gt; is hiring?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-114014620065257739?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/114014620065257739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=114014620065257739' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114014620065257739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/114014620065257739'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/02/quit-posting-dvorak-on.html' title='Quit posting Dvorak on /.'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113891631632395818</id><published>2006-02-02T15:35:00.000-06:00</published><updated>2006-02-02T15:40:37.006-06:00</updated><title type='text'>Google Maps - Face in the Sand</title><content type='html'>&lt;a href="http://maps.google.com/maps?t=k&amp;hl=en&amp;ll=-16.341133,-71.965269&amp;spn=0.323524,0.468292&amp;t=k"&gt;Pretty cool&lt;/a&gt; satellite photo of Peru.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113891631632395818?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113891631632395818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113891631632395818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113891631632395818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113891631632395818'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/02/google-maps-face-in-sand.html' title='Google Maps - Face in the Sand'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113802985257810420</id><published>2006-01-23T09:17:00.000-06:00</published><updated>2006-01-23T09:24:12.593-06:00</updated><title type='text'>Excellent Post on Common XP Questions</title><content type='html'>&lt;a href="http://www.darrenhobbs.com/"&gt;Darren Hobbs&lt;/a&gt; has a great &lt;a href="http://www.darrenhobbs.com/archives/2006/01/agile_answers.html"&gt;write up of answers&lt;/a&gt; to questions that inevitably come up when adopting XP.  My favorite quote is the last line, "Code is clay, not marble. Or at least it should be."  It is a worthwhile read if you are introducing or adopting XP.  &lt;a href="http://www.darrenhobbs.com/archives/2006/01/agile_answers.html"&gt;Go read it&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113802985257810420?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113802985257810420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113802985257810420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113802985257810420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113802985257810420'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/01/excellent-post-on-common-xp-questions.html' title='Excellent Post on Common XP Questions'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113787756657494479</id><published>2006-01-21T14:52:00.000-06:00</published><updated>2006-01-21T15:06:06.603-06:00</updated><title type='text'>FeedBurner set up</title><content type='html'>I've created an account through &lt;a href="http://www.feedburner.com"&gt;FeedBurner&lt;/a&gt;.  I use the free version of &lt;a href="http://blogger.com"&gt;Blogger&lt;/a&gt;.  It only supports atom feeds.  Fine, no big deal.  That feed is still there, but if you use this &lt;a href="http://feeds.feedburner.com/FumingIncenseStencher"&gt;feed&lt;/a&gt;, then you will get an RSS 2.0 feed with enclosure support.  Sounds like a pretty good deal to me.  As a bonus, if I move my site, which has been tempting lately, you won't have to update your link to my feed.  &lt;br /&gt;&lt;br /&gt;This also allows me to be published through Artima.  Most of my post this past year have been on Smalltalk, but there are post on Ruby, Java, and other more general stuff that I've blogged about.  So if you are reading this via Artima and you haven't been here before, browse around and give me some feedback.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113787756657494479?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113787756657494479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113787756657494479' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113787756657494479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113787756657494479'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/01/feedburner-set-up.html' title='FeedBurner set up'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113718167444765406</id><published>2006-01-13T13:31:00.000-06:00</published><updated>2006-01-13T13:56:54.850-06:00</updated><title type='text'>Debugging in Seaside</title><content type='html'>I've created a short (3min) video showing how you can deal with a stack trace while developing a Seaside application.  One thing to note is that most of this power and flexibility comes from the Smalltalk environment itself.  This sort of dynamic runtime inspection and modification is available when developing just about any application with Smalltalk.  You should look at the &lt;a href="http://www.cincomsmalltalk.com/blog/blogView?searchCategory=screencast"&gt;screencasts&lt;/a&gt; from James Robertson's &lt;a href="http://www.cincomsmalltalk.com/blog/blogView"&gt;blog&lt;/a&gt; for some examples of neat and practical things you can do in the VisualWorks environment.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wilkesjoiner.com/DebugDemo.mov"&gt;Click here to watch the movie (Quicktime, 6.9M)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113718167444765406?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113718167444765406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113718167444765406' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113718167444765406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113718167444765406'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/01/debugging-in-seaside.html' title='Debugging in Seaside'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113649018494068623</id><published>2006-01-05T13:36:00.000-06:00</published><updated>2006-01-05T13:43:04.956-06:00</updated><title type='text'>Free Phish</title><content type='html'>Phish has &lt;a href="http://www.phish.com/news/?year=2006#story299"&gt;announced&lt;/a&gt; that they are going to start releasing video downloads.  They are offering a free download from their legendary 1995 NYE show.  This is a perfect example of why they had to call it quits.  They just weren't doing stuff this good anymore.  So if you are a Phishhead or wondered what you missed go check it out.  It is a great example of what some people love and others loathe about Phish.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113649018494068623?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113649018494068623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113649018494068623' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113649018494068623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113649018494068623'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2006/01/free-phish.html' title='Free Phish'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113530627048493690</id><published>2005-12-22T20:43:00.000-06:00</published><updated>2005-12-22T20:51:10.493-06:00</updated><title type='text'>Avi Interview</title><content type='html'>Checkout this &lt;a href="http://paranode.com/~topfunky/audio/2005/Avi-Bryant.mp3"&gt;interview&lt;/a&gt; with Avi Bryant (&lt;a href="http://www.seaside.st/"&gt;Seaside&lt;/a&gt; and &lt;a href="http://www.dabbledb.com"&gt;Dabble&lt;/a&gt; creator).  It's a shame that the sound quality isn't better, but there is some great insight buried in the garble.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113530627048493690?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113530627048493690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113530627048493690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113530627048493690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113530627048493690'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/12/avi-interview.html' title='Avi Interview'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113483957562393302</id><published>2005-12-17T12:01:00.000-06:00</published><updated>2006-01-21T15:11:06.770-06:00</updated><title type='text'>Static vs. Dynamic is missing the point</title><content type='html'>I'm too lazy to link to the myriad of post on this topic, &lt;a href="http://www.google.com/search?q=static+vs+dynamic+typing"&gt;google it&lt;/a&gt;.  The arguments have been stated and rehashed over and over again.  One pro dynamic typing  arguments goes something like, "Dynamic typing is safe with a good set of unit tests."  I think this is true of any system, static, dynamic, manifest, implicit, ...  Whenever I am speaking with a Smalltalker who has worked on "enterprise" systems, I always asked them if they encountered problems with objects being of the wrong type.  The reaction is usually a quizzical look wondering why I am asking the question followed by search through there memory and then a simple, "Nope, well, maybe once, but it was caught very quickly."  These are developers whose systems began in the 90's and they were not doing any "unit testing."  Lispers have given me similar answers.  Talk to a C programmer and you will get a much different answer.&lt;br /&gt;&lt;br /&gt;So why aren't they experiencing the typing problem without the benefit of unit test.  I've got a couple of theories, but the dominant one is &lt;b&gt;interactivity&lt;/b&gt;.  When I'm writing a program in Smalltalk, I may just start off with a Workspace.  Type in some code and evaluate it and open it up in an Inspector.  As the program grows, I start refactoring the code in the Workspace into classes and inspecting it.  Now is where things get really cool.  At this point, I have an inspector open on some object.  I can go in and modify or add methods in the class and evaluate them in the Inspector.  I can open up inspectors on the results of those method calls, and so on...&lt;br /&gt;&lt;br /&gt;When coding Ruby, I'll do a similar thing with files and irb (Interactive Ruby), albeit without the nice GUI tools.&lt;br /&gt;&lt;br /&gt;Here is a &lt;a href="http://bc.tech.coop/blog/051216.html"&gt;nice movie&lt;/a&gt; of this style in Lisp.&lt;br /&gt;&lt;br /&gt;So what does this have to with Static vs. Dynamic?  I think the real issue is early vs. late binding.  In languages that allow you to interact and modify the objects and their definitions at runtime you gain a huge productivity boost.  Your feedback loop is much tighter, and you can verify behavior &lt;b&gt;&lt;i&gt;and&lt;/i&gt;&lt;/b&gt; correct behavior on the fly.  &lt;br /&gt;&lt;br /&gt;I'm am a strong advocate of unit test, and I recommend writing unit test in these late bound languages.   In fact, transforming the Workspace / Inspector approach to a unit test / debug and inspect approach will provide the most bang for the buck.  Here is an &lt;a href="http://www.xprogramming.com/xpmag/BowlingForSmalltalk.htm"&gt;article by Ron Jeffries&lt;/a&gt; on this style.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113483957562393302?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113483957562393302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113483957562393302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113483957562393302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113483957562393302'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/12/static-vs-dynamic-is-missing-point.html' title='Static vs. Dynamic is missing the point'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113460374282192800</id><published>2005-12-14T17:41:00.000-06:00</published><updated>2005-12-14T17:42:22.830-06:00</updated><title type='text'>Ah, pretty...</title><content type='html'>Elegant code:&lt;pre&gt;((String[])object)[0];&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113460374282192800?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113460374282192800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113460374282192800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113460374282192800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113460374282192800'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/12/ah-pretty.html' title='Ah, pretty...'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113458638960896502</id><published>2005-12-14T13:11:00.000-06:00</published><updated>2005-12-14T13:14:41.146-06:00</updated><title type='text'>Simple code generation in Smalltalk</title><content type='html'>I'm not trying to add any fuel to the fire in Smalltalk environment vs. Java IDE wars.  They have been mostly reasonable and informative.  BTW, Smalltalk is an environment.  If you look at it as an IDE you will miss out on what makes so wonderful to work with.  &lt;br /&gt;&lt;br /&gt;This weekend I was playing around with writing an iTunes remote control via a web interface using Squeak and Seaside.  iTunes provides a plist xml file that contains all of the tracks with their various attributes, (i.e. genre, artist, album, etc...).  I was just parsing the xml into a hierarchy of dictionaries.  After a while I really wanted an ITunesTrack object.  However, some tracks have some attributes and not others and there are bunch of them.  Writing this class by hand would have been very tedious and error prone.  This is where the power of the Smalltalk environment really shines.  &lt;br /&gt;&lt;br /&gt;I am a Smalltalk newbie and still have a lot to learn about the environment, but I was able to throw this code together in about 15 minutes including the time spent browsing the classes in the system.&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Grab all attributes for the tracks, convert them to legal var names, i.e. 'Track ID' =&gt; 'trackID', sort alphabetically  &lt;pre&gt;trackProperties := Set new.&lt;br /&gt;ITunesLibrary instance tracks do: &lt;br /&gt;    [:each | each keys do: [:k | trackProperties add: k asLegalSelector]].&lt;br /&gt;vars := trackProperties asSortedCollection&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add them as instance variables to the ITunesTrack.&lt;pre&gt;vars do: [:each | ITunesTrack addInstVarName: each].&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Generate the accessors for the variables using the code from the RefactoringBrowser.&lt;pre&gt;ITunesTrack instVarNames do: &lt;br /&gt; [:each | (CreateAccessorsForVariableRefactoring &lt;br /&gt;                   variable: each&lt;br /&gt;                   class: ITunesTrack &lt;br /&gt;                   classVariable: false) execute].&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Browse the class when finished to make sure every thing worked as planned.&lt;pre&gt;ITunesTrack class browse.&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;This was just a one off and I executed this in the Workspace.  I'm sure that a more experienced Smalltalkers would have a more idiomatic implementation.  If I were to generalize it, I would probably do somethings to trim the code down and eliminate some unnecessary local variables.   The point is with relatively little experience, I was able to write a simple code generator to define an Object from a Dictionary.  I was able to do this with out any file mangling, I can update the class as needed without destroying the existing source code, and I never needed shift paradigms from objects and message to objects, messages, and files.  I was able to reuse code from a complex refactoring framework with out the need to understand the entire framework.   Having a simple paradigm, such as everything is an object and all behavior is triggered by messages, and using it consistently extremely empowering.  &lt;br /&gt;&lt;br /&gt;The here is the whole enchilada:&lt;br /&gt;&lt;pre&gt;trackProperties := Set new.&lt;br /&gt;ITunesLibrary instance tracks do: &lt;br /&gt;    [:each | each keys do: [:k | trackProperties add: k asLegalSelector]].&lt;br /&gt;vars := trackProperties asSortedCollection&lt;br /&gt;vars do: [:each | ITunesTrack addInstVarName: each].&lt;br /&gt;&lt;br /&gt;ITunesTrack instVarNames do: &lt;br /&gt; [:each | (CreateAccessorsForVariableRefactoring &lt;br /&gt;                   variable: each&lt;br /&gt;                   class: ITunesTrack &lt;br /&gt;                   classVariable: false) execute].&lt;br /&gt;ITunesTrack class browse.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113458638960896502?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113458638960896502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113458638960896502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113458638960896502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113458638960896502'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/12/simple-code-generation-in-smalltalk.html' title='Simple code generation in Smalltalk'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113414673246785504</id><published>2005-12-09T10:33:00.000-06:00</published><updated>2005-12-09T10:52:26.136-06:00</updated><title type='text'>The Power of Smalltalk IDE's</title><content type='html'>&lt;a href="http://www.vanwardtechnologies.com/cedricb03.php"&gt;Here&lt;/a&gt; is a good way to tick off Smalltalkers:&lt;br /&gt;&lt;blockquote&gt;"A lot of veteran developers point out that Smalltalk showed that it was possible to have such an IDE in a dynamic language, but they are only partially right. Today's IDE's are doing much more than anything Smalltalk's environment ever did, so the problem is still wide open (and maybe impossible to solve)."&lt;br /&gt;- Cedric Beust&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This spawned a flurry of blog post:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;James Robertson - &lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;entry=3311489337"&gt;Jumping the Shark&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cees de Groot - &lt;a href="http://www.cdegroot.com/blog/2005/12/08/cedric-who/"&gt;Cedric Who?&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Torsten - &lt;a href="http://astares.blogspot.com/2005/12/todays-smalltalk-ides.html"&gt;Today's (Smalltalk) IDE's&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Blaine Buxton - &lt;a href="http://www.blainebuxton.com/weblog/2005/12/live-vs-dead.html"&gt;Live vs. Dead&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;James Robertson - &lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;entry=3311577763"&gt;Are we live, or deadorex?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;One of the pivotal moments with me and Smalltalk was when I realized the difference between an IDE and a Smalltalk environment.  It is a big paradigm shift from the edit/run type environments (this includes Ruby).  Torsten's &lt;a href="http://astares.blogspot.com/2005/12/todays-smalltalk-ides.html"&gt;post&lt;/a&gt; has some great examples of powerful Smalltalk one liners.  For example:&lt;pre&gt;TestCase allInstances do: [:each | each removeFromSystem]&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113414673246785504?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113414673246785504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113414673246785504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113414673246785504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113414673246785504'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/12/power-of-smalltalk-ides.html' title='The Power of Smalltalk IDE&apos;s'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113254684028457008</id><published>2005-11-20T22:06:00.000-06:00</published><updated>2005-11-20T23:15:33.526-06:00</updated><title type='text'>Impressive Dabble Demo</title><content type='html'>Check out the &lt;a href="http://bc.tech.coop/blog/051120.html"&gt;video&lt;/a&gt; for Dabble demo from the Lispvan meeting.  This app is written by Avi Bryant and others at &lt;a href="http://www.smallthought.com"&gt;Smallthought&lt;/a&gt; using Avi's phenomenal web app framework, &lt;a href="http://www.seaside.st"&gt;Seaside&lt;/a&gt;.  Really nice work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113254684028457008?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113254684028457008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113254684028457008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113254684028457008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113254684028457008'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/11/impressive-dabble-demo.html' title='Impressive Dabble Demo'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113035890365506078</id><published>2005-10-26T15:40:00.000-05:00</published><updated>2005-10-26T15:45:02.123-05:00</updated><title type='text'>Reason #1,481,723 that Smalltalk rocks</title><content type='html'>&lt;a href="http://www.laputan.org/reflection/Foote-Johnson-Noble-ECOOP-2005.html"&gt;Efficient Multimethods in a Single Dispatch Language&lt;/a&gt; by &lt;a href="http://www.laputan.org"&gt;Brian Foote&lt;/a&gt;, &lt;a href="http://st-www.cs.uiuc.edu/users/johnson/"&gt;Ralph E. Johnson&lt;/a&gt; and &lt;a href="http://www.mcs.vuw.ac.nz/~kjx/"&gt;James Noble&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Smalltalk is not just a language.  It is a system, and you have access to everything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113035890365506078?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113035890365506078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113035890365506078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113035890365506078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113035890365506078'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/10/reason-1481723-that-smalltalk-rocks.html' title='Reason #1,481,723 that Smalltalk rocks'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-113017007151820126</id><published>2005-10-24T11:06:00.000-05:00</published><updated>2005-10-24T11:11:52.773-05:00</updated><title type='text'>Quote of the day</title><content type='html'>From Martin Fowler's blog &lt;a href="http://martinfowler.com/bliki/JAOO2005.html"&gt;entry&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;On a very different note, I learned a new problem that Microsofties face: how to deal with your child who asks you why you work for the Evil Empire. I'm sure many open-sourcers hearts will go out to those sufferers in Redmond.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-113017007151820126?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/113017007151820126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=113017007151820126' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113017007151820126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/113017007151820126'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/10/quote-of-day.html' title='Quote of the day'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112973651220193060</id><published>2005-10-19T10:37:00.000-05:00</published><updated>2005-10-19T10:41:52.206-05:00</updated><title type='text'>Dynamic Language Symposium</title><content type='html'>Travis Griggs has a nice &lt;a href="http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;entry=3307141766"&gt;write up&lt;/a&gt; of the Dynamic Language Symposium at OOPSLA.&lt;br /&gt;&lt;br /&gt;My favorite excerpt is about Brian Foote's talk on why type systems aren't "helpful".  Don Roberts had a great comment:&lt;br /&gt;&lt;blockquote&gt;I get the same sort of feeling from using a type system that I do from knowing that the cushion on the airplane can be used for a flotation device: it doesn't matter.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112973651220193060?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112973651220193060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112973651220193060' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112973651220193060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112973651220193060'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/10/dynamic-language-symposium.html' title='Dynamic Language Symposium'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112973124667946280</id><published>2005-10-19T08:55:00.000-05:00</published><updated>2005-10-19T09:17:58.486-05:00</updated><title type='text'>Sideways</title><content type='html'>One of my favorite dialogs in Sideways is:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Maya: What is the title of your book?&lt;/li&gt;&lt;li&gt;Miles: The Day After Yesterday&lt;/li&gt;&lt;li&gt;Maya: Oh, you mean today?&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;This is my usual reaction when looking at unfamiliar code.  It is often just because of my ignorance of the code, but more often is it is that the code is unnecessarily complex.  When you hear Miles attempt to describe the plot of the book, the analogy becomes even closer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112973124667946280?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112973124667946280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112973124667946280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112973124667946280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112973124667946280'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/10/sideways.html' title='Sideways'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112705308685221210</id><published>2005-09-18T08:38:00.000-05:00</published><updated>2005-09-18T09:18:06.873-05:00</updated><title type='text'>The Smalltalk Browser</title><content type='html'>&lt;a href="http://www.notarianni.org/index.php/2005/09/17/object_orientation_enlightenment"&gt;Object orientation enlightenment&lt;/a&gt;  has a good take on why the Smalltalk browser rocks.  The browser takes some getting used to, but it is well worth it.  I really liked this quote, "Programming with Smalltalk is actually creating meaningful class’s names, meaningful methods names and organize them into self explicatory protocols."  &lt;br /&gt;&lt;br /&gt;Alan Kay once said, paraphrasing, "OO is not about classes and inheritance.  It is about messages."   I've used this quote before and people jaws would drop, look at me like I was a lunatic, and say it was heresy.  If their only OO experience is with something like C++ or Java then I can understand why they may think that way.  In effect, those languages just offered them a new way to organize their functions/procedures and structures.  Sometimes, I feel the best way to understand OO is to learn Smalltalk.  It is such a radically different language and environment that it forces you to think differently.  I don't mean to imply that if you've never used Smalltalk then you don't really understand OO.  I just think that it can speed up the learning process. &lt;br /&gt;&lt;br /&gt;My recommendation for anyone new to OO or wanting to sharpen their skills is to download &lt;a href="http://www.squeak.org"&gt;Squeak&lt;/a&gt; or &lt;a href="http://www.cincomsmalltalk.com/"&gt;VisualWorks&lt;/a&gt;, grab a copy of Kent Beck's &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/013476904X/qid=1127051437/sr=8-1/ref=sr_8_xs_ap_i1_xgl14/102-8724448-1208108?v=glance&amp;s=books&amp;n=507846"&gt;Smalltalk Best Practice Patterns&lt;/a&gt;, and write some code.  I've created a very short &lt;a href="http://wilkesjoiner.com/UsingSqueak.html"&gt;Squeak tutorial&lt;/a&gt;, complete with videos, to get a developer up and running as short of time as possible.  There are tons of other resources available out there.  Go.  Learn.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Warning&lt;/b&gt;: The first time I saw Smalltalk was free download of VisualWorks in 2000. I was learning J2EE at the time and my immediate reaction was, "We've been had!"  Learning Smalltalk can leave you with a huge level of disappointment with the current "state of the art" languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112705308685221210?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112705308685221210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112705308685221210' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112705308685221210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112705308685221210'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/09/smalltalk-browser.html' title='The Smalltalk Browser'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112653352403216645</id><published>2005-09-12T08:56:00.000-05:00</published><updated>2005-09-12T08:58:44.040-05:00</updated><title type='text'>Do you know someone at Apple?</title><content type='html'>&lt;a href="http://www.eschoolnews.com/eti/2005/09/001173.php"&gt;A post of Tom Hoffman about the Squeak License&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyone out there know anyone at Apple who can help this guy?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112653352403216645?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112653352403216645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112653352403216645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112653352403216645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112653352403216645'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/09/do-you-know-someone-at-apple.html' title='Do you know someone at Apple?'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112587979956951096</id><published>2005-09-04T18:53:00.000-05:00</published><updated>2005-09-04T19:23:19.576-05:00</updated><title type='text'>Classes, Objects, and Prototypes, oh my!</title><content type='html'>In my never ending quest towards more obscure and unprofitable languages, I've found myself in the world of Prototype languages.  These are OO languages they are based on cloning and modifying objects rather than defining Classes.  That is a bit of a simplistic explanation, but it's labor day weekend, and I've had a bit of wine.  By far, the most pervasive, and maybe most despised, is Javascript.  Poor Javascript, it really is not that bad of a language.  It is just that the implementations and environments are so inconsistent (WTF M$!).  There are far more interesting Prototype based languages out there.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://research.sun.com/self/"&gt;Self&lt;/a&gt; - The Grandaddy.  Somehow, there is a version available for OS X, so that those you without a Sparc station handy can play with it.  Checkout "&lt;a href="http://www.smalltalk.org.br/movies/"&gt;Self: The Movie&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iolanguage.com"&gt;Io&lt;/a&gt; -  Thanks to &lt;a href="http://www.butunclebob.com/ArticleS.MichaelFeathers"&gt;Michael Feathers&lt;/a&gt; and &lt;a href="http://www.blainebuxton.com/weblog/index.html"&gt;Blain Buxton's blog&lt;/a&gt; for tipping me off on this.  The asynchronous/coroutines looks pretty interesting, and it has a really nice cross platform GUI widget set based on OpenGL.  Definitely in the early and rapidly changing stage, but they are shooting for 1.0 release by the end of the year.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://slate.tunes.org"&gt;Slate&lt;/a&gt; - It's at version 0.3.5, whatever that means. I really like the fact that it is mostly written in itself, like Smalltalk or Lisp.  It has really nice inclusion of multiple dispatch.  I've only spent a couple of hours with it, but it looks really promising.&lt;br /&gt;&lt;br /&gt;For those language junkies out there, I thought you might find these interesting.  Please leave comments for any other language suggestions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112587979956951096?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112587979956951096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112587979956951096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112587979956951096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112587979956951096'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/09/classes-objects-and-prototypes-oh-my.html' title='Classes, Objects, and Prototypes, oh my!'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112501117046604001</id><published>2005-08-25T17:41:00.000-05:00</published><updated>2005-08-25T18:06:10.473-05:00</updated><title type='text'>Is it irresponsible to not pair-program?</title><content type='html'>I just spent the last two days pairing with my coworker, Scott.  It was the first time we had done any pairing in a while.  In my opinion, the quality of the code that came out of the paring sessions is much higher than either of us would have produced on our own.  I think that individually the code produced would have been pretty good, and maybe the implementation would have been almost the same.  However, almost the same is not the same.  There was a much higher attention to detail than I normally have the discipline to apply.  By detail, I don't just mean edge cases, but names of classes and variables, formatting of code, when to extract a method, when to refactor, etc...  I think about the code we have produced over the past couple of months and overall I'm pretty satisfied, but I wonder how much better it would be if we had been pairing all time.  &lt;br /&gt;&lt;br /&gt;Am I saying that everyone should pair all the time?  I'm not sure.  I do know that we have not been doing it enough, and the last couple of days have made that clear.  Scott is an exceptional person to pair with, and in the past I have not always been so fortunate.  Maybe this is an exceptional case, but based on the code that came out of our pairing, I would say that we have done our customers and future developers on the project a great disservice by not pairing more frequently, if not all the time.&lt;br /&gt;&lt;br /&gt;More thoughts on this later...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112501117046604001?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112501117046604001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112501117046604001' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112501117046604001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112501117046604001'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/08/is-it-irresponsible-to-not-pair.html' title='Is it irresponsible to not pair-program?'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112475512942452902</id><published>2005-08-22T18:55:00.000-05:00</published><updated>2005-08-22T18:58:49.430-05:00</updated><title type='text'>Balls to the wall</title><content type='html'>I remember the first time I heard Iron Maiden.  I was 9.  It was almost a traumatic experience.  I'm not an Iron Maiden fan, but this story is what IT is all about.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blainebuxton.com/weblog/2005/08/shameful-and-unprofessional.html"&gt;Iron Maiden Disrespected&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112475512942452902?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.blainebuxton.com/weblog/2005/08/shameful-and-unprofessional.html' title='Balls to the wall'/><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112475512942452902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112475512942452902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112475512942452902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112475512942452902'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/08/balls-to-wall.html' title='Balls to the wall'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112359289603207912</id><published>2005-08-09T07:46:00.000-05:00</published><updated>2005-08-09T08:08:16.036-05:00</updated><title type='text'>He's Gone</title><content type='html'>Today is the 10th anniversary of Jerry Garcia's death.  When I was 14, I bought Europe '72 and have been hooked ever since.  The Grateful Dead had a profound influence on my life both musically and personally.  They introduced me to psychedelica, bluegrass, country, and jazz.  They taught me that there was no such thing as "normal" there was really only average.  There are still moments when I hear a Dead song and get chills.  My first show was 15 years ago in &lt;a href="http://www.archive.org/audio/etree-details-db.php?id=11821"&gt;Raleigh, NC&lt;/a&gt;.  It was one of those pivotal moments in my life.  I was only 16 and wasn't really prepared for all that I saw.  It was an amazing experience.  The kind that I can still remember in mental snapshots.  &lt;br /&gt;&lt;br /&gt;If there is one Dead show to have, I would have to recommend:&lt;br /&gt;&lt;a href="http://www.archive.org/audio/etree-details-db.php?id=26537"&gt;1977.05.08 - Baron Hall - Cornell University - Ithaca, NY&lt;/a&gt;&lt;br /&gt;Given the numbers of shows and the different periods of the band it is impossible to name a best ever, but '77 was my favorite year and this was one its best shows.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rollingstone.com/news/story/_/id/7539574/jerrygarcia?rssfeed=musicnews&amp;rnd=1123589884339&amp;has-player=true"&gt;Rolling Stone Interview (1993)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112359289603207912?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112359289603207912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112359289603207912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112359289603207912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112359289603207912'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/08/hes-gone.html' title='He&apos;s Gone'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112205504250160944</id><published>2005-07-22T12:48:00.000-05:00</published><updated>2005-07-22T12:57:22.503-05:00</updated><title type='text'>No more longhorn jokes</title><content type='html'>No more jokes about Windows Longhorn, it is now &lt;a href="http://www.microsoft.com/presspass/press/2005/jul05/07-22LHMA.mspx"&gt;Vista&lt;/a&gt;.  That should put a sock in the mouth of all those who say that Microsoft isn't innovating.&lt;br /&gt;&lt;br /&gt;Since my wife calls me Eric Forman, from "That 70's Show", I can't help but think of Eric's car, the Vista Cruiser.&lt;br /&gt;&lt;br /&gt;"It's a Vista Cruiser!! You can LITERALLY cruuuise the vistas." - Red Forman&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112205504250160944?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112205504250160944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112205504250160944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112205504250160944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112205504250160944'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/07/no-more-longhorn-jokes.html' title='No more longhorn jokes'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112205410319703380</id><published>2005-07-22T12:39:00.000-05:00</published><updated>2005-07-22T12:41:43.203-05:00</updated><title type='text'>oblique widget</title><content type='html'>Here is a fun little widget &lt;a href="http://www.apple.com/downloads/dashboard/reference/oblique.html"&gt;Oblique&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have to say that I really do enjoy the Dashboard in Tiger.  I had serious doubts, but I use it all the time, far more that Spotlight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112205410319703380?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112205410319703380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112205410319703380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112205410319703380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112205410319703380'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/07/oblique-widget.html' title='oblique widget'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112069260519380280</id><published>2005-07-06T18:18:00.000-05:00</published><updated>2005-07-06T18:33:48.326-05:00</updated><title type='text'>Edgehill Studios</title><content type='html'>My dad opened up a new coffee shop here in Nashville.  Calling it a coffee shop is doing it a disservice.  It's really a coffee shop / internet cafe / print shop / recording studio / print shop / music venue / any other media center you can think of.  Here is an &lt;a href="http://nashvillecitypaper.com/index.cfm?section_id=51&amp;screen=news&amp;news_id=42657"&gt;article&lt;/a&gt; in the &lt;a href="http://www.nahvillecitypaper.com"&gt;City Paper&lt;/a&gt; that gives a better overview than I can possibly give.  My aunt described it best, "It's like David's brain."  I'm really proud of what he has done, and he has found a phenomenal staff to run the place.  Congratulations guys!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112069260519380280?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112069260519380280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112069260519380280' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112069260519380280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112069260519380280'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/07/edgehill-studios.html' title='Edgehill Studios'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112049325664881799</id><published>2005-07-04T11:03:00.000-05:00</published><updated>2005-07-04T11:07:36.653-05:00</updated><title type='text'>Squeak in the classroom</title><content type='html'>This was posted on the squeak mailing list this morning by Diego Gomez.  Definitely worth checking out.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The Squeak project at Extremadura (Spain) had produced a documental that shows some details about the project.&lt;br /&gt;&lt;br /&gt;The video is licensed with:&lt;br /&gt;&lt;br /&gt;   http://creativecommons.org/licenses/by/2.1/es/deed.en&lt;br /&gt;&lt;br /&gt;Soon we'll publish a DVD with the movie in several languages, meanwhile you can get 2 versions in English from:&lt;br /&gt;&lt;br /&gt;Using bittorrent:&lt;br /&gt;&lt;a href="http://apt.linex.org/squeak/Squeak%20in%20Extremadura%20%28audio-english%20subtitles-english%29%20352x288.mpg.torrent"&gt;Squeak in Extremadura (audio-english subtitles-english) 352x288.mpg.torrent&lt;/a&gt;&lt;br /&gt;&lt;a href="http://apt.linex.org/squeak/Squeak%20in%20Extremadura%20%28audio-english%20subtitles-english%29%20704x576.mpg.torrent"&gt;Squeak in Extremadura (audio-english subtitles-english) 704x576.mpg.torrent&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And the big files (be careful with the size):&lt;br /&gt;&lt;a href="http://apt.linex.org/squeak/Squeak%20in%20Extremadura%20%28audio-english%20subtitles-english%29%20352x288.mpg"&gt;Squeak in Extremadura (audio-english subtitles-english) 352x288.mpg (187Mb)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://apt.linex.org/squeak/Squeak%20in%20Extremadura%20%28audio-english%20subtitles-english%29%20704x576.mpg"&gt;Squeak in Extremadura (audio-english subtitles-english) 704x576.mpg (372Mb)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy it!&lt;br /&gt;&lt;br /&gt;-- Diego&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112049325664881799?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112049325664881799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112049325664881799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112049325664881799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112049325664881799'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/07/squeak-in-classroom.html' title='Squeak in the classroom'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-112016360924541316</id><published>2005-06-30T15:32:00.000-05:00</published><updated>2005-06-30T15:33:29.250-05:00</updated><title type='text'>Repeat 3 times</title><content type='html'>Loose Coupling / High Cohesion&lt;br /&gt;&lt;br /&gt;Loose Coupling / High Cohesion&lt;br /&gt;&lt;br /&gt;Loose Coupling / High Cohesion&lt;br /&gt;&lt;br /&gt;Do you feel pride or guilt?  Right now I'm feeling a little of both.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-112016360924541316?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/112016360924541316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=112016360924541316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112016360924541316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/112016360924541316'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/repeat-3-times.html' title='Repeat 3 times'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111997602239541453</id><published>2005-06-28T11:14:00.000-05:00</published><updated>2005-06-28T11:27:02.400-05:00</updated><title type='text'>Semiconductors and Smalltalk</title><content type='html'>So on the left coast is JavaOne and on the right coast is Smalltalk Solutions 2005.  There a lot of good reports on James Robertson's &lt;a href="http://www.cincomsmalltalk.com/blog/blogView"&gt;blog&lt;/a&gt; about StS.  I particularly liked &lt;a href="http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;entry=3297410464"&gt;this post&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;And from Alan Knight's &lt;a href="http://www.cincomsmalltalk.com/userblogs/knight/blogView?showComments=true&amp;entry=3297408982"&gt;blog&lt;/a&gt;:&lt;blockquote&gt;&lt;br /&gt;... a question about how much of the world's semiconductor production has been processed by machines running Smalltalk. His answer was that it was probably around 100%. Unaxis makes three different kinds of machines, and for one type (Mask etching, I believe) they have around 85-90% market share. And they're just one of Adventa's customers for ControlWorks. Other places have already talked about e.g. AMD's use of ControlWorks.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That is considerable market share for a technology committed to a  "dead language."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111997602239541453?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111997602239541453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111997602239541453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111997602239541453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111997602239541453'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/semiconductors-and-smalltalk.html' title='Semiconductors and Smalltalk'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111996759812198681</id><published>2005-06-28T08:59:00.000-05:00</published><updated>2005-06-28T09:10:58.836-05:00</updated><title type='text'>News Flash: Java Generics are complicated</title><content type='html'>Found this from a &lt;a href="http://lambda-the-ultimate.org/"&gt;Lambda The Ultmate&lt;/a&gt; &lt;a href="http://lambda-the-ultimate.org/node/view/804"&gt;post&lt;/a&gt;.  This is from Ken Arnold's Blog.  He is working on &lt;a href="http://www.kokogiak.com/amazon/detpage.asp?sb=s&amp;asin=0321349806&amp;field-keywords=java+programming+arnold&amp;schMod=books"&gt;The Java Programming Language (4th edition)&lt;/a&gt;.  This was my favorite excerpt from the post:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Learning to use generified types can get very complicated. It's hard to understand why you cannot do some things without casts, for example. But writing generified classes is rocket science. Here's one that showed up at the very last minute: It's a bad idea to declare a type that returns an array of a type parameter. That is, you shouldn't do this:&lt;br /&gt;&lt;br /&gt;    interface Holder&amp;lt;T&gt; {&lt;br /&gt;        T[] toArray();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;Why, you ask? Well, the problem is that T might itself be a generic type. That is, someone might declare a Holder&amp;lt;Set&amp;lt;String&gt;&gt;. And, ... uh, hold on, I'm trying to remember the issue here...&lt;br /&gt;&lt;br /&gt;Actually, I'm only mildly embarrassed to say that I've forgotten. But I remember that it took a few back-and-forths between David and the advising expert so that David — remember, David is the guy who has been writing a chapter on generics after several months of experimentation and research and over a year of thinking about how to approach it — could understand the problem. So our book recommends against it because it isn't good.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111996759812198681?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://weblogs.java.net/blog/arnold/archive/2005/06/generics_consid_1.html' title='News Flash: Java Generics are complicated'/><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111996759812198681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111996759812198681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111996759812198681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111996759812198681'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/news-flash-java-generics-are.html' title='News Flash: Java Generics are complicated'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111988253179942450</id><published>2005-06-27T09:17:00.000-05:00</published><updated>2005-06-27T09:30:44.836-05:00</updated><title type='text'>Fowler on Inversion of Control (IoC)</title><content type='html'>Martin Fowler has an excellent &lt;a href="http://martinfowler.com/bliki/InversionOfControl.html"&gt;post&lt;/a&gt; on what inversion of control really is.  He does a great job of separating the principle from the various techniques to implement it, i.e. IoC Containers and Frameworks.  A good read, especially for those turned off by a new fad.  This isn't really anything new.  It is good solid traditional OO design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111988253179942450?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111988253179942450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111988253179942450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111988253179942450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111988253179942450'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/fowler-on-inversion-of-control-ioc.html' title='Fowler on Inversion of Control (IoC)'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111973050836935159</id><published>2005-06-25T14:58:00.000-05:00</published><updated>2005-06-25T15:54:41.340-05:00</updated><title type='text'>Yet another plead for dynamicism</title><content type='html'>Yes, I've seen some of the horrible code that developers can produce.  I've written my fair share.  I've seen it in statically, dynamically, and loosely typed languages.  I've yet to see a language, methodology, IDE, dictatorship, whatever that prevents really bad code.  Instead of trying to "fix stupid", please allow good developers the opportunity to do their best.  Let them use languages or environments that stay out of their way.  If they are smart enough to figure out a great way to use continuations (&lt;a href="http://www.seaside.st"&gt;Seaside&lt;/a&gt;), let them.  If they can come up with clever ways to use methods generated at runtime (&lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt;) , let them.  Annotations/Attributes, Generics, anonymous delegates, byte code generators, etc..., these are not just "nice" language additions.  These are cries for help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111973050836935159?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111973050836935159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111973050836935159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111973050836935159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111973050836935159'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/yet-another-plead-for-dynamicism.html' title='Yet another plead for dynamicism'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111883383690144644</id><published>2005-06-15T06:05:00.000-05:00</published><updated>2005-06-15T06:10:36.906-05:00</updated><title type='text'>Attention all drones</title><content type='html'>&lt;a href="http://www.inthehive.com/"&gt;The Hive&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Microsoft really needs to reexamine some of it's marketing material, or are they arrogant enough to think that they can be this blatant about their plans to control your mind.  The bee is creeping me out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111883383690144644?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.inthehive.com/' title='Attention all drones'/><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111883383690144644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111883383690144644' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111883383690144644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111883383690144644'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/attention-all-drones.html' title='Attention all drones'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111878633699458889</id><published>2005-06-14T16:58:00.000-05:00</published><updated>2005-06-14T16:58:56.996-05:00</updated><title type='text'>new Powerbook</title><content type='html'>Happy! Happy! Joy! Joy!&lt;br /&gt;&lt;br /&gt;This is being posted from a brand new shiny 12" 1.5GHz Powerbook.&lt;br /&gt;&lt;br /&gt;I needed a laptop.  I couldn't wait a year or so for a Mactel, and I'll be damned if I'm going to spend my hard earned money on a Windows laptop.  You can polish a turd and mark down its price.  In the end, it is still a turd.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111878633699458889?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111878633699458889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111878633699458889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111878633699458889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111878633699458889'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/new-powerbook.html' title='new Powerbook'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111814869876653313</id><published>2005-06-07T07:45:00.000-05:00</published><updated>2005-06-07T07:51:38.823-05:00</updated><title type='text'>Performance per Watt</title><content type='html'>Well, Apple did it.  I'm really stunned.  I'm in need of a laptop. I was going to get a Powerbook, but maybe I'll find a cheap iBook to hold me over for a year or so.  If I was shopping for a Desktop, I'd go ahead and get a G5.  It will be supported for the life of the computer.  For laptops, the Powerbook line is looking a bit slow.  I'd bet they will be among the first to receive the switch.  &lt;br /&gt;&lt;br /&gt;The big deal is that Jobs said the number one reason for the switch is the PowerPC vs. Intel roadmap, particularly power consumption.  He said, "We have some amazing products we want to build for you, and we don't know how to build 'em with the future PowerPC roadmap."  That sounds to me like no G5 laptops is a big issue, but they also have some other devices that they want to run OS X on.  I think this is a big gamble, but for them to deliver what they want they had to do it.  Too bad Macworld is 6 months away.  There should besome really big announcements about the new hardware.&lt;br /&gt;&lt;br /&gt;They seem well prepared for the conversion, but the message yesterday was pretty loud and clear.  Start porting your apps now.  They have Rossetta as a fallback, but it has own limitations that means it won't work for every program running today.  If it did, I bet the announcement would have happened closer to the release of the first "Intel"Macs so that hardware sale wouldn't slump as much as I think they will.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111814869876653313?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111814869876653313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111814869876653313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111814869876653313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111814869876653313'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/performance-per-watt.html' title='Performance per Watt'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111807597461429669</id><published>2005-06-06T11:27:00.000-05:00</published><updated>2005-06-06T11:39:34.620-05:00</updated><title type='text'>It's a boy!!</title><content type='html'>Preston "TBD" Joiner was born June 5th, 2005 at 5 A.M.  He was 20" and 7 lbs. 15 oz.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wilkesjoiner.com/preston/"&gt;&lt;img alt="P1010018.JPG" width="240" src="http://wilkesjoiner.com/preston/Preston-Thumbnails/1.jpg"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111807597461429669?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://wilkesjoiner.com/preston/' title='It&apos;s a boy!!'/><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111807597461429669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111807597461429669' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111807597461429669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111807597461429669'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/its-boy.html' title='It&apos;s a boy!!'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111788960758054440</id><published>2005-06-04T07:44:00.000-05:00</published><updated>2005-06-04T09:02:01.723-05:00</updated><title type='text'>Will Apple become a Switcher?</title><content type='html'>Here is the C|Net &lt;a href="http://news.com.com/Apple+to+ditch+IBM%2C+switch+to+Intel+chips/2100-1006_3-5731398.html?tag=nefd.lede"&gt;article&lt;/a&gt;. I'm still skeptical.  It seems like a risky move, but since I don't know any of the details I'll just have to wait to Monday to get the whole story.  &lt;br /&gt;&lt;br /&gt;Assuming the story is true, I imagine that the root cause is that IBM is unable to provide Apple with what they need.  There is no G5 Powerbook in sight.  There have been manfacturing issues at IBM for years.  Possibly, the next gen consoles are all eating up the PowerPC chips, and Apple is getting put in the backseat.  I really have no idea.  Whatever is going on it seems like Apple's hand is being pushed in this direction.  &lt;br /&gt;&lt;br /&gt;In spite of the above, my money is on an announcement about an Apple and Intel partnership that is not nearly as Earth shattering as a complete Apple switch to x86.  Maybe a new media center type device or the Apple &lt;a href="http://www.macobserver.com/article/2005/05/10.18.shtml"&gt;tablet&lt;/a&gt; or another Newton type device.  Who knows?  I doubt &lt;a href="http://news.com.com/Apple+to+ditch+IBM%2C+switch+to+Intel+chips/2100-1006_3-5731398.html?tag=nefd.lede"&gt;C|Net&lt;/a&gt; or anyone else has the complete story.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111788960758054440?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.com.com/Apple+to+ditch+IBM%2C+switch+to+Intel+chips/2100-1006_3-5731398.html?tag=nefd.lede' title='Will Apple become a Switcher?'/><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111788960758054440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111788960758054440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111788960758054440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111788960758054440'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/will-apple-become-switcher.html' title='Will Apple become a Switcher?'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111771723740752263</id><published>2005-06-02T07:55:00.000-05:00</published><updated>2005-06-02T08:00:37.413-05:00</updated><title type='text'>new office xml formats</title><content type='html'>I'm not a fan of Office.  I avoid it at as much as possible.  I'm not a fan of xml.  I avoid it as much as possible.  I'm not a fan of Microsoft.  I avoid them as much as possible.  &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=73329"&gt;This is REALLY cool.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111771723740752263?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111771723740752263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111771723740752263' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111771723740752263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111771723740752263'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/06/new-office-xml-formats.html' title='new office xml formats'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111738601565714329</id><published>2005-05-29T11:50:00.000-05:00</published><updated>2005-05-29T12:00:15.663-05:00</updated><title type='text'>Squeak's facelift</title><content type='html'>One of &lt;a href="http://www.squeak.org"&gt;Squeak's&lt;/a&gt; biggest downsides has been its UI.  It is idiosyncratic, dated and generally unappealing.  As one of the off shoots of the &lt;a href="http://www.opencroquet.org"&gt;Croquet&lt;/a&gt; project, Andreas Raab is working on &lt;a href="http://tweak.impara.de/"&gt;Tweak&lt;/a&gt;.  It is planned to be the default UI framework for Squeak 4.0.  Definitely worth keeping an eye on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111738601565714329?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111738601565714329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111738601565714329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111738601565714329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111738601565714329'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/05/squeaks-facelift.html' title='Squeak&apos;s facelift'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111738174337547477</id><published>2005-05-29T11:11:00.000-05:00</published><updated>2005-05-29T11:37:43.180-05:00</updated><title type='text'>Web Flow</title><content type='html'>I saw this &lt;a href="http://jroller.com/page/dgeary/20050520#shale_adds_web_flow1"&gt;post&lt;/a&gt; at David Geary's blog.  I haven't taken the time to look at &lt;a href="http://opensource.atlassian.com/confluence/spring/display/WEBFLOW/Home"&gt;Spring's Web Flow&lt;/a&gt;, but from 10,000 feet it looks like a good approach for Java.  I liked this comment:&lt;br /&gt;&lt;blockquote&gt;Lately I've been exposed to a bit of Ruby on Rails brainwashing, which I must admit, I haven't found entirely unpleasant. As a result, I am beginning to eye XML configuration files with some suspicion. Now, of course, I prefer YML. But some things seem like a good fit for XML and defining the flow of a user dialogue—a conversation between app and user that spans multiple requests—seems like one of them.&lt;/blockquote&gt;&lt;br /&gt;For Java, I think this a good approach, but with &lt;a href="http://www.seaside.st"&gt;Seaside&lt;/a&gt; you don't need this sort of thing.  Since &lt;a href="http://www.squeak.org"&gt;Squeak&lt;/a&gt; and &lt;a href="http://smalltalk.cincom.com/"&gt;VisualWorks&lt;/a&gt; support continuations, a "web flow" can be expressed in code.  Here is the "web flow" for the sushiNet example application:&lt;br /&gt;&lt;pre&gt;WAStoreTask&gt;&gt;go&lt;br /&gt;    | shipping billing creditCard |&lt;br /&gt;    cart := WAStoreCart new.&lt;br /&gt;    self isolate:&lt;br /&gt;        [[self fillCart.&lt;br /&gt;          self confirmContentsOfCart]&lt;br /&gt;                whileFalse].&lt;br /&gt;&lt;br /&gt;    self isolate:&lt;br /&gt;        [shipping := self getShippingAddress.&lt;br /&gt;        billing := (self useAsBillingAddress: shipping)&lt;br /&gt;                           ifFalse: [self getBillingAddress]&lt;br /&gt;                           ifTrue: [shipping].&lt;br /&gt;        creditCard := self getPaymentInfo.&lt;br /&gt;        self shipTo: shipping billTo: billing payWith: creditCard].&lt;br /&gt;&lt;br /&gt;    self displayConfirmation.&lt;/pre&gt;Here we are expressing the entire "flow" of the application, but we are also doing much more.  We have web components returning domain objects.  We are passing domain objects between web components.  We are isolating  various sections of the flow of the application, i.e. once the user confirms the contents of their cart they can't go back and change it. In short, we are simply passing messages to objects.  To a developer this is just plain old code. The framework hides the fact that this method is being executed over multiple HTTP requests and responses.&lt;br /&gt;&lt;br /&gt;FWIW, the contiuations thing is what got me interested in Seaside, but it isn't what made me a fan.  It was the environment.  The smalltalk environment combined with the web development tools that ship with Seaside are light years ahead of anything  else I've seen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111738174337547477?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111738174337547477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111738174337547477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111738174337547477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111738174337547477'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/05/web-flow.html' title='Web Flow'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111374577563660145</id><published>2005-04-17T08:41:00.000-05:00</published><updated>2005-04-17T08:49:35.636-05:00</updated><title type='text'>Intro to Squeak</title><content type='html'>I've thrown together a tutorial for using &lt;a href="http://www.squeak.org"&gt;Squeak&lt;/a&gt;. It is geared towards developers who want to get up and running with Squeak in a very short amount of time.  Wherever I have instructions for interacting with the environment I have proved a short QuickTime movie.  I tried to be as terse as possible so if something is unclear please let me know.  Any feedback will be greatly appreciated.    &lt;br /&gt;&lt;br /&gt;&lt;a href="http://wilkesjoiner.com/UsingSqueak.html"&gt;Squeak Tutorial&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111374577563660145?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111374577563660145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111374577563660145' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111374577563660145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111374577563660145'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/04/intro-to-squeak.html' title='Intro to Squeak'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111152291957011736</id><published>2005-03-22T13:44:00.000-06:00</published><updated>2005-03-22T14:23:31.706-06:00</updated><title type='text'>Rails onslaught</title><content type='html'>In case you have been living under a rock, Ruby on Rails is gaining more momentum than any new framework I've seen.  Within the past week or so, there have been announcements for 4 books about Rails.&lt;ol&gt;&lt;li&gt;PragDave is writing &lt;a href="http://www.pragmaticprogrammer.com/titles/rails/index.html"&gt;Agile Web Development with Rails&lt;/a&gt;, estimated in July.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Marcel Molina (noradio) and Scott Barron (htonl) are writing "Pragmatic Rails Recipes: A Guide to Elegant Web Development" which will published by the Pragmatic Programmers, estimated in Fall 2005.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Ralf Wirdemann is writing "Web-Entwicklung mit Ruby on Rails", a German book due late in 2005.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Most surprisingly, Bruce Tate and Dave Geary (JSF expert group member) with be writing a book on Rails as part of the O'Reilly Developer's Notebook series&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The last one is the one that really threw me for a loop.  I've been learning the latest cruel injustice that Sun will bestow to the Java world, a.k.a. JSF.  I've been following Dave Geary's blog. I've referenced him a couple of times on this blog using his quotes as reasons to avoid JSF.  Anyway, he and David Heinemeier Hansson (Rails creator) had a few exchanges about Rails.  Now, he is writing a book on it??  Here are the links to give those unfamiliar some context:&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.jroller.com/comments/dgeary/Weblog/ruby_derailed"&gt;Geary's first post&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.loudthinking.com/arc/000408.html"&gt;DHH's rebuttal&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.jroller.com/comments/dgeary/Weblog/okay_let_s_take_a"&gt;Geary's second post&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Some other interesting endorsements have shown up.  Bruce Perens, uber Open Source Advocate, had this to say on the rails irc channel (#rubyonrails):&lt;blockquote&gt;In 1981, when I started working on Unix, I remember being blown away by the power of the command-line pipes-and-filters paradigm. You could get real work done with simplicity, clarity, and economy of notation that wasn’t available in anything else at the time. I’ve worked with lots of programming environments since then, but none of them gave me that feeling of being able to write a solution so well that working code just flew off of my fingers. Until now: Ruby on Rails achieves for web programming the same sort of conceptual leap that Unix made for file-handling. You’ve got to try it!&lt;/blockquote&gt;And finally this &lt;a href="http://groups-beta.google.com/group/comp.lang.ruby/browse_thread/thread/b1d37b9ff53feeb5/a8a79f16a790f6b5#a8a79f16a790f6b5"&gt;ancedote&lt;/a&gt; from comp.lang.ruby posted by Curt Hibbs.&lt;br /&gt;&lt;br /&gt;Frankly, I'm not as enthused as the rest of the world with Rails, &lt;a href="http://www.seaside.st"&gt;Seaside&lt;/a&gt; is my web framework of choice, but I am ecstatic to see Ruby getting the long overdue attention it deserves!  Let's hope that they can keep this momentum up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111152291957011736?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111152291957011736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111152291957011736' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111152291957011736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111152291957011736'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/03/rails-onslaught.html' title='Rails onslaught'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111029425821702587</id><published>2005-03-08T08:58:00.000-06:00</published><updated>2005-03-08T09:50:15.506-06:00</updated><title type='text'>Syntax matters corrections</title><content type='html'>First, the post probably should have been entitled "Language Matters!!" since I didn't bother to show a more equivalent, yet less idiomatic Java implementation.  Java has anonymous inner classes that could allow you to write something like this using the jakarta collections api:&lt;br /&gt;&lt;pre&gt;public Iterator getInterestingItems() {&lt;br /&gt;   return new FilterIterator(items.iterator(), new Predicate() {&lt;br /&gt;       public boolean evaluate(Object o) {&lt;br /&gt;           return ((Item)o).isInteresting();&lt;br /&gt;       }&lt;br /&gt;   });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Elegant. ;).  This is almost never used in Java, except in Swing, because the syntax is so god awful that you don't gain much by empoying it.  Although it is arguably a step closer to revealing the intention of the code, it isn't curbing my eye gouging impulse.&lt;br /&gt;&lt;br /&gt;Second, the Java code had what should have been an obvious bug, as Jeff Byrd pointed out to me. &lt;br /&gt;&lt;pre&gt;public Collection getInterestingItems() {&lt;br /&gt;    Collection results = new ArrayList();&lt;br /&gt;    Iterator iter = items.iterator();&lt;br /&gt;    while(iter.hasNext()) {&lt;br /&gt;        Item item = (Item)iter.next();&lt;br /&gt;        if(item.isInteresting()) {&lt;br /&gt;            results.add(item);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return items;  // BUG!!&lt;br /&gt;}&lt;/pre&gt;It should be:&lt;pre&gt;return results&lt;/pre&gt;&lt;br /&gt;I think this, unintentionally, makes the case even stronger.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wilkes.blogspot.com/2005/03/syntax-matters.html#comments"&gt;Liz&lt;/a&gt; pointed out that in Java 5 (or is it 1.5) it could be written as:&lt;br /&gt;&lt;pre&gt;public Collection getInterestingItems() {&lt;br /&gt;    Collection results = new ArrayList();&lt;br /&gt;    for (Item item : items) {&lt;br /&gt;        if (item.isInteresting()) results.add(item);&lt;br /&gt;    }&lt;br /&gt;    return results;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Although I consider this a slight improvement, it cuts 7 statements down to 5 (whoopi!).  It misses the point.  It is showing the procedure to get the interesting items rather than declaring the intention of returning all the interesting items.  That bit of information is buried in the 3rd statement.  Again, this isn't necessarily about LOC.  It is about revealing the intention of the code.  I think that there is a correlation between LOC and revealing its intention, but that is not always the case.  Some of the Python, Perl, Ruby one-liners make my head spin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111029425821702587?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111029425821702587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111029425821702587' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111029425821702587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111029425821702587'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/03/syntax-matters-corrections.html' title='Syntax matters corrections'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-111023092145185290</id><published>2005-03-07T15:22:00.000-06:00</published><updated>2005-03-07T16:24:09.726-06:00</updated><title type='text'>Syntax matters!!</title><content type='html'>For example, lets say we have a two classes, Item and ItemCollection.  Item has a property isInteresting.  ItemCollection has a getter to return all the interesting items.  &lt;br /&gt;&lt;br /&gt;In Java:&lt;pre&gt;public Collection getInterestingItems() {&lt;br /&gt;    Collection results = new ArrayList();&lt;br /&gt;    Iteratore iter = items.iterator();&lt;br /&gt;    while(iter.hasNext()) {&lt;br /&gt;        Item item = (Item)iter.next();&lt;br /&gt;        if(item.isInteresting()) {&lt;br /&gt;            results.add(item);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return items;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;In Smalltalk:&lt;pre&gt;interestingItems&lt;br /&gt;   ^items select: [:item | item isInteresting ]&lt;/pre&gt;&lt;br /&gt;In Ruby:&lt;pre&gt;def interestingItems&lt;br /&gt;  items.find_all { |item| item.isInteresting? }&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;In Haskell:&lt;pre&gt;interestingItems :: [Item] -&gt; Item&lt;br /&gt;interesting items = [i | i &lt;- items, isInteresting i]&lt;/pre&gt;&lt;br /&gt;This is just one simple example of a substantial productivity boost a language can provide.  Forget about the number of lines of code.  Which expresses the intention of the code better?  Which will be easier to maintain?  Which makes you the least likely to gouge your eyeballs out with your thumbs?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-111023092145185290?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/111023092145185290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=111023092145185290' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111023092145185290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/111023092145185290'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/03/syntax-matters.html' title='Syntax matters!!'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110761275615143983</id><published>2005-02-05T09:45:00.000-06:00</published><updated>2005-02-05T09:48:28.913-06:00</updated><title type='text'>JSF - not too impressed</title><content type='html'>About a week ago, I spent some time  playing with JSF.  I'm currently working on a Struts app.  It is the early stages so switching frameworks is not too big of deal right now.  The code is pretty well factored and the UI is just one monster form.  The UI is going to need more richness than is easily available via Struts.  It's been purported that Struts-JSF play nice with each other which allows for an easier migration from Struts to JSF.  I spent 2 days migrating the code, by the second day, I gave up.  &lt;br /&gt;&lt;br /&gt;I started by switching all my struts tags with JSF equivalents.  It seemed that the easiest way to do this was to run the app and swap out tags a couple at time and refresh the screen.  Just plain, simple and primitive JSP editing.   All was going well, until I went to swap out a hidden tag.  I refreshed the page, and the layout was completely hosed.  It was as if all the JSF components had been shifted up a position.  My knee-jerk reaction, BUG.  So, I stripped out everything from JSP except for 3 read only JSF tags (&lt;textOutput&gt;). At first pass everything looked fine.  Then I modified bean property it was rendering and my changes didn't seem to stick.  More mucking, then everything was hosed.  I thought it may be a bug in Sun's JSF RI so I tried MyFaces.  Similar, although not identical, results.  At this point I admitted defeat.  We had features to deliver and another team was going to start using JSF later in the week.  I told them about my experience.  I was assuming that it was something wrong with my environment or a misunderstanding about how JSF works.  I would wait to see what they found out.  Although I haven't heard their experience, today I found out what the problem was.  &lt;br /&gt;&lt;br /&gt;Rick Hightower is doing a series of articles for IBM's developerworks, &lt;a href="http://www-106.ibm.com/developerworks/java/library/j-jsf1/"&gt;JSF for nonbelievers&lt;/a&gt;.  As he is giving an overview of JSF, he is explaining the relationship between JSF components and JSP tags.  Here is the excerpt germane to the "bug" I was seeing.&lt;br /&gt;&lt;blockquote&gt;... the truth is that JSF is not bound to JSP technology inherently. In fact, the JSF tags used by JSP pages merely reference the components so they can be displayed. You'll realize this the first time you modify a JSP page to change the attributes of a JSF component and reload the page, and nothing happens. This is because the tag looks up the component in its current state. Thus, if the component already exists the custom tag will not modify its state. The component model allows your controller code to change the state of a component (for example, disable a text field), and when that view is displayed the current state of your component tree will be displayed.&lt;/blockquote&gt;&lt;br /&gt;In other words, the bizarre behavior I was seeing was not a "bug".  It is inherit in the specification.  Some people may not have a problem with this.  For me, I like to take baby steps.  Make a little change.  Run.  Repeat.  This is a core principle of the XP engineering practices, shorten the feedback loop.  I could be wrong, but I believe I will have to bounce the server on every change to a JSP.  Not exactly shortening the feedback loop.&lt;br /&gt;&lt;br /&gt;My other issue with this design, is that it is stateful.  A lot of the JSF literature I've read encourages this sort of stateful approach.  Here is a line in Core Java Server Faces that is paraphrased since I don't have the book handy, "most beans in a web application are stored on the session."  I agree that storing stuff in the session can be useful, but I try to avoid it as much as is reasonably possible.  Isolating bugs dealing with state is time consuming, difficult to repeat, and therefore expensive.  &lt;br /&gt;&lt;br /&gt;There are other points in the article that really trouble me.  They fill me with the FUD that Hightower is trying to curb.  More about these in a later article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110761275615143983?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110761275615143983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110761275615143983' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110761275615143983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110761275615143983'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/02/jsf-not-too-impressed.html' title='JSF - not too impressed'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110624803346370209</id><published>2005-01-20T13:01:00.000-06:00</published><updated>2005-01-20T13:10:19.226-06:00</updated><title type='text'>Hehe, this guy is funny</title><content type='html'>In my philosophy 101 class in college, one of our assignments was to go through the "She's a witch!" scene from Monty Python's Holy Grail and identify all the logical fallacies.  For some reason this article reminds me of that day, &lt;a href="http://www.devx.com/DevX/Article/26776/0/page/1"&gt;OOP Is Much Better in Theory Than in Practice&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I really like how redefines encapsulation:&lt;br /&gt;&lt;blockquote&gt;Encapsulation, too, is a noble goal in theory: you've reached the Platonic ideal for a particular programming job, so you seal it off from any further modification.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110624803346370209?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110624803346370209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110624803346370209' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110624803346370209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110624803346370209'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/01/hehe-this-guy-is-funny.html' title='Hehe, this guy is funny'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110610258278625690</id><published>2005-01-18T20:05:00.000-06:00</published><updated>2005-01-18T20:43:02.786-06:00</updated><title type='text'>New Seaside site</title><content type='html'>New Seaside website, &lt;a href="http://www.seaside.st/"&gt;http://www.seaside.st&lt;/a&gt;.  If you are not familiar with Seaside, then you aren't trying hard enough, ;) &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110610258278625690?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110610258278625690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110610258278625690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110610258278625690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110610258278625690'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/01/new-seaside-site.html' title='New Seaside site'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110554221695088642</id><published>2005-01-12T09:21:00.000-06:00</published><updated>2005-01-12T09:30:48.800-06:00</updated><title type='text'>The Jobs Difference</title><content type='html'>Last week, Gates did his keynote at CES.  The only reports I noticed were about the 2 crashes, technically one freeze and one blue screen.  I know the freeze had something to do with a remote control and the Home Media Center, and the blue screen was while demoing a game.  Other than that, I know nothing about the keynote.  I know that Longhorn is coming out in late 2006,  probably 2007, and I know they've had to drop WinFS from the OS.  Other than that is seems to be business as usual in Redmond.  Random promises with not much to see.&lt;br /&gt;&lt;br /&gt;During the MacWorld keynote, Jobs had a freeze while showing off &lt;a href="http://www.apple.com/macosx/tiger/spotlight.html"&gt;Spotlight&lt;/a&gt;.  I haven't seen this reported anywhere.  Why?  He said oops, got slightly embarrassed, "... I've got a little bug here." Flipped a switch and said, "Well that is why have back up systems here."  The audience immediately got the reference to the CES freeze from last week and let out one of the biggest roars of the keynote.  He was showing off beta technology and handled the bug gracefully.  He took an event that was almost identical to what happened to Gates a week earlier, and he turned into a joke.  Then he followed it up by showing some truly amazing &lt;a href="http://www.apple.com/macosx/tiger/technology.html"&gt;work&lt;/a&gt; that will be shipping within 6 months, and he went onto show a barrage of amazing and innovative products that are available today, &lt;a href="http://www.apple.com/finalcutexpress/"&gt;Final Cut Express HD&lt;/a&gt;, &lt;a href="http://www.apple.com/ilife/"&gt;iLife '05&lt;/a&gt;, &lt;a href="http://www.apple.com/iwork/"&gt;iWork '05&lt;/a&gt;, &lt;a href="http://www.apple.com/macmini/"&gt;Mac mini&lt;/a&gt;, and &lt;a href="http://www.apple.com/ipodshuffle/"&gt;iPod shuffle&lt;/a&gt;.  The freeze was a non-event.&lt;br /&gt;&lt;br /&gt;Apple is delivering.  Microsoft is stalling.  Apple is innovating.  Microsoft is hanging on.&lt;br /&gt;&lt;br /&gt;You can see the freeze on the keynote &lt;a href="http://www.apple.com/quicktime/qtv/mwsf05/"&gt;stream&lt;/a&gt; at the 12 minute mark.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110554221695088642?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110554221695088642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110554221695088642' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110554221695088642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110554221695088642'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/01/jobs-difference.html' title='The Jobs Difference'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110510616788110366</id><published>2005-01-07T07:41:00.000-06:00</published><updated>2005-01-07T07:56:07.883-06:00</updated><title type='text'>Instant Karma</title><content type='html'>I never post links to news, but this made me smile, &lt;a href="http://www.canada.com/news/story.html?id=7d5a65b1-8260-44c6-8354-ff4a1ef5d39b"&gt;Microsoft's Gates endures PC crash during keynote speech at U.S. tech show&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aside from the obvious humor of 2 crashes during a demo, I found this quote to be pretty amusing.&lt;blockquote&gt;"We predicted at the beginning of this decade that this would be a decade where the digital approach would be taken for granted," Gates told hundreds of technology enthusiasts, who gathered for his kickoff to the world's largest electronics show. "It's going even faster than we expected."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;What vision!  The next thing you know they will release digital photo, music, and movie &lt;a href="http://www.apple.com/ilife/"&gt;software&lt;/a&gt; that will integrate seamlessly.  That would show the type of innovation rarely seen coming from Redmond.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110510616788110366?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110510616788110366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110510616788110366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110510616788110366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110510616788110366'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/01/instant-karma.html' title='Instant Karma'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110496923375127515</id><published>2005-01-05T17:13:00.000-06:00</published><updated>2005-01-05T17:53:53.750-06:00</updated><title type='text'>Squeaking along</title><content type='html'>I've been using Squeak for the past couple of weeks on an almost daily basis.  It's reached the point to where I may have to stop.  The longer I use it the more painful it will be to go back to a "lesser" environment.  Java/C#, what's the difference?  Ruby is a phenomenal language, but where is the amazing IDE.  In fact Squeak isn't just an IDE, it is an immersive environment.  You aren't just hacking out chunks of code that will eventually be compiled or run through an interpreter.  You are shaping a network of objects.  At this point your probably thinking, "yeah whatever you loon", so I'll attempt to give a simple concrete example.&lt;br /&gt;&lt;br /&gt;When you write a Seaside application, the first thing you do is start up the web server with the Seaside module loaded.  You can do this from a Workspace (kind of like a command line or interpreter) by typing WAKom startOn: 8080.  Then save your image.  From now on, Seaside is running.  You can quit Squeak, open up the image again and Seaside is running.  As you develop your application, you never have to worry about the server again.  It is an instance running in your image that is always there.  You just code and test.  No build, test, deploy process.  Build scripts, gone.  Attaching a debugger, gone.  Bouncing the server to load changes, gone.  Long build times, what build?&lt;br /&gt;&lt;br /&gt;XP has its roots in Smalltalk, and I wonder if it would have come about at all without Smalltalk.  To me, one of the most important aspects of XP is shortening the feedback loop.  Smalltalk provides the shortest feedback loop of anything that I have ever used.&lt;br /&gt;&lt;br /&gt;Our Customers deserve better than what they are getting.  We are being bullied by the Microsoft's and Sun's, the Gartner's, the CXO's who listen to Gartner, and the scared middle managers.  We are being bullied from within by the static type wimps of the world (I pray Python's optional static typing never makes it off the ground).  It probably will not be Smalltalk (again) but something will come along and shift the tide.  Something has to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110496923375127515?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110496923375127515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110496923375127515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110496923375127515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110496923375127515'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2005/01/squeaking-along.html' title='Squeaking along'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110436772583456990</id><published>2004-12-30T14:03:00.000-06:00</published><updated>2004-12-30T14:04:12.493-06:00</updated><title type='text'>The Playlist Meme</title><content type='html'>Instructions from the "interweb":&lt;br /&gt;1. Open up the music player on your computer.&lt;br /&gt;2. Set it to play your entire music collection.&lt;br /&gt;3. Hit the "shuffle" command.&lt;br /&gt;4. Tell us the title of the next ten songs that show up (with their musicians), no matter how embarrassing. That’s right, no skipping that Carpenters tune that will totally destroy your hip credibility. It’s time for total musical honesty. You can put the list in the comment thread, or write it up in your blog or journal and then post a link in the comments.&lt;br /&gt;5. If you get the same artist twice, you may skip the second (or third, or etc.) occurances. You don’t have to, but since randomness could mean you end up with a list of ten song with five artists, you can if you’d like.&lt;br /&gt;&lt;br /&gt;My results: Song - Artist - Album&lt;br /&gt;1. Etude 3 - John Zorn - The Book of Heads&lt;br /&gt;2. Harry the Head - The Residents - Petting Zoo&lt;br /&gt;3. Tiny Cities Made of Ashes - Modes Mouse - The Moon &amp; Anartica&lt;br /&gt;4. Suite No. 3 (for solo cello) - Andres Segovia - Segovia Collection Vol 1&lt;br /&gt;5. She F**ks Me - Ween - The Pod&lt;br /&gt;6. If I Were a Bell - The Jazz Passengers - Plain Old Joe&lt;br /&gt;8. Machito Forever - Tito Puente - 50 years of Swing&lt;br /&gt;9. Filthy Habits - Frank Zappa - Lather&lt;br /&gt;10. Spank-A-Lee - Herbie Hancock - Thrust &lt;br /&gt;&lt;br /&gt;A fair sampling of what I listen to.   In fact, I think I'll put on Herbie Hancock's Thrust right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110436772583456990?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110436772583456990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110436772583456990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110436772583456990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110436772583456990'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/12/playlist-meme.html' title='The Playlist Meme'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-110286147956644513</id><published>2004-12-12T09:18:00.000-06:00</published><updated>2004-12-12T09:19:05.976-06:00</updated><title type='text'>Smalltalk isn't dead.  It just smells funny.</title><content type='html'>Every 6 months or so I like to download &lt;a href="http://www.squeak.org"&gt;Squeak&lt;/a&gt; and see what is going on.  Invariably, I am impressed and disappointed.  I'm impressed because there is always some really cool new project that I don't see done anywhere else.  I'm disappointed because the UI look and feel is still clunky.   With &lt;a href="http://www.squeak.org/download/index.html"&gt;Squeak 3.7&lt;/a&gt;, the UI has received a bit of polish, but the feel is still clunky. You can get an idea of what you can make Squeak look like &lt;a href="http://minnow.cc.gatech.edu/squeak/3480"&gt;here&lt;/a&gt;. However, there are some cool projects that are just too interesting to ignore.  Here is a brief rundown for the curious.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.beta4.com/seaside2/"&gt;Seaside&lt;/a&gt;&lt;br /&gt;This is an unbelievable web app framework.  It's not exactly new (a couple of years old), but still impresses me every time I see it.  It uses continuations to handle state between http requests and responses.  Check out the Seaside &lt;a href="http://www.beta4.com/seaside2/docs.html"&gt;docs&lt;/a&gt; and Avi Bryant's &lt;a href="http://www.cincomsmalltalk.com/userblogs/avi/blogView"&gt;blog&lt;/a&gt; to find out why this is a good thing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opencroquet.org/"&gt;Croquet&lt;/a&gt;&lt;br /&gt;I've already &lt;a  href="http://wilkes.blogspot.com/2004/08/croquet.html"&gt;blogged&lt;/a&gt; this. I'm not sure how or where I would ever use it, but it is really cool all the same.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://homepage.mac.com/rgayvert/wxsqueak.html"&gt;WxSqueak&lt;/a&gt;&lt;br /&gt;It's definitely in the embryonic stages, but it brings hope that you can write a GUI app in Squeak that won't look like a toy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiresong.ca/Monticello/"&gt;Monticello&lt;/a&gt;&lt;br /&gt;Version control for Squeak.  I have looked closely at this yet. It is on my TODO list.  It is something that I've always wanted with Squeak.  In the past, "file in" &amp; "file out" were just to unwieldy for me to consider using Squeak for anything substantial.  Maybe this will be a kinder gentler solution.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://minnow.cc.gatech.edu/squeak/2726"&gt;SqueakMap&lt;/a&gt;&lt;br /&gt;Package management for Squeak.  It's been around for a while now, but it has a &lt;a href="http://map1.squeakfoundation.org/sm/packagesbyname"&gt;plethora&lt;/a&gt; of cool libraries for you to play with, so it has to be mentioned in this list.&lt;br /&gt;&lt;br /&gt;Squeak has an impressive and vibrant community for a "dead" language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-110286147956644513?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/110286147956644513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=110286147956644513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110286147956644513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/110286147956644513'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/12/smalltalk-isnt-dead-it-just-smells.html' title='Smalltalk isn&apos;t dead.  It just smells funny.'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109802342366308089</id><published>2004-10-17T09:07:00.000-05:00</published><updated>2004-10-17T09:31:05.676-05:00</updated><title type='text'>TextMate</title><content type='html'>&lt;a href="http://www.macromates.com"&gt;TextMate&lt;/a&gt; is the editor for OS X that I have been searching for.  As they say, "necessity is the mother of invention."  Allan Odgaard and &lt;a href="http://www.loudthinking.com"&gt;David Heinemeier Hansson&lt;/a&gt; (of &lt;a href="http://www.rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; fame) weren't satisfied with the editor options available for OS X so they wrote their own.  In the past six month, David Heinemeier Hansson has made a name for himself in the Ruby world with Rails.  It is a remarkable framework that I will blog more about later.  Well, he and Allan Odgaard have done it again with &lt;a href="http://www.macromates.com"&gt;TextMate&lt;/a&gt;, a lightweight highly extensible text editor.  It is a programmer's dream.  I've always used emacs to write my ruby code, but no more.  They have an incredible knack for simplicity, arguably the hardest thing to get right in software.   I've only used it for a day, and there is so much that I haven't dug into yet, but I am sold.  Go download the 30 day trial, within a few minutes you'll have no hesitation sending them $39 to keep their effort going.  By the way, you can enable auto update to check for the latest beta versions which seem to be coming out at a feverish pace.  Run this from the command line:&lt;pre&gt;defaults write com.macromates.textmate OakCheckForBetaVersions 1&lt;/pre&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109802342366308089?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109802342366308089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109802342366308089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109802342366308089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109802342366308089'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/10/textmate.html' title='TextMate'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109680937425778396</id><published>2004-10-03T08:01:00.000-05:00</published><updated>2004-10-03T08:37:05.383-05:00</updated><title type='text'>Pickaxe II</title><content type='html'>I got my copy of the &lt;a href="http://www.pragmaticprogrammer.com/titles/ruby/index.html"&gt;Pickaxe II&lt;/a&gt; book in the mail this week.  The first edition is what turned me on to Ruby.  The second edition is a nice update to the first with some additional chapters.  For me, the best part is that they published it themselves.  Order a copy from there site, it's available either bound, as a PDF, or both.  I chose both.  I don't like &lt;em&gt;reading&lt;/em&gt; a PDF, but they are handy for a quick reference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109680937425778396?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109680937425778396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109680937425778396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109680937425778396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109680937425778396'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/10/pickaxe-ii.html' title='Pickaxe II'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109552027843610361</id><published>2004-09-27T08:28:00.000-05:00</published><updated>2004-09-27T08:30:14.430-05:00</updated><title type='text'>ActiveRecord and YAGNI</title><content type='html'>I've been playing around with &lt;a href="http://activerecord.rubyonrails.org"&gt;ActiveRecord&lt;/a&gt;.  It truely is the easiest persistence framework that I have ever used.  However, when I show it to people, they almost always respond with, "cool, but you're tieing the domain model to the database."  This is absolutely true.  In other frameworks, this &lt;em&gt;could&lt;/em&gt; be a major problem &lt;em&gt;down the road&lt;/em&gt;.  However, ActiveRecord is the closest thing to &lt;a href="http://c2.com/cgi/wiki?DoTheSimplestThingThatCouldPossiblyWork"&gt;"The Simplest Thing That Could Possibly Work" (TSTTCPW)&lt;/a&gt; that I have seen in a persistence framework, and combined with &lt;a href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt"&gt;"You Aren't Going to Need It" (YAGNI)&lt;/a&gt;, I feel pretty safe using it.&lt;br /&gt;&lt;br /&gt;The principles of XP often are support and supplement one another.  YAGNI and TSTTCPW are excellent examples of this.  YAGNI warns us against throwing in features such as unnecessary extensiblity before they are needed.  TSTTCPW says that we only need to write enough code to make our tests pass.  Both push us to keep our code clean and lean with a thorough set of supporting test cases.  In turn, our code is much easier to refactor when we find out we really do need something.  More exhaustive explanations of the principles of XP can be found in the myriad of books and web sites devoted to XP.&lt;br /&gt;&lt;br /&gt;So what does this have to do with ActiveRecord?  Well, &lt;a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html"&gt;Active Record&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html"&gt;Data Mapper&lt;/a&gt; are two common patterns for persisting a domain model to a relational database.  With Active Record, your domain model maps very closely to the table structure of your database.  Data Mapper allows for more flexibility between your domain model and database table structure.  Of course, there is a trade off with the added flexiblity, there is added complexity.  Data Mapper requires you to define and maintain the mapping of your domain model to your database.  This can be a &lt;em&gt;very&lt;/em&gt; unpleasant experience.   Combining the Active Record pattern with a late bound language like Ruby, and you have to do very little to define the mapping of your domain model to the database.  In the simple case, you only have to do one thing, inherit from ActiveRecord::Base!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A simple case&lt;/b&gt;&lt;br /&gt;You have a persistent class called Task that is stored in a table called &lt;tt&gt;tasks&lt;/tt&gt; that has 3 columns, &lt;tt&gt;ID&lt;/tt&gt;, &lt;tt&gt;name&lt;/tt&gt;, and &lt;tt&gt;description&lt;/tt&gt;.  Here is the ActiveRecord class for Task:&lt;br /&gt;&lt;pre&gt;class Task &lt; ActiveRecord::Base&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A slightly more complex case&lt;/b&gt;&lt;br /&gt;You have a peristent class called Story, and a Story has a list of Tasks associated with it.  The &lt;tt&gt;stories&lt;/tt&gt; table has 3 columns, &lt;tt&gt;ID&lt;/tt&gt;, &lt;tt&gt;name&lt;/tt&gt;, and &lt;tt&gt;description&lt;/tt&gt;.  The &lt;tt&gt;tasks&lt;/tt&gt; table has 4 columns, &lt;tt&gt;ID&lt;/tt&gt;, &lt;tt&gt;name&lt;/tt&gt;, &lt;tt&gt;description&lt;/tt&gt;, and &lt;tt&gt;story_id&lt;/tt&gt;.  Here are the respective ActiveRecord classes:&lt;br /&gt;&lt;pre&gt;class Story &lt; ActiveRecord::Base&lt;br /&gt;  has_many :tasks&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Task &lt; ActiveRecord::Base&lt;br /&gt;  belongs_to :story&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;I don't see how it could get any simpler than that.  Yes, you have tied your domain model to your database, and you must inherit from &lt;tt&gt;ActiveRecord::Base&lt;/tt&gt;, but that is about all you had to do.  If it turns out that you need the flexibility of Data Mapper, you can easily go back and refactor the above code.  After all, we are talking about a couple of lines of code per class.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using your ActiveRecords&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;story = Story.create("name" =&gt; "Story One")&lt;br /&gt;task = store.create_in_tasks("name" =&gt; "Task One")&lt;br /&gt;puts "Story #{story.name} has #{story.tasks_count} task(s)"&lt;br /&gt;story.tasks.each { |t| puts t.name }&lt;/pre&gt;&lt;br /&gt;Outputs:&lt;br /&gt;&lt;pre&gt;Story Story One has 1 task(s)&lt;br /&gt;Task One&lt;/pre&gt;&lt;br /&gt;One other note, ActiveRecord achieves the above simplicity throught the use of naming conventions which can make some people squeamish, but you can give ActiveRecord directions on how to handle the mapping of columns and tables to objects and properties explicitly.  Take a look at the &lt;a href="http://ar.rubyonrails.org/"&gt;API&lt;/a&gt; to see all the dynamic goodness that the ActiveRecord framework provides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109552027843610361?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109552027843610361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109552027843610361' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109552027843610361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109552027843610361'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/09/activerecord-and-yagni.html' title='ActiveRecord and YAGNI'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109301264250513888</id><published>2004-08-20T09:28:00.000-05:00</published><updated>2004-08-20T09:38:05.496-05:00</updated><title type='text'>You've gotta be kidding me!</title><content type='html'>I found this article yesterday, &lt;a href="http://www.sys-con.com/story/?storyid=46050"&gt;"Java Opinions: Geary vs Raible on JavaServer Faces (JSF)"&lt;/a&gt;.  I've hardly spent any time looking at JSF, but my initial impression was something like, "Why are they making this so hard?"  Well David Geary from the JSF Expert Group summed up its problems while trying to defend it.  Here is the key paragraph:&lt;br /&gt;&lt;br /&gt;"Also, I don't think that one of JSF's top priorities is to simplify Web development. Certainly that's a laudable goal, but you have to understand that JSF is: Web App Framework + Components + Event Model. That makes it considerably more complex than Struts, for instance, which is simply a framework. Also, JSF was designed primarily for use with tools, although I don't think that coding JSF apps by hand is necessarily more difficult than other frameworks of similar complexity.."&lt;br /&gt;&lt;br /&gt;It's as if the whole EJB fiasco never happened.  When a designer of a framework states the frameworks top priorites do not include simplifying development, run away. Run away as fast as you can!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109301264250513888?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109301264250513888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109301264250513888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109301264250513888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109301264250513888'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/08/youve-gotta-be-kidding-me.html' title='You&apos;ve gotta be kidding me!'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109286235672284103</id><published>2004-08-18T15:34:00.000-05:00</published><updated>2004-08-18T15:52:36.726-05:00</updated><title type='text'>More ruby fun</title><content type='html'>There have been several major ruby developments over the past couple of months that I wanted to mention.  I've had some spare time, and have played around with them this week.&lt;br /&gt;&lt;br /&gt;On the client side of things, &lt;a href="http://wxruby.rubyforge.org"&gt;WxRuby&lt;/a&gt; has been made available. &lt;a href="http://wxruby.rubyforge.org"&gt;WxRuby&lt;/a&gt; is a library that brings Ruby bindings to the cross-platform GUI toolkit &lt;a href="http://www.wxwidgets.org"&gt;WxWidgets&lt;/a&gt;.  This is something that I have been wanting for quite a while.  It's in its early stages, but there is enough there to play around with and write some quick and useful GUI apps.&lt;br /&gt;&lt;br /&gt;On the server side, the much anticipated and hyped &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt; web app framework has been released.  This framework really shows off the benefits of a language as dynamic as Ruby.  My initial reaction is that this is a PHP killer.  However, I think that may be an understatement.  Just google &lt;a href="http://www.google.com/search?q=ruby+rails"&gt;"ruby rails"&lt;/a&gt; and you will see the overwhelming positive response this framework is getting.  Last night, I watched this &lt;a href="http://media.nextangle.com/rails/rails_setup.mov"&gt;video&lt;/a&gt;.  First thing today, I went through the &lt;a href="http://www.rubyonrails.org/show/Tutorial"&gt;Tutorial&lt;/a&gt;.  Tomorrow, I'll try something from scratch.  I have a standard web app that I implement to play around with various frameworks, and I'm going to implement it with Rails and see how it goes.  So far, it is living up to the hype.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109286235672284103?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109286235672284103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109286235672284103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109286235672284103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109286235672284103'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/08/more-ruby-fun.html' title='More ruby fun'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109226481229058475</id><published>2004-08-11T17:33:00.000-05:00</published><updated>2004-08-18T15:32:55.796-05:00</updated><title type='text'>Croquet</title><content type='html'>Alan Kay's (Smalltalk creator) latest effort is &lt;a href="http://www.opencroquet.org"&gt;Croquet&lt;/a&gt;.  I really don't enough about it to explain what it is.  Check out the website, and in particular, the &lt;a href="http://murl.microsoft.com/LectureDetails.asp?1019"&gt;video stream&lt;/a&gt; from a talk he gave at Stanford about it.  He really sticks to the Standford administration and their graduate program for teaching Java.  He compared learning Java more akin to a vocational education than computer science.   I couldn't agree more.  Frankly, that is one of the reasons I switched to a computer science major 3 years into college.  I was pretty good at math, and I knew I could get a job when I got out.  But I digress.&lt;br /&gt;&lt;br /&gt;Croquet is implemented using &lt;a href="http://www.squeak.org"&gt;Squeak&lt;/a&gt; Smalltalk.  You would think that this would be obvious given Kay's background, but they had originally set out to implement the thing in Java.  After a bit of digging, they realized that Java was too rigid to meet their needs.  Based on Kay's previous works, Croquet is a natural progession of his vision of OOP that, I suspect, has come about 20 years later than he had probably hoped.  It is definitely worth keeping an eye on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109226481229058475?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109226481229058475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109226481229058475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109226481229058475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109226481229058475'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/08/croquet.html' title='Croquet'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109181192691350863</id><published>2004-08-06T12:01:00.000-05:00</published><updated>2004-08-06T12:05:26.913-05:00</updated><title type='text'>Updated the sidebar</title><content type='html'>I've updated the sidebar with links to other bloggers at &lt;a href="http://www.thoughtworks.com"&gt;ThoughtWorks&lt;/a&gt; and a few others that I find worthwhile reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109181192691350863?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109181192691350863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109181192691350863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109181192691350863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109181192691350863'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/08/updated-sidebar.html' title='Updated the sidebar'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-109120875770119128</id><published>2004-07-30T12:21:00.000-05:00</published><updated>2004-08-01T10:17:14.873-05:00</updated><title type='text'>Declarative Configuration vs. Declarative Coding</title><content type='html'>The term Declarative Programming seems to be overloaded.  Often in the Java world, I'll hear that some aspect of a framework is declarative, such as transactions or configuration of IoC containers.  All though this is very beneficial, I believe calling it declarative detracts from the value of declarative code.  One of the claims of functional programming is that it allows one to programming in a declarative style.  Great, what does that mean?  Well, due to the syntax of &lt;a href="http://www.haskell.org"&gt;Haskell&lt;/a&gt;, you write functions in terms of other functions and the new functions look more like statements of fact rather than sequences of opertaions.  Here is a simplistic example.&lt;br /&gt; &lt;br /&gt;In Haskell:&lt;br /&gt;&lt;pre&gt;double = (*2)&lt;br /&gt;quadruple = double . double&lt;/pre&gt;&lt;br /&gt;In Java:&lt;br /&gt;&lt;pre&gt;public static int double(int x) { return 2*x; }&lt;br /&gt;public static int quadruple(int x) { return double( double(x)); }&lt;/pre&gt;&lt;br /&gt;This example may be too simplistic and too subtle to make my point, but I'll try anyway.  The Java version is as close to a declarative style as possible, and from all pratical standpoints the Haskell version and the Java version are identical.  The difference is how you read the above code.  &lt;br /&gt;&lt;br /&gt;The Java version would commonly be read as:&lt;br /&gt;&lt;i&gt;"double takes an int and return 2 times the int."&lt;/i&gt;&lt;br /&gt;&lt;i&gt;"quadruple takes an int and calls double on the int, passing the results to double and returning the results."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In contrast, the Haskell version would be read as:&lt;br /&gt;&lt;i&gt;"double is the equivalent of multiplying an Integer by 2"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;"quadruple is the equivalent of the composition of double and double"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I don't mean to imply that you couldn't or wouldn't read the Java version the same as the Haskell version in this simple case, but if peruse the Haskell Prelude library, you will notice that the a lot of the functions are defined in a similar manner as the quadruple function.  This is a completely different paradigm than that employed by most OO programmers.  It needn't be. The syntax may lead one away from a declarative style, but as Eric Evans points out in his &lt;a href="http://domaindrivendesign.org/"&gt;DDD&lt;/a&gt; book, you can write OO code in a more declarative style.&lt;br /&gt;&lt;br /&gt;Back to my original point, when someone mentions declarative programming in the context of an OO framework, they often mean that certain behavioral aspects of components are defined in some sort of external configuration file, probably some nasty XML file.  This may be a form of declarative programming, but there is a much deeper form, declarative coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-109120875770119128?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/109120875770119128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=109120875770119128' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109120875770119128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/109120875770119128'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/07/declarative-configuration-vs.html' title='Declarative Configuration vs. Declarative Coding'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-108990355437128496</id><published>2004-07-15T09:56:00.000-05:00</published><updated>2004-07-15T09:59:14.370-05:00</updated><title type='text'>I'm not the only one</title><content type='html'>Here is an article on IBM's developerWorks site about doing funcational style programming in Java.  I've only scanned it, but it makes me feel like what I am doing is not a complete waste of time.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-106.ibm.com/developerworks/library/j-fp.html?ca=drs-j2904"&gt;Functional programming in the Java language&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-108990355437128496?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/108990355437128496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=108990355437128496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/108990355437128496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/108990355437128496'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/07/im-not-only-one.html' title='I&apos;m not the only one'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-108905606121404228</id><published>2004-07-05T14:23:00.000-05:00</published><updated>2004-07-05T14:58:53.096-05:00</updated><title type='text'>Declarative and Side-Effect Free</title><content type='html'>In Eric Evans book, &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321125215/qid%3D1089055247/sr%3D11-1/ref%3Dsr%5F11%5F1/104-4869773-6015168"&gt;Domain Driven Design&lt;/a&gt;, he talks of writing code that is declarative, uses side-effect-free function and Value Objects whenever possible.  Those with a functional programming background will respond with an, "of course!" However, this requires a different way of thinking about programming than most OO programmers are accustomed to.&lt;br /&gt;&lt;br /&gt;I've played around with functional languages infrequently over the last 5 years or so.  I've goofed off with some &lt;a href="http://www.cons.org/"&gt;Lisp&lt;/a&gt; and &lt;a href="http://www.drscheme.org/"&gt;Scheme&lt;/a&gt;, gone through a couple of &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt; tutorials, and done some &lt;a href="http://www.haskell.org"&gt;Haskell&lt;/a&gt; with the help of &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201342758/qid=1089054339/sr=8-1/ref=sr_8_xs_ap_i1_xgl14/104-4869773-6015168?v=glance&amp;s=books&amp;n=507846"&gt;Haskell: The Craft of Functional Programming&lt;/a&gt;.  During this time, I've grasped most of the basic concepts and can write trivial programs, but I've yet to do anything approaching a "real world" application. &lt;br /&gt;&lt;br /&gt;Well, I am renewing my research into functional languages using Haskell.  I think trying to model something "real world" in a functional style would be a useful learning experience.  I'm highly doubtful that functional languages will ever be "mainstream", but that's not the point.  If I can learn another way to express a solution to a problem or another approach to solving a problem then it is time well spent.&lt;br /&gt;&lt;br /&gt;As a Haskell refresher, I'm going through &lt;a href="http://www.isi.edu/~hdaume/htut/tutorial.pdf"&gt;Yet Another Haskell Tutorial&lt;/a&gt; by Hal Daume III et al.  So far, I would recommend this tutorial for any programmer interested in learning Haskell.  It's a work in progress, but what is there is enough to get a newbie on their way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-108905606121404228?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/108905606121404228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=108905606121404228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/108905606121404228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/108905606121404228'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/07/declarative-and-side-effect-free.html' title='Declarative and Side-Effect Free'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-108342473749098311</id><published>2004-05-01T10:05:00.000-05:00</published><updated>2004-05-10T09:20:38.480-05:00</updated><title type='text'>I've had it!!</title><content type='html'>I've decided that only way I will program in Java or .NET is if I'm getting paid.  Since I am a consultant, I'll be using these languages quite frequently.  However, there is a ton a stuff on every project, regardless of platform, that needs to be automated, such as builds, planning, reporting, testing, version control integration, code generation, etc...  Why not build a set of platform agnostic tools to handle these things.  I don't know maybe use something like a scripting language ;) ?  Perl, Python, and Ruby excel at these sorts of tasks and I don't see them used frequently enough.  For example, if I am going to use code generation, why would I use Java or C#?  They suck at string manipulation, or are at least extremely verbose, where as scripting language originated to solve this problem.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-108342473749098311?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/108342473749098311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=108342473749098311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/108342473749098311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/108342473749098311'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/05/ive-had-it.html' title='I&apos;ve had it!!'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-107914481982340692</id><published>2004-03-12T20:44:00.000-06:00</published><updated>2004-05-10T11:42:17.510-05:00</updated><title type='text'>I've been missing Ruby</title><content type='html'>It's been a while since I've done anything with Ruby.  It really is the most satisfying programming language I've worked with.  Maybe with Ruby2 or Parrot, I'll actually be able to use it profesionally.  In the meantime, I use it for utility scripts and code generation for lesser languages (you know, the kind they have to pay you to use).   Another of my favorite uses for Ruby is as a replacement for UML when modeling.  Having functional code is so much more gratifying than a diagram.&lt;br /&gt;&lt;br /&gt;Last night, I was playing around with finite state machines, using the example in &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0135974445/qid=1079145515/sr=8-1/ref=pd_ka_1/002-9771590-2736825?v=glance&amp;s=books&amp;n=507846"&gt;Agile Software Development&lt;/a&gt; by Bob (Uncle Bob) Martin.  He talks about using a generator to generate most of the state machine from a simple spec.  In Ruby, you can define and modify classes at runtime which makes this sort of thing MUCH easier.  Here is what I came up with:&lt;br /&gt;&lt;pre&gt;class TurnstyleController&lt;br /&gt;    attr_accessor :state&lt;br /&gt; &lt;br /&gt;    def initialize(state)&lt;br /&gt;        @state = state&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def state=(s)&lt;br /&gt;        @state = s&lt;br /&gt;        print s.class.name + ' &gt; '&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    # actions    &lt;br /&gt;    def unlock&lt;br /&gt;        print "unlock"&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def lock&lt;br /&gt;        print "lock"&lt;br /&gt;    end&lt;br /&gt;     &lt;br /&gt;    def alarm&lt;br /&gt;        print "alarm"&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def thankYou&lt;br /&gt;        print "thank you"&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    # events&lt;br /&gt;    def coin&lt;br /&gt;        print @state.class.name + ' &gt; '&lt;br /&gt;        print "coin" + ' &gt; '&lt;br /&gt;        @state.coin(self)&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def pass&lt;br /&gt;        print @state.class.name + ' &gt; '&lt;br /&gt;        print "pass" + ' &gt; '&lt;br /&gt;        @state.pass(self)&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Creates a new state transition by adding &lt;br /&gt;# a new event to the state class&lt;br /&gt;def transition(state, event, newState, action)&lt;br /&gt;    eval &lt;&lt;-"end_eval"&lt;br /&gt;    class #{state}&lt;br /&gt;        def #{event}(c)&lt;br /&gt;            c.state = #{newState}.new&lt;br /&gt;            c.#{action}&lt;br /&gt;        end&lt;br /&gt;    end&lt;br /&gt;    end_eval&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#           State       Event   New State   Action&lt;br /&gt;transition 'Locked',    'coin', 'Unlocked', 'unlock'&lt;br /&gt;transition 'Locked',    'pass', 'Locked',   'alarm'&lt;br /&gt;transition 'Unlocked',  'coin', 'Unlocked', 'thankYou'&lt;br /&gt;transition 'Unlocked',  'pass', 'Locked',   'lock'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;c = TurnstyleController.new(Locked.new)&lt;br /&gt;c.coin&lt;br /&gt;puts&lt;br /&gt;c.pass&lt;br /&gt;puts&lt;br /&gt;c.pass&lt;br /&gt;puts&lt;br /&gt;c.coin&lt;br /&gt;puts&lt;br /&gt;c.coin&lt;br /&gt;puts&lt;br /&gt;c.pass&lt;br /&gt;puts&lt;/pre&gt;&lt;br /&gt;If you have Ruby installed, just copy this to a file and run it.  For those who don't, here is the output:&lt;br /&gt;&lt;pre&gt;Locked &gt; coin &gt; Unlocked &gt; unlock&lt;br /&gt;Unlocked &gt; pass &gt; Locked &gt; lock&lt;br /&gt;Locked &gt; pass &gt; Locked &gt; alarm&lt;br /&gt;Locked &gt; coin &gt; Unlocked &gt; unlock&lt;br /&gt;Unlocked &gt; coin &gt; Unlocked &gt; thank you&lt;br /&gt;Unlocked &gt; pass &gt; Locked &gt; lock&lt;/pre&gt;&lt;br /&gt;Ruby rocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-107914481982340692?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/107914481982340692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=107914481982340692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107914481982340692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107914481982340692'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/03/ive-been-missing-ruby.html' title='I&apos;ve been missing Ruby'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-107798782570457783</id><published>2004-03-01T16:34:00.000-06:00</published><updated>2004-05-10T11:42:49.126-05:00</updated><title type='text'>Off to a good start?</title><content type='html'>This past week my new project started up.  I think we got off to a good start.  We've started by taking a very thin slice of functionality and getting it to work from end to end.  Our estimates were way too high for our tasks this week, but those will be become more realistic as time passes.  &lt;br /&gt;&lt;br /&gt;We've been doing everything test first, except for the GUI.  We are going to see how long we can get away with this.  The current architecture separates all "functionality" out of the GUI, so the only thing that will not be covered by unit tests will be the connections from the GUI to the control layer.  In order to test the controller layer, our unit test look very similiar to the code that sits in the GUI without all the GUI functionality.  One of the keys to this separation is the use of events and delegates in C#.  Here is some code to show you what we have right now.  &lt;br /&gt;&lt;pre&gt;public class Controller&lt;br /&gt;{&lt;br /&gt;    public delegate void ChangeScreenHandler(ScreenEnum screen);&lt;br /&gt;    public event ChangeScreenHandler ChangeScreen;&lt;br /&gt;    &lt;br /&gt;    public void DoSomething() &lt;br /&gt;    {&lt;br /&gt;        // do some stuff on/with/to the model...&lt;br /&gt;        this.model.DoStuff();&lt;br /&gt;        // fire ChangeScreen event&lt;br /&gt;        ChangeScreen(ScreenEnum.DidStuffScreen);&lt;br /&gt;    } &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;In our test:&lt;br /&gt;&lt;pre&gt;[SetUp]&lt;br /&gt;public void SetUp()&lt;br /&gt;{&lt;br /&gt;    this.model = new Model();&lt;br /&gt;    this.controller = new Controller(model);&lt;br /&gt;    this.controller.ChangeScreen += new ChangeScreenHandler(this.HandleChangeScreen);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void HandleChangeScreen(ScreenEnum screen)&lt;br /&gt;{&lt;br /&gt;    this.screen = screen;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[Test]&lt;br /&gt;public viod TestDoSomething()&lt;br /&gt;{&lt;br /&gt;    this.controller.DoSomething();&lt;br /&gt;    // verify that stuff happend to the model&lt;br /&gt;    Assert.AreEqual("model state", model.State);&lt;br /&gt;    // verify that the screen navigation occured;&lt;br /&gt;    Assert.AreEqual(ScreenEnum.DidStuffScreen, this.screen);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In our GUI code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// in the constructor&lt;br /&gt;// ...&lt;br /&gt;    controller = new Controller(new Model());&lt;br /&gt;    controller.ChangeScreen += new ChangeScreenHandler(this.HandleChangeScreen);&lt;br /&gt;// ...&lt;br /&gt;//user clicks the do something button&lt;br /&gt;public void btnDoSomething(object sender, Event e)&lt;br /&gt;{&lt;br /&gt;    controller.DoSomething();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// set the active screen;&lt;br /&gt;public void HandleScreenChange(ScreenEnum screen)&lt;br /&gt;{&lt;br /&gt;    panel.Clear();&lt;br /&gt;    panel.Components.Add(GetFormFor(screen));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The nice thing about this is that it clearly separates all the GUI layout code from the application code.  Yesterday, I had to change the navigation between screens three times.  I started with a single panel then changed to tabbed pages with one tab for each screen.  I showed this to the customer and he explained that why the tabs were a bad idea.  I went back and changed it to a single panel with a tree control with one node for each screen.  The details of all of this are not important. What is important is that in doing this, I only touched the GUI code and not the application code at all.&lt;br /&gt;&lt;br /&gt;Part of me is concerned that this is abuse of delegates and events, especially since I am new to C# and new users tend to abuse new language features, but time and reality will tell if I've fallen down a rabbit hole.  As we go forward and add more screens and events, we will probably want to change the structure a bit so that event processing can be handled by finite state machines, see this &lt;a href="http://www.objectmentor.com/publications/UMLFSM.PDF"&gt;article&lt;/a&gt; by Uncle Bob.  We'll cross that brige when we come to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-107798782570457783?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/107798782570457783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=107798782570457783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107798782570457783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107798782570457783'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/03/off-to-good-start.html' title='Off to a good start?'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-107686125842723571</id><published>2004-02-15T11:03:00.000-06:00</published><updated>2004-05-10T11:43:06.423-05:00</updated><title type='text'>Impressions.NET</title><content type='html'>For the past 3 years, I've been working for &lt;a href="http://www.thoughtworks.com"&gt;ThoughtWorks&lt;/a&gt; developing Java applications.  Mostly, it's been web apps, but there have been a few back end systems thrown in the mix.  During that time, .NET has been looming off in the distance.  Since my next billable project will be done in C#, I started playing around with it last week.  I've learned a lot, and overall my impressions have been pretty favorable.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The .NET Framework API's are &lt;b&gt;much&lt;/b&gt; than Java's, but then again, most languages core API's are better than Java's, (*cough* java.util.Calendar).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;C# Properties are cool, but have there limitations.  I haven't found a way to make Properties abstract in a base class.  To work around this, I had to create an abstract GetFoo() method.  This kinda breaks the whole Property metaphor.  Maybe an interface would solve the problem?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IDisposable is something that Java should have had at JDK1.0, but still doesn't have.  Most java resource class, i.e. Reader and Writer, have a close() method that gets called in a finally block.  These classes don't implement a common interface so I have write the following code all over the place,&lt;br /&gt;&lt;pre&gt;Reader reader = null;&lt;br /&gt;Writer writer = null;&lt;br /&gt;try {&lt;br /&gt;    reader = new Reader("foo.txt");&lt;br /&gt;    writer = new Writer("bar.txt");&lt;br /&gt;    // do some stuff&lt;br /&gt;} finally {&lt;br /&gt;    if(reader != null) reader.close();&lt;br /&gt;    if(writer != null) writer.close();&lt;br /&gt;}&lt;/pre&gt;In C#, I can write a method like,&lt;br /&gt;&lt;pre&gt;public void Close(params IDisposable[] disposables)&lt;br /&gt;{&lt;br /&gt;    foreach(IDisposable each in disposables)&lt;br /&gt;    {&lt;br /&gt;        if(each != null) each.Close();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Then in my finally block:&lt;br /&gt;&lt;pre&gt;finally&lt;br /&gt;{&lt;br /&gt;   Close(reader, writer);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;In fact, C# provides some syntactic sugar so that I can just say:&lt;br /&gt;&lt;pre&gt;using(Reader r = new Reader("foo.txt")&lt;br /&gt;{&lt;br /&gt;    //do stuff&lt;br /&gt;}&lt;/pre&gt;The reader will automatically get closed at the end of the using block.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Events and delegates kick the crap out of Java's Listener via anonymous inner classes.  I really like delegates.  They aren't quite as nice as Blocks in Smalltalk or Ruby, but they allow you to achieve a similar effect in a typesafe way.  &lt;a href="http://download.microsoft.com/download/8/1/6/81682478-4018-48fe-9e5e-f87a44af3db9/SpecificationVer2.doc"&gt;C# 2.0&lt;/a&gt; will change all of this with anonymous delegates and iterators.  I'm not sure if this is on the Java roadmap, but I consider this sort of functionality an essential feature for any language.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I like Visual Studios's Solution/Projects organization.  In most java IDE's, I have one project that holds my src tree and test tree.  In VS, I create a project for my src tree and a project for test tree.  It makes the separation much more explicit.  I think there are ways to achieve this in Eclipse and Intellij, but with VS, it just seemed like the obvious organizational structure.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I loath just about everything else about Visual Studio.  &lt;a href="http://www.jetbrains.com"&gt;JetBrains&lt;/a&gt;, get the C# plugin out before I have a nervous breakdown!  I'm not going to bother telling everything that sucks about VS, but I will say have fun renaming that method or variable.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;It appears as if Microsoft is doing the right thing from technology stand point, so it'll be an interesting couple of years.  However, if I were king, I would only use .NET for "Smart Clients" in a Windows only shop.  All of the good things about .NET are not compelling enough for me to run Windows servers or make any more commitments to Microsoft.  Longhorn may change this, but somehow I doubt it.  Anyone remember Windows95, Windows98, Windows98SE?  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-107686125842723571?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/107686125842723571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=107686125842723571' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107686125842723571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107686125842723571'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/02/impressionsnet.html' title='Impressions.NET'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6477557.post-107677209503995237</id><published>2004-02-14T09:14:00.000-06:00</published><updated>2004-02-14T09:45:08.890-06:00</updated><title type='text'>First Post</title><content type='html'>Yet another attempt at blogging!  I really suck at this sort of thing, but every now and then I feel like I have something to say.  I'll keep most of this technical in nature, but I may throw some other random thoughts out there.  Stay tuned, or not...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6477557-107677209503995237?l=wilkes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wilkes.blogspot.com/feeds/107677209503995237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6477557&amp;postID=107677209503995237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107677209503995237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6477557/posts/default/107677209503995237'/><link rel='alternate' type='text/html' href='http://wilkes.blogspot.com/2004/02/first-post.html' title='First Post'/><author><name>Wilkes Joiner</name><uri>http://www.blogger.com/profile/16667352630170810773</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
