<?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-12006119</id><updated>2012-01-27T03:16:10.393+11:00</updated><category term='WebSphere'/><title type='text'>Bill Birch's Blog</title><subtitle type='html'>"There may be no good reason for things to be the way they are." Alan de Botton</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12006119.post-491395359691852979</id><published>2012-01-27T00:38:00.009+11:00</published><updated>2012-01-27T02:28:49.975+11:00</updated><title type='text'>Toshiba Portege M400 Debian Linux Squeeze 6.0.3 Install Note #1 - Touchscreen</title><content type='html'>&lt;div&gt;The M400 tablet PC has a Wacom touch screen electronics. This appears as a serial device. Because of this, there is no need to install wacom kernel drivers! This means there's nothing found by any of &lt;i&gt;dmesg&lt;/i&gt; , &lt;i&gt;lshw&lt;/i&gt; nor &lt;i&gt;discover&lt;/i&gt; !&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However Squeeze does not recognize the touch screen of the M400 tablet PC. So the command&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;xinput list&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;does not show the device.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This down to an upstream bug as follows &lt;a href="https://bugs.launchpad.net/ubuntu/+source/xf86-input-wacom/+bug/522318"&gt;https://bugs.launchpad.net/ubuntu/+source/xf86-input-wacom/+bug/522318&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This fix is to apply the above patch to the file &lt;i&gt;/lib/udev/rules.d/69-xserver-xorg-input-wacom.rules. &lt;/i&gt;Then reboot. &lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Debug aids:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;You can test the device by running &lt;/div&gt;&lt;div style="text-align: center;"&gt; &lt;i&gt;cat /dev/ttyS? | od &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; &lt;/i&gt;then move the pen around. On my machine I found that running the command&lt;/div&gt;&lt;div style="text-align: center;"&gt;cat &lt;i&gt;/dev/ttyS0 | od&lt;/i&gt; &lt;/div&gt;&lt;div&gt;produced output when my pen was moved. You may have to try all the &lt;i&gt;/dev/ttyS*&lt;/i&gt; devices. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When patched and working, you will see this:&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;div&gt;$ xinput list&lt;/div&gt;&lt;div&gt;⎡ Virtual core pointer                    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;id=2&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[master pointer  (3)]&lt;/div&gt;&lt;div&gt;⎜   ↳ Virtual core XTEST pointer              &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;id=4&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slave  pointer  (2)]&lt;/div&gt;&lt;div&gt;⎜   ↳ Microsoft  Microsoft Basic Optical Mouse v2.0 &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;id=9&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slave  pointer  (2)]&lt;/div&gt;&lt;div&gt;⎜   ↳ PS/2 Mouse                              &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;id=11&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slave  pointer  (2)]&lt;/div&gt;&lt;div&gt;⎜   ↳ AlpsPS/2 ALPS GlidePoint                &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;id=12&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slave  pointer  (2)]&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;⎜   ↳ Serial Wacom Tablet eraser              &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;id=13&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;[slave  pointer  (2)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;⎜   ↳ Serial Wacom Tablet                     &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;id=14&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;[slave  pointer  (2)]&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;i&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;And hwinfo reports:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# hwinfo&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  10: udi = '/org/freedesktop/Hal/devices/pnp_WACf004_serial_platform_0'&lt;br /&gt;linux.device_file =&lt;span style="color: rgb(255, 102, 102);"&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;'/dev/ttyS0'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;linux.hotplug_type = 2 (0x2)&lt;br /&gt;linux.subsystem = 'tty'&lt;br /&gt;info.capabilities = { 'serial' }&lt;br /&gt;info.category = 'serial'&lt;br /&gt;info.subsystem = 'tty'&lt;br /&gt;info.product = &lt;span style="color: rgb(255, 0, 0);"&gt;'Wacom Serial Tablet PC Pen Tablet/Digitizer'&lt;/span&gt;&lt;br /&gt;linux.sysfs_path = '/sys/devices/pnp0/00:0c/tty/ttyS0'&lt;br /&gt;info.parent = '/org/freedesktop/Hal/devices/pnp_WACf004'&lt;br /&gt;info.udi = '/org/freedesktop/Hal/devices/pnp_WACf004_serial_platform_0'&lt;br /&gt;serial.originating_device = '/org/freedesktop/Hal/devices/pnp_WACf004'&lt;br /&gt;serial.device = '/dev/ttyS0'&lt;br /&gt;serial.port = 0 (0x0)&lt;br /&gt;serial.type = 'platform'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-491395359691852979?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/491395359691852979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=491395359691852979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/491395359691852979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/491395359691852979'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2012/01/toshiba-portege-m400-debian-linux.html' title='Toshiba Portege M400 Debian Linux Squeeze 6.0.3 Install Note #1 - Touchscreen'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-398774353134910788</id><published>2010-09-03T19:53:00.007+10:00</published><updated>2010-09-03T20:24:07.446+10:00</updated><title type='text'>Top Gear is Dr Who</title><content type='html'>I think &lt;span style="font-style: italic;"&gt;Top Gear&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Dr. Who&lt;/span&gt; are the same show. Look at the similarities:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Stig = The Doctor, who dies and regenerates in slightly different forms and is played by different actors. First black, then white.  What colour Stig next? The Stig is not human and can drive any time machine (er, car) perfectly. Ever notice how he is always discussed formally as "The Doctor" or "The Stig", never some other nomenclature?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Car = The TARDIS, much abused but moves people and them some.  &lt;a href="http://www.youtube.com/watch?v=N77GAsv8X-Q"&gt;http://www.youtube.com/watch?v=N77GAsv8X-Q&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Jerremy Clarkson,  James May and Richard Hammond are The Assistants, each echoing a portion of the Doctor's personality.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Stopwatch = The Sonic Screwdriver, part of the cast almost.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Producers = Terry Nation et. al. who put the characters in strange challenges each episode.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The Guests = Guest stars who drop into the series to add to the ratings.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The company? The BBC.&lt;/li&gt;&lt;/ul&gt;Can you spot more equivalences?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-398774353134910788?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/398774353134910788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=398774353134910788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/398774353134910788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/398774353134910788'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2010/09/top-gear-is-dr-who.html' title='Top Gear is Dr Who'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-6155791965566596658</id><published>2010-04-11T00:35:00.004+10:00</published><updated>2010-04-12T21:17:20.807+10:00</updated><title type='text'>The Configuration Management Manifesto</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;We follow these principles:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We use source control tools to record changes to our software and configuration during development so that our source code and source data is uniquely identifiable&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Our deployable software is created by repeatable and automated builds.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We identify every item of source code and data used to create our deployable artefacts.&lt;br /&gt;&lt;br /&gt;We provide a cryptographic checksum of all files we release.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We generate deployable software that is uniquely identified and self-identifying. No two artefacts we generate have the same identification.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We create software products whose environment configuration is externalised hence absent from the deployable software artefacts.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We provide a baseline of the unique identifiers for all parts of a delivery to our customers including software releases, test or production environments, hardware, data or any other delivery.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We record the all changes we make to our test and production environments, including software deployments, configuration changes, and hardware changes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We only test software artefacts that are uniquely identifiable.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We only test software in environments whose hardware. and software components configurations are fully documented.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-6155791965566596658?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/6155791965566596658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=6155791965566596658' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/6155791965566596658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/6155791965566596658'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2010/04/configuration-management-manifesto.html' title='The Configuration Management Manifesto'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-7042299928261224418</id><published>2009-08-26T08:44:00.009+10:00</published><updated>2009-08-26T10:51:41.068+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebSphere'/><title type='text'>Faster WebSphere wsadmin Jython scripting with imports</title><content type='html'>When using wsadmin to run Jython scripts I'm seeing a 30 sec startup time, which is too long for my edit-run-test cycle. Here's a way of avoiding the startup delay.&lt;br /&gt;&lt;br /&gt;This method uses a simple boot script to launch a read-execute-print-loop (REPL) which you use for your own work. wsadmin does not set up the modules it's imported properly. This you need to fix in your top-level script.  Here's the invocation:&lt;br /&gt;&lt;pre&gt;    ${path-to-wsadmin}/wsadmin.sh -lang jython -f ./repl.py&lt;/pre&gt;Here's repl.py&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import&lt;/span&gt; sys&lt;br /&gt;sys.modules[&lt;span style="color: rgb(0, 153, 0);"&gt;'AdminConfig'&lt;/span&gt;] = AdminConfig&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import&lt;/span&gt; code&lt;br /&gt;repl = code.InteractiveConsole()&lt;br /&gt;repl.interact(&lt;span style="color: rgb(0, 153, 0);"&gt;"jython %s console"&lt;/span&gt; % (sys.version))&lt;/pre&gt;&lt;br /&gt;When you run this, you get a prompt:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jython 2.1 console&lt;br /&gt;&gt;&gt;&gt;&lt;/pre&gt;Your scripts need to import the relevant Admin module. e.g. 'foo.py' starts with&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import&lt;/span&gt; AdminConfig&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;class&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Foo&lt;/span&gt;:&lt;br /&gt; ...&lt;br /&gt;&lt;/pre&gt;So when you the script with execfile, it picks up the wsadmin modules:&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; execfile('foo.py')&lt;/pre&gt;or&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; import foo&lt;br /&gt;&gt;&gt;&gt; reload foo&lt;br /&gt;&lt;/pre&gt;Now you can edit and run 'foo.py' without relaunching wsadmin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-7042299928261224418?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/7042299928261224418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=7042299928261224418' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/7042299928261224418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/7042299928261224418'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2009/08/faster-websphere-wsadmin-jython.html' title='Faster WebSphere wsadmin Jython scripting with imports'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-2939308053227566432</id><published>2008-08-03T13:36:00.003+10:00</published><updated>2011-11-26T17:01:59.736+11:00</updated><title type='text'>Announcement: Genyris Language</title><content type='html'>An implementation of this new language inspired by the Semantic Web is now &lt;a href="https://code.google.com/p/genyris/"&gt;available&lt;/a&gt;. Genyris is a Scheme derivative language with classes. An object can belong to multiple classes at once. (This is not multiple inheritance - each object has not just one class but a set of them.)  In summary:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Anything can be "tagged" as a member of a class (including cons cells, atoms). Once tagged, programmers can use OO-style methods, inheritance etc to play with the objects. &lt;/li&gt;&lt;li&gt;Fully OO &lt;/li&gt;&lt;li&gt;Objects may be members of multiple classes &lt;/li&gt;&lt;li&gt;Classes are assigned to objects after construction &lt;/li&gt;&lt;li&gt;Indentation syntax reduces parentheses.&lt;/li&gt;&lt;/ul&gt;A tutorial and Java binary executable are available for&lt;a href="https://code.google.com/p/genyris/"&gt; &lt;/a&gt;&lt;a href="https://code.google.com/p/genyris/"&gt;download&lt;/a&gt;&lt;a href="https://code.google.com/p/genyris/"&gt;.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-2939308053227566432?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/2939308053227566432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=2939308053227566432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/2939308053227566432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/2939308053227566432'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2008/08/announcement-genyris-language.html' title='Announcement: Genyris Language'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-818934084031539580</id><published>2007-04-15T11:56:00.000+10:00</published><updated>2007-04-15T12:02:06.132+10:00</updated><title type='text'>Rest In Peace: RefLisp, Lispin</title><content type='html'>After decades of hacking my C++ Lisp interpreter I just got sick of the state of the code. I don't like most of the code any more. I had some advice from Jon Eaves (http://www.eaves.org), who said "Are you a typist or a programmer?". Hmmm. The value of the work is actually in my head, not the code. His advice - walk away - rewrite it since you will write it much better the next time.&lt;br /&gt;&lt;br /&gt;Soooo I have started rewriting it in Java. After three days in, I have got it to this state:&lt;br /&gt;&lt;br /&gt;   JLispin &gt; ((lambda (x) x) (cons (quote Hello) "World"))&lt;br /&gt;   (Hello . "World")&lt;br /&gt;&lt;br /&gt;Woohooo !&lt;br /&gt;&lt;br /&gt;I'm using SICP as a guide for implementation.&lt;br /&gt;&lt;br /&gt;Why Java, I hear you ask? Lots of reasons. The other main candidate was Mono/C#. Java has Eclipse whereas Monodevelop is not more than a text editor. (No debugger). I'm dependant on the Eclipse refactoring tools nowadays. Only Vi$ual $tudio has refactoring tools for C# ;-(.  Mono will also compile Java, so Java wins. JLispin will also come in handy in my Java day job.&lt;br /&gt;&lt;br /&gt;Let me know if you're interested in dabbling in the project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-818934084031539580?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/818934084031539580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=818934084031539580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/818934084031539580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/818934084031539580'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2007/04/rest-in-peace-reflisp-lispin.html' title='Rest In Peace: RefLisp, Lispin'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-5695768403138963711</id><published>2007-02-25T00:06:00.000+11:00</published><updated>2007-02-25T01:54:25.486+11:00</updated><title type='text'>Why I demand Agile development.</title><content type='html'>You can rely on Agile development projects to produce good code &lt;span style="font-style: italic;"&gt;and unit tests, regression tests and continuous integration environments&lt;/span&gt;. Waterfallers can do this too, but don't expect it.&lt;br /&gt;&lt;br /&gt;My last couple of Agile projects have used Thoughtworks developers. We've been using Java to build both J2EE web applications and an fat client. When the projects are finished, we are handed not just a fine application, but also a complete world of fully automated test suites and JUnit or Selinium tests. The code itself is highly refined since by now it has been refactored many times.&lt;br /&gt;&lt;br /&gt;Big Deal, I hear you say, what does this have to do with architecture? Well as an architect this suite of code and tests means  a lot to me. I don't need to design every foreseeable integration point up front. Because the code is well-made I can be sure that adding integration points in future will be feasible and safe.&lt;br /&gt;&lt;br /&gt;It's feasible because of the large number of unit tests has forced the devs to use dependency injection, so adding interfaces doesn't engender a re-write.  It's safe because when we refactor to add (say) a web service, I know the automated regression tests will pick up any breakages. So changing is less painful in after-project maintenance.  Not surprising when you understand that all coding is maintenance in an Agile process.&lt;br /&gt;&lt;br /&gt;So when I consider change cases for the system design I can be very relaxed about future changes. This is very valuable to me &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; my customer. It reduces my need to create a Big Design Up Front. The less you do up front, the better.&lt;br /&gt;&lt;br /&gt;Deferring detailed design decisions allows you to use the lessons learned during prototyping and software development. In engineering terms its a way of reducing delay in the feedback loop from posited design to actual experience.&lt;br /&gt;&lt;br /&gt;As each iteration unfolds we create production-ready software. We run this an make sure it works in a production-like environment. So any architectural nasties are found early. On one memorable project I deployed the software into the production environment well before the system was to go live. The system performance was abysmal due to WAN latency. We were able to make fixes in the next iteration without breaking stride. If it had been a waterfall project we would have never seen the issue until the end.&lt;br /&gt;&lt;br /&gt;Your Agile development team can give you early warning if you have architectural issues.&lt;br /&gt;&lt;br /&gt;All good reasons architects should prefer Agile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-5695768403138963711?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/5695768403138963711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=5695768403138963711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/5695768403138963711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/5695768403138963711'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2007/02/why-i-demand-agile-development.html' title='Why I demand Agile development.'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-111407046699046068</id><published>2005-04-21T17:56:00.000+10:00</published><updated>2007-02-25T18:48:31.256+11:00</updated><title type='text'>Automatic Unit Test Case Generation</title><content type='html'>We have millions of lines of source code in all sorts of langauges. A lot of it was written by waterfall projects who did not use &lt;em&gt;Test-Driven Development&lt;/em&gt;. In other words we don't have unit tests for much of it. But we do want to move to &lt;a href="http://agilemanifesto.org/"&gt;Agile&lt;/a&gt; methods. The problem is that without unit tests refactoring becomes very, very scary for most IT people. So we appear to be snookered.&lt;br /&gt;&lt;br /&gt;There are many &lt;em&gt;Unit Test Case Generators&lt;/em&gt; which seem to require a human to fill in the core. &lt;a href="http://www.agitar.com/"&gt;Agitar&lt;/a&gt; have some very sexy technology which can do some of this. However, how can it know what a correct outcome is?&lt;br /&gt;&lt;br /&gt;One thing we do have, (even in waterfall projects) is suites of System Tests or UATs (User Acceptance Tests). Sometimes these are manual, sometimes they are automatic. Either way they test the entire system, not just a small component. The other thing we have is working code.&lt;br /&gt;&lt;br /&gt;So why can't we use the correctness of the code and the system tests to automatically derive component unit tests?&lt;br /&gt;&lt;br /&gt;What is needed is a software tool that will take the source or bytecodes of our applications and instrument them. When we run our system tests, it watches the behaviour of the components and records inputs and outputs. It would use the logged results to generate unit tests. We take the unit tests and add them to out build process. Next time a developer changes a component it will detect if the change will break the observed correct behaviour.&lt;br /&gt;&lt;br /&gt;This tool would also solve another hard problem. Much of our software relies on large 'frameworks' and is called up and handed a large environment. The problem is that to re-create the environment outside the framework (in a unit test) is hard. A tool which records system test behaviour would also be able to record the state of the environment before and after the test. It would also record the components' interaction (side effects) with the environment.&lt;br /&gt;&lt;br /&gt;This does not sound easy. But such a tool would massively reduce our testing costs because we would re-test small components without having to do a full end-to-end system test.&lt;br /&gt;&lt;br /&gt;Caveat: I have not carefully researched solutions to this problem so there already may be something available.&lt;br /&gt;&lt;br /&gt;Here's an simple Lispin version which re-writes the multiplication function and logs all calls as test cases.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(210, 40, 17);"&gt;defun&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt; system-tests &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;n&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;; test multiplication n times&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(210, 40, 17);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;random&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;random&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;not&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;equal&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; n &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      system-tests &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(210, 40, 17);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; n &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(210, 40, 17);"&gt;defun&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt; test-apply &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;func args expected-return&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;; unit test harness...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;cond&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;equal&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;apply&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; func args&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; expected-return&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;         &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;format&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;t&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"OK~%"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;         &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;format&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;t&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"FAILED ~S ~S ~S~%"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; func args expected-return&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(210, 40, 17);"&gt;df&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt; test-o-matic &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;rest&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; fn&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;; replace function with instrumented version that logs correct behaviour&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;setq&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; fn &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;car&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; fn&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;           &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;; select first parameter&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   put fn 'olddef &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;eval&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; fn&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;; save old definition&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;set&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; fn &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;subst&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; fn 'fn&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;         &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;quote&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            lambdaq &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;rest&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;setq&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;mapc&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;eval&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;format&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;t&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"(test-apply #'~S '"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; 'fn&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;prin1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;setq&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;apply&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;get&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; 'fn 'olddef&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;format&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;t&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;" '~S)~%"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;               &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;the&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; *x&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   fn&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;test-o-matic &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(210, 40, 17);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;system-tests &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;; generates: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;;(test-apply #'* '(25972 868) '22543696)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;;(test-apply #'* '(22980 2223) '51084540)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(14, 214, 0);"&gt;;(test-apply #'* '(22549 23592) '531976008)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-111407046699046068?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/111407046699046068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=111407046699046068' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111407046699046068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111407046699046068'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2005/04/1-automatic-unit-test-case-generation.html' title='Automatic Unit Test Case Generation'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-111354186594573689</id><published>2005-04-15T15:00:00.000+10:00</published><updated>2005-04-15T15:12:25.486+10:00</updated><title type='text'>Dolor</title><content type='html'>We're all hurting, but every business has a unique threshold of pain. Some business can continue doing things in expensive ways for years, hemorrhaging money on useless activity or parasites. Most cannot. What matters is whether the business can afford the costs and whether the spend required exceeds the pain itself. This a &lt;a href="http://h20202.www2.hp.com/Hpsub/downloads/WhitePaper_Gartner_ThinClient_TCO.pdf"&gt;&lt;br /&gt;business case&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;If you have smart idea for a new business, guess what, you actually need two business cases. One for yourselves (are you going to make a profit?) and one for your customer (is the cost of your product less than their current pain?). &lt;br /&gt;&lt;br /&gt;Cost is probably the most obvious way businesses feel pain, but there are other hurts. Customer lossage, sloth, staff turnover, low reputation, legal assault, competitors, poor quality, it's all there. For each kind of pain there are armies of MBAs and consultants all willing to provide a fix, and often they can.&lt;br /&gt;&lt;br /&gt;The cure for many business ills are simply not derived from technology. Looking for an IT solution to a &lt;a href="http://www.lgreal.org/2005challenges.shtml"&gt;business problem&lt;/a&gt; before considering business solutions first just ain't right. A good IT product would attack something that has no common-sense business solution. Many IT 'solutions' aren't. Which creates another kind of business pain: &lt;a href="http://www.theregister.co.uk/2002/11/26/it_project_failure_is_rampant/"&gt;failed IT projects&lt;/a&gt;. Use your powers for good, not evil.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-111354186594573689?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/111354186594573689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=111354186594573689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111354186594573689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111354186594573689'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2005/04/dolor.html' title='Dolor'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-111345206967375205</id><published>2005-04-14T13:36:00.000+10:00</published><updated>2005-04-14T14:23:38.606+10:00</updated><title type='text'>Doh!</title><content type='html'>Out in the real world of business you will find that most people are not rocket scientists. Most of us are fighting a &lt;a href="http://www.isixsigma.com/library/content/c020128a.asp?%22"&gt;constant battle with idiocy&lt;/a&gt;, our own and our collegues. Myself, I am a signed up &lt;a href="http://www.dilbert.com/comics/dilbert/dnrc/html/newsletter60.html"&gt;Induhvidual&lt;/a&gt;. On a good day I achieve quite good competency in my work, but even on those days I might spill coffee on my shirt. &lt;br /&gt;&lt;br /&gt;There is an ebb and flow of competency vs idiocy in any large organisation. Over the years the result is not perfect. To quote &lt;a href="http://www.alaindebotton.com/consolations.htm"&gt;Alain De Botton&lt;/a&gt;: &lt;span style="font-style:italic;"&gt;"What is declared obvious and 'natural' rarely is so. Recognition of this should teach us to think that the world is more flexible than it seems, for the established views have frequently emerged not through faultless reasoning but through centuries of intellectual muddle. There may be no good reason for things to be the way they are."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So if you have just finished University don't expect things to work properly in the real world, or even rationally. Some business opportunities are simply about helping people do things better. Look around, you'll be amazed at what you find.&lt;br /&gt;&lt;br /&gt;:wq&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-111345206967375205?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/111345206967375205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=111345206967375205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111345206967375205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111345206967375205'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2005/04/doh.html' title='Doh!'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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-12006119.post-111292008802396058</id><published>2005-04-08T10:18:00.000+10:00</published><updated>2005-04-11T09:29:52.420+10:00</updated><title type='text'>DOH! DOLOR, DOLLAR</title><content type='html'>This blog is related to &lt;a href="http://www.paulgraham.com/"&gt;Paul Graham's&lt;/a&gt; essay &lt;a href="http://www.paulgraham.com/bronze.html"&gt;Why Smart people Have Bad Ideas&lt;/a&gt;. Essentially the academic life does not expose young smart hackers to the world of business so their business ideas are often unlikely to fulfill a need. &lt;br /&gt;&lt;br /&gt;This blog describes some of the recurring real-world problems I have personally experienced or have been told about. Sometimes I will make suggestions about how to solve these problems. Maybe some of these postings might produce a viable business model. Maybe not. It's up to you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12006119-111292008802396058?l=dohdolordollar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dohdolordollar.blogspot.com/feeds/111292008802396058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12006119&amp;postID=111292008802396058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111292008802396058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12006119/posts/default/111292008802396058'/><link rel='alternate' type='text/html' href='http://dohdolordollar.blogspot.com/2005/04/doh-dolor-dollar.html' title='DOH! DOLOR, DOLLAR'/><author><name>Bill Birch</name><uri>http://www.blogger.com/profile/02919063800972727859</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>
