<?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-8617984</id><updated>2012-01-04T18:36:10.033-05:00</updated><category term='packages'/><category term='off-topic'/><category term='soap'/><category term='plugin'/><category term='python'/><category term='software'/><category term='get post'/><category term='development'/><category term='orm'/><category term='art'/><category term='Apple'/><category term='post'/><category term='wordpress'/><title type='text'>Tales of a blog renamer</title><subtitle type='html'>My blog is orange for some reason</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default?start-index=101&amp;max-results=100'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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>132</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8617984.post-2105229072777517009</id><published>2011-06-05T20:55:00.000-04:00</published><updated>2011-06-05T20:55:15.578-04:00</updated><title type='text'>Version 2.0.0 of Wordpress get-post plugin</title><content type='html'>Well, after a couple of years I dusted it off and rewrote a lot of the guts. It's about a hundred times shinier. Download at&amp;nbsp;&lt;a href="http://wordpress.org/extend/plugins/get-post"&gt;http://wordpress.org/extend/plugins/get-post&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Source at&amp;nbsp;&lt;a href="https://github.com/jtatum/get-post"&gt;https://github.com/jtatum/get-post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-2105229072777517009?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/2105229072777517009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=2105229072777517009' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2105229072777517009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2105229072777517009'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2011/06/version-200-of-wordpress-get-post.html' title='Version 2.0.0 of Wordpress get-post plugin'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-5758889028393662167</id><published>2011-05-13T17:05:00.000-04:00</published><updated>2011-05-13T17:05:17.703-04:00</updated><title type='text'>How to test a proxy</title><content type='html'>echo test | nc -X connect -x proxy_host:port target_host target_port&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-5758889028393662167?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/5758889028393662167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=5758889028393662167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/5758889028393662167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/5758889028393662167'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2011/05/how-to-test-proxy.html' title='How to test a proxy'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-2137090883825301383</id><published>2011-05-10T16:32:00.000-04:00</published><updated>2011-05-10T16:32:48.231-04:00</updated><title type='text'>Belated announcement: First public release of PyATOM</title><content type='html'>The PyATOM team is proud to announce the initial release of PyATOM.&lt;br /&gt;&lt;br /&gt;About PyATOM:&lt;br /&gt;&lt;br /&gt;Short for Automated Testing on Mac, PyATOM is the first Python library to fully enable GUI testing of Macintosh applications via the Apple Accessibility API. This library was created out of desperation. Existing tools such as using appscript to send messages to accessibility objects are painful to write and slow to use. PyATOM has direct access to the API. It's fast and easy to use to write tests.&lt;br /&gt;&lt;br /&gt;Changes in this release:&lt;br /&gt;&lt;br /&gt;It's the first public release, so none yet!&lt;br /&gt;&lt;br /&gt;Special thanks:&lt;br /&gt;The VMware Fusion automation team&lt;br /&gt;Nagappan Alagappan and the LDTP team&lt;br /&gt;&lt;br /&gt;Download source:&lt;br /&gt;&lt;a href="https://github.com/pyatom/pyatom"&gt;https://github.com/pyatom/pyatom&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Documentation references:&lt;br /&gt;&lt;br /&gt;Documentation is still a work in progress. Read the README on the&lt;br /&gt;Github page for an introduction to PyATOM.&lt;br /&gt;&lt;br /&gt;Report bugs - &lt;a href="https://github.com/pyatom/pyatom/issues"&gt;https://github.com/pyatom/pyatom/issues&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To subscribe to PyATOM mailing lists, visit &lt;a href="http://lists.pyatom.com/"&gt;http://lists.pyatom.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IRC Channel - #pyatom on irc.freenode.net&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-2137090883825301383?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/2137090883825301383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=2137090883825301383' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2137090883825301383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2137090883825301383'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2011/05/belated-announcement-first-public.html' title='Belated announcement: First public release of PyATOM'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-4733109341976873348</id><published>2011-01-28T22:52:00.005-05:00</published><updated>2011-01-28T23:40:25.531-05:00</updated><title type='text'>Python exception madness - err, Python namespace madness</title><content type='html'>Riddle me this: What the heck?&lt;br /&gt;&lt;br /&gt;a.py:&lt;br /&gt;&lt;pre&gt;import b&lt;br /&gt;&lt;br /&gt;class MyException(Exception):&lt;br /&gt;   pass&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;   try:&lt;br /&gt;      b.evil()&lt;br /&gt;   except MyException:&lt;br /&gt;      print 'Caught my exception'&lt;br /&gt;   except Exception as e:&lt;br /&gt;      print 'Caught something else: ' + repr(type(e))&lt;/pre&gt;b.py:&lt;br /&gt;&lt;pre&gt;from a import MyException&lt;br /&gt;&lt;br /&gt;def evil():&lt;br /&gt;   print 'Raising my exception'&lt;br /&gt;   raise MyException('My exception')&lt;br /&gt;&lt;/pre&gt;Output:&lt;br /&gt;&lt;pre&gt;$ python a.py&lt;br /&gt;Raising my exception&lt;br /&gt;Caught something else:&lt;/pre&gt;&amp;lt;class 'a.myexception'&amp;gt;&lt;br /&gt;&lt;br /&gt;What?! Looks like an oddity of the Python namespace. Note the class being listed as 'a.myexception' - it's as though the imported exception class isn't being recognized as being equal to the class defined just a few lines above. If you put the exception class in c.py, it works.&lt;br /&gt;&lt;br /&gt;I'm guessing this is documented behavior of the package import mechanism... but it was certainly unexpected behavior to me.&lt;br /&gt;&lt;br /&gt;Edit:&lt;br /&gt;&lt;br /&gt;My good friend Rick suggested this was because of circular imports, but I suspected it was because a was both __main__ and a. So I did this:&lt;br /&gt;run.py:&lt;br /&gt;&lt;pre&gt;import a&lt;br /&gt;&lt;br /&gt;a.test()&lt;/pre&gt;a.py:&lt;br /&gt;&lt;pre&gt;import b&lt;br /&gt;&lt;br /&gt;class MyException(Exception):&lt;br /&gt;   pass&lt;br /&gt;&lt;br /&gt;def test():&lt;br /&gt;   try:&lt;br /&gt;      b.evil()&lt;br /&gt;   except MyException:&lt;br /&gt;      print 'Caught my exception'&lt;br /&gt;   except Exception as e:&lt;br /&gt;      print 'Caught something else: ' + repr(type(e))&lt;/pre&gt;b.py:&lt;br /&gt;&lt;pre&gt;import a&lt;br /&gt;&lt;br /&gt;def evil():&lt;br /&gt;   print 'Raising my exception'&lt;br /&gt;   raise a.MyException('My exception')&lt;/pre&gt;output:&lt;br /&gt;&lt;pre&gt;$ python run.py &lt;br /&gt;Raising my exception&lt;br /&gt;Caught my exception&lt;/pre&gt;To distill a lesson from all this, it's: don't put exception classes in any Python scripts run directly... Or maybe don't import a Python script that's run directly from another Python script.&lt;br /&gt;&lt;br /&gt;Rereading all this, I think in the first case that a might actually have been read in twice - once as __name__=='__main__' and once as __name__=='a'. In that case, it seems that __main__.MyException is not a.MyException - which leads to the exception handler failing. &lt;br /&gt;&lt;br /&gt;If this is one of the reasons people recommend against circular imports, I'm inclined to agree - I spent way too long troubleshooting a very vague issue that seemed like an interpreter bug at first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-4733109341976873348?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/4733109341976873348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=4733109341976873348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4733109341976873348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4733109341976873348'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2011/01/python-exception-madness.html' title='Python exception madness - err, Python namespace madness'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-6977564897315598408</id><published>2010-10-14T16:24:00.001-04:00</published><updated>2010-10-27T18:11:32.482-04:00</updated><title type='text'>James' guide to sshing through an http proxy</title><content type='html'>May you never need this guide.&lt;br /&gt;&lt;br /&gt;Preparing sshd on the server:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Edit /etc/ssh/sshd_config and add:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Port 443&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;service ssh reload&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Why port 443 (https)? https can't be truly proxied without subterfuge. Between the SSL protocol itself and the presumed good behavior of the CAs, your company or school proxy can't establish trusted https connections on your behalf. To overcome this, http proxies implement a command called CONNECT which establishes a pass-through connection between the client and the specified host. The operating theory is that the vast majority of http proxies are going to allow CONNECT to arbitrary hosts over port 443, or the web would be broken for most of their users. The proxy can't interfere with this traffic and hopefully they don't look at it too closely either, because ssh is distinguishable from ssl traffic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Client side (for testing):&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;There is a program out there called corkscrew but it isn't needed on an OS with a relatively thick GNU stack, like Linux or OS X. It needs to have nc, which is corkscrew on crack.&lt;/li&gt;&lt;li&gt;Try this: ssh -o ProxyCommand="nc -X connect -x &amp;lt;proxy host&amp;gt;:&amp;lt;proxy port&amp;gt; %h %p" -p 443 &amp;lt;user&amp;gt;@&amp;lt;ssh host&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If that works, awesome! Toss the ProxyCommand line in ~/.ssh/config. The Internets have some resources on doing this dynamically based on whether you're behind a proxy or not.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-6977564897315598408?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/6977564897315598408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=6977564897315598408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/6977564897315598408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/6977564897315598408'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2010/10/james-guide-to-sshing-through-http.html' title='James&apos; guide to sshing through an http proxy'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-7634241849401200411</id><published>2010-08-13T17:23:00.001-04:00</published><updated>2010-08-13T17:23:50.666-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packages'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python package pattern</title><content type='html'>I first saw this pattern in pyObjC, although I am sure it's implemented elsewhere. The basic idea is, if I have package a:&lt;br /&gt;&lt;br /&gt;a/&lt;br /&gt;&amp;nbsp;&amp;nbsp;__init__.py&lt;br /&gt;&amp;nbsp;&amp;nbsp;clsa.py&lt;br /&gt;&amp;nbsp;&amp;nbsp;clsb.py&lt;br /&gt;&lt;br /&gt;To get at the module in clsa.py, I'll import a.clsa. But what if you want to present a different interface for your package?&lt;br /&gt;&lt;br /&gt;Imports are like anything else. They wind up in the dictionary of the containing namespace. Import sys, then dir() - sys appears, as a module object. The same happens in modules themselves. Imports, like global variables, appear in the namespace of the module and so are accessible via the module object.&lt;br /&gt;&lt;br /&gt;As an example of this, try:&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import os&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; dir(os)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; os.sys&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print os.sys.version&lt;br /&gt;&lt;br /&gt;The os module imports sys, so we can actually access sys via os.sys. Python's importer is smart enough to give us two different references to the same object, rather than actually importing another copy of sys (if you already have sys imported).&lt;br /&gt;&lt;br /&gt;So what does this mean? Well, if you wanted to give the example package above a flatter view, you could edit __init__.py:&lt;br /&gt;from clsa import someclass&lt;br /&gt;import clsa&lt;br /&gt;import clsb&lt;br /&gt;&lt;br /&gt;With the above __init__.py, you'll have a package that works as follows:&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import a&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a.clsa.somefunc() # would traverse the clsa import in __init__.py&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; instance = a.someclass() # this uses the someclass import from clsa directly&lt;br /&gt;&lt;br /&gt;In larger packages, this allows you to expose interesting classes to the user while still keeping everything organized in separate modules.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-7634241849401200411?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/7634241849401200411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=7634241849401200411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7634241849401200411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7634241849401200411'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2010/08/python-package-pattern.html' title='Python package pattern'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-957057369134243515</id><published>2010-04-15T16:47:00.000-04:00</published><updated>2010-04-15T16:47:21.828-04:00</updated><title type='text'>Ubuntu Lucid and KVM</title><content type='html'>Holy cow, KVM is fast! In addition to the steps on the Wiki, install virt-manager for a GUI (and manually connect to Localhost rather than using that little pre-populated localhost connection). Here's the builder command line I used:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sudo ubuntu-vm-builder kvm karmic --arch 'i386'&amp;nbsp; --mem '512'&amp;nbsp; --rootsize '10000'&amp;nbsp; --swapsize '1024'&amp;nbsp; --kernel-flavour 'virtual'&amp;nbsp; --hostname 'karmic-virt'&amp;nbsp; --mirror 'http://us.archive.ubuntu.com/ubuntu'&amp;nbsp; --components 'main,universe'&amp;nbsp; --name 'James Tatum'&amp;nbsp; --user 'jtatum'&amp;nbsp; --pass 'jtatum'&amp;nbsp; --libvirt qemu:///system&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;This requires a bit of free space in /tmp to setup the chroot and do a debootstrap. Then, it creates the virtual disk in the current working directory. I can see why they don't recommend this for end users, as the tools are definitely rough around the edges but the speed is awesome. The best part about this setup is that it would be fairly easy to point the vm-builder to something like the current dev build of ubuntu and have it auto install something from a PPA or perform some other tasks to kick off some kind of automation. The whole thing is really automation friendly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-957057369134243515?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/957057369134243515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=957057369134243515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/957057369134243515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/957057369134243515'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2010/04/ubuntu-lucid-and-kvm.html' title='Ubuntu Lucid and KVM'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-5531864266942044937</id><published>2009-11-06T00:05:00.003-05:00</published><updated>2009-11-06T00:06:32.086-05:00</updated><title type='text'>Chit-chatting with dbus and the U1 SyncDaemon</title><content type='html'>I'm only putting this here because I don't know where else to put it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;dbus-send --print-reply --session --dest=com.ubuntuone.SyncDaemon --type=method_call /config com.ubuntuone.SyncDaemon.Config.bandwidth_throttling_enabled&amp;nbsp;&lt;/li&gt;&lt;li&gt;dbus-send --print-reply --session --dest=com.ubuntuone.SyncDaemon --type=method_call /config com.ubuntuone.SyncDaemon.Config.get_throttling_limits&lt;/li&gt;&lt;li&gt;dbus-send --print-reply --session --dest=com.ubuntuone.SyncDaemon --type=method_call /config com.ubuntuone.SyncDaemon.Config.set_throttling_limits int32:2031616 int:2031616&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-5531864266942044937?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/5531864266942044937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=5531864266942044937' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/5531864266942044937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/5531864266942044937'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2009/11/chit-chatting-with-dbus-and-u1.html' title='Chit-chatting with dbus and the U1 SyncDaemon'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-5784813586864991098</id><published>2009-10-02T14:39:00.000-04:00</published><updated>2009-10-02T14:39:03.355-04:00</updated><title type='text'>Stupid python tricks - list of paths from a file</title><content type='html'>Take a long, repetitive list of Windows filenames, like C:\TEMP\blah.txt, and return the unique pathnames from this list:&lt;br /&gt;&lt;pre&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import re&lt;br /&gt;&lt;br /&gt;results={}&lt;br /&gt;&lt;br /&gt;f = open('filelist.txt','r')&lt;br /&gt;for line in f:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m=re.search(r"(.:\\\S+)",line)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if m != None:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;path=m.group(0).rpartition('\\')&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;results[path[0]]=True&lt;br /&gt;&lt;br /&gt;pathlist=results.keys()&lt;br /&gt;pathlist.sort()&lt;br /&gt;for path in pathlist:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print path&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-5784813586864991098?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/5784813586864991098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=5784813586864991098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/5784813586864991098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/5784813586864991098'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2009/10/stupid-python-tricks-list-of-paths-from.html' title='Stupid python tricks - list of paths from a file'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-7820079634816788660</id><published>2009-09-29T10:12:00.000-04:00</published><updated>2009-09-29T10:12:24.854-04:00</updated><title type='text'>Using umdh to trace down Windows memory leaks</title><content type='html'>&lt;div&gt;&lt;ol&gt;&lt;li&gt;Install Windbg&lt;/li&gt;&lt;li&gt;set path="C:\Program Files\Debugging Tools for Windows (x64)";%path%&lt;/li&gt;&lt;li&gt;enable sysmtem stack trace - gflags -r +ust&lt;/li&gt;&lt;li&gt;md c:\websymbols&lt;/li&gt;&lt;li&gt;set symbols path - set _NT_SYMBOL_PATH=SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols;X:\Symbols\exe64ex&lt;/li&gt;&lt;li&gt;snap process memory - umdh -p:pid -f:output-1-file&lt;/li&gt;&lt;li&gt;snap process memory again - umdh -p:pid -f:output-2-file&lt;/li&gt;&lt;li&gt;compare two memory snap - umdh output-1-file output-2-file &amp;nbsp;-f:cmp.txt&lt;/li&gt;&lt;li&gt;cmp.txt should contain leak information.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-7820079634816788660?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/7820079634816788660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=7820079634816788660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7820079634816788660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7820079634816788660'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2009/09/using-umdh-to-trace-down-windows-memory.html' title='Using umdh to trace down Windows memory leaks'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-2954812169002354781</id><published>2009-09-09T18:15:00.005-04:00</published><updated>2009-09-09T20:40:28.759-04:00</updated><title type='text'>bazaar and launchpad</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;a href="https://edge.launchpad.net/~rockstar"&gt;Rockstar&lt;/a&gt; gave a &lt;a href="https://wiki.ubuntu.com/MeetingLogs/devweek0909/LP_CodeHosting"&gt;TOTALLY AWESOME presentation&lt;/a&gt; during Ubuntu Developer Week on bzr and lp integration. The takeaway is this:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Bazaar can mirror a remote hosted repo into a local centralized branch. It then uses this central branch as the starting point for derived branches, even when hosted remotely. So instead of:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;$ bzr branch lp:mago (downloads &amp;gt;1mb of crap)&lt;/div&gt;&lt;div&gt;$ bzr branch lp:~jtatum/mago/gconf (downloads &amp;gt;1mb of crap)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;You do some config and:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;$ bzr cbranch lp:mago (downloads &amp;gt;1mb of crap)&lt;/div&gt;&lt;div&gt;$ bzr cbranch lp:~jtatum/mago/gconf (downloads ~50kb of crap)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Magical!&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;~/.bazaar/bazaar.conf:&lt;br /&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;[ALIASES]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;cbranch = cbranch --lightweight&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;~/.bazaar/locations.conf:&lt;br /&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;[/home/jtatum/Projects]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;cbranch_target = /home/jtatum/Projects/repos &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;cbranch_target:policy = appendpath&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;[/home/jtatum/Projects/repos]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;push_location = lp:~jtatum &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;push_location:policy = appendpath &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;public_branch = lp:~jtatum &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;span style="font-family: 'courier new';"&gt;&lt;span style="font-size: medium;"&gt;public_branch:policy = appendpath&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;$ mkdir ~/Projects/repos/mago&lt;/div&gt;&lt;div&gt;$ cd ~/Projects/repos/mago&lt;/div&gt;&lt;div&gt;$ bzr init-repo --no-trees .&lt;/div&gt;&lt;div&gt;$ mkdir ~/Projects/mago&lt;/div&gt;&lt;div&gt;$ bzr cbranch lp:mago&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Then, pull down a branch:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;$ bzr cbranch lp:~who/mago/whatever&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Or make a new one:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;$ bzr cbranch mago myawesomecode&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Push works magically thanks to the shorthand in location.conf. Neato!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-2954812169002354781?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/2954812169002354781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=2954812169002354781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2954812169002354781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2954812169002354781'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2009/09/bazaar-and-launchpad.html' title='bazaar and launchpad'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-3456860337672730515</id><published>2009-08-26T10:31:00.003-04:00</published><updated>2009-08-26T10:49:56.871-04:00</updated><title type='text'>Embrace and extend</title><content type='html'>There are a bunch of posts on the Internet about how ISA does not do transparent proxying. As I've always used the term, I mean using something like iptables to redirect web traffic to a proxy like squid, ninja style. When done correctly, computers require no extra configuration - the machine performing NAT silently rewrites the destination address to the proxy, the proxy uses request headers to determine the correct host.&lt;br /&gt;&lt;br /&gt;Well, it seems ISA does support this. They call NAT clients without any additional proxy configuration SecureNAT clients, and according to &lt;a href="http://msdn.microsoft.com/en-us/library/aa503379.aspx"&gt;this article&lt;/a&gt;, the firewall can be configured to redirect outbound web traffic to the IIS proxy. SecureNAT... Because it's magically better than regular NAT with transparent proxying, right?&lt;br /&gt;&lt;br /&gt;In happier news, I started on a mago test suite for gcalctool. My branch is &lt;a href="https://code.edge.launchpad.net/~jtatum/mago/gcalctool"&gt;here&lt;/a&gt;. It's a work in progress but I am pretty happy with the results so far. I'm getting more and more certain about what goes where in the Mago testing paradigm. LDTP is dead simple, although the documentation is really a sore point. I definitely plan to contribute to the docs when I know what I'm doing.&lt;br /&gt;&lt;br /&gt;TODO:&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Readme&lt;/li&gt;&lt;li&gt;Math tests&lt;/li&gt;&lt;li&gt;Figure out the right place for init in a test suite&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-3456860337672730515?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/3456860337672730515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=3456860337672730515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/3456860337672730515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/3456860337672730515'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2009/08/embrace-and-extend.html' title='Embrace and extend'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-7063705526929520460</id><published>2009-03-23T23:00:00.003-04:00</published><updated>2009-03-23T23:17:21.598-04:00</updated><title type='text'>REST web service client in C#</title><content type='html'>I started writing a new web service at work. I've read a lot about REST and many of the principles resonated with me, so figured I'd give it a spin. It's amazing how little code there is out there. I found one very young view/controller framework for PHP. I found a couple of blog posts for C#.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This code will work with .NET 2.0. 3.5 and WCF may have some new methods for doing this, but it's shocking how little code there is out there for dealing with REST even today. Hopefully this helps someone. I'm putting it out as public domain but if you use it, it would be nice if you'd throw me a comment.&lt;/div&gt;&lt;!--&lt;br /&gt;{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;\red163\green21\blue21;\red0\green128\blue0;}??\fs20 \cf1 using\cf0  System;\par ??\cf1 using\cf0  System.Collections.Generic;\par ??\cf1 using\cf0  System.Text;\par ??\cf1 using\cf0  System.Net;\par ??\cf1 using\cf0  System.IO;\par ??\cf1 using\cf0  System.Web;\par ??\par ??\cf1 class\cf0  \cf4 Simple_REST\par ??\cf0 \{\par ??    \cf1 public\cf0  \cf1 static\cf0  \cf1 string\cf0  Get_URI(\cf1 string\cf0  uri)\par ??    \{\par ??        \cf4 HttpWebRequest\cf0  req = (\cf4 HttpWebRequest\cf0 )\cf4 WebRequest\cf0 .Create(uri);\par ??        \cf4 HttpWebResponse\cf0  response = (\cf4 HttpWebResponse\cf0 )req.GetResponse();\par ??        \cf4 Stream\cf0  responseStream = response.GetResponseStream();\par ??        \cf4 StreamReader\cf0  reader = \cf1 new\cf0  \cf4 StreamReader\cf0 (responseStream);\par ??\par ??        \cf1 string\cf0  responseString = reader.ReadToEnd();\par ??\par ??        reader.Close();\par ??        responseStream.Close();\par ??        response.Close();\par ??\par ??        \cf1 return\cf0  responseString;\par ??    \}\par ??    \cf1 public\cf0  \cf1 static\cf0  \cf1 string\cf0  Post_URI(\cf1 string\cf0  uri, \cf4 Dictionary\cf0 &amp;lt;\cf1 string\cf0 , \cf1 string\cf0 &amp;gt; postDataDictionary)\par ??    \{\par ??        \cf1 string\cf0  postData = \cf5 ""\cf0 ;\par ??        \cf1 foreach\cf0  (\cf4 KeyValuePair\cf0 &amp;lt;\cf1 string\cf0 , \cf1 string\cf0 &amp;gt; kvp \cf1 in\cf0  postDataDictionary)\par ??        \{\par ??            postData += \cf1 string\cf0 .Format(\cf5 "\{0\}=\{1\}&amp;amp;"\cf0 , \cf4 HttpUtility\cf0 .UrlEncode(kvp.Key), \cf4 HttpUtility\cf0 .UrlEncode(kvp.Value));\par ??        \}\par ??        postData = postData.Remove(postData.Length - 1); \cf6 // remove the trailing ampersand\par ??\par ??\cf0         \cf4 HttpWebRequest\cf0  req = (\cf4 HttpWebRequest\cf0 )\cf4 WebRequest\cf0 .Create(uri);\par ??        req.Method = \cf5 "POST"\cf0 ;\par ??        \cf1 byte\cf0 [] postArray = \cf4 Encoding\cf0 .UTF8.GetBytes(postData);\par ??        req.ContentType = \cf5 "application/x-www-form-urlencoded"\cf0 ;\par ??        req.ContentLength = postArray.Length;\par ??\par ??        \cf4 Stream\cf0  dataStream = req.GetRequestStream();\par ??        dataStream.Write(postArray, 0, postArray.Length);\par ??        dataStream.Close();\par ??\par ??        \cf4 HttpWebResponse\cf0  response = (\cf4 HttpWebResponse\cf0 )req.GetResponse();\par ??        \cf4 Stream\cf0  responseStream = response.GetResponseStream();\par ??        \cf4 StreamReader\cf0  reader = \cf1 new\cf0  \cf4 StreamReader\cf0 (responseStream);\par ??\par ??        \cf1 string\cf0  responseString = reader.ReadToEnd();\par ??\par ??        reader.Close();\par ??        responseStream.Close();\par ??        response.Close();\par ??\par ??        \cf1 return\cf0  responseString;\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Text;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Net;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.IO;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Web;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Simple_REST&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Get_URI(&lt;span style="color: blue;"&gt;string&lt;/span&gt; uri)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;HttpWebRequest&lt;/span&gt; req = (&lt;span style="color: #2b91af;"&gt;HttpWebRequest&lt;/span&gt;)&lt;span style="color: #2b91af;"&gt;WebRequest&lt;/span&gt;.Create(uri);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;HttpWebResponse&lt;/span&gt; response = (&lt;span style="color: #2b91af;"&gt;HttpWebResponse&lt;/span&gt;)req.GetResponse();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Stream&lt;/span&gt; responseStream = response.GetResponseStream();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StreamReader&lt;/span&gt; reader = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StreamReader&lt;/span&gt;(responseStream);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; responseString = reader.ReadToEnd();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; responseStream.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; responseString;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Post_URI(&lt;span style="color: blue;"&gt;string&lt;/span&gt; uri, &lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; postDataDictionary)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; postData = &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;gt; kvp &lt;span style="color: blue;"&gt;in&lt;/span&gt; postDataDictionary)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; postData += &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0}={1}&amp;amp;"&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlEncode(kvp.Key), &lt;span style="color: #2b91af;"&gt;HttpUtility&lt;/span&gt;.UrlEncode(kvp.Value));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; postData = postData.Remove(postData.Length - 1); &lt;span style="color: green;"&gt;// remove the trailing ampersand&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;HttpWebRequest&lt;/span&gt; req = (&lt;span style="color: #2b91af;"&gt;HttpWebRequest&lt;/span&gt;)&lt;span style="color: #2b91af;"&gt;WebRequest&lt;/span&gt;.Create(uri);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; req.Method = &lt;span style="color: #a31515;"&gt;"POST"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;byte&lt;/span&gt;[] postArray = &lt;span style="color: #2b91af;"&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(postData);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; req.ContentType = &lt;span style="color: #a31515;"&gt;"application/x-www-form-urlencoded"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; req.ContentLength = postArray.Length;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Stream&lt;/span&gt; dataStream = req.GetRequestStream();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dataStream.Write(postArray, 0, postArray.Length);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dataStream.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;HttpWebResponse&lt;/span&gt; response = (&lt;span style="color: #2b91af;"&gt;HttpWebResponse&lt;/span&gt;)req.GetResponse();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Stream&lt;/span&gt; responseStream = response.GetResponseStream();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;StreamReader&lt;/span&gt; reader = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;StreamReader&lt;/span&gt;(responseStream);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;string&lt;/span&gt; responseString = reader.ReadToEnd();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; responseStream.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; responseString;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-7063705526929520460?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/7063705526929520460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=7063705526929520460' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7063705526929520460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7063705526929520460'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2009/03/rest-web-service-client-in-c.html' title='REST web service client in C#'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-2374394486177427165</id><published>2008-11-25T17:45:00.002-05:00</published><updated>2008-11-25T17:47:35.548-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wordpress'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='get post'/><title type='text'>Wordpress plugin: Get Post</title><content type='html'>I finished one of the small coding projects I was working on. Well, finished it enough for a release. The results are viewable here:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://wordpress.org/extend/plugins/get-post/"&gt;http://wordpress.org/extend/plugins/get-post/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Get Post is a plugin that adds a tag to wordpress: [get-post]. This tag allows you to display the latest post with a given tag in another post or a page.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-2374394486177427165?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/2374394486177427165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=2374394486177427165' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2374394486177427165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/2374394486177427165'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2008/11/wordpress-plugin-get-post.html' title='Wordpress plugin: Get Post'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8617984.post-7977452666172350405</id><published>2008-11-05T15:34:00.003-05:00</published><updated>2008-11-05T15:55:39.417-05:00</updated><title type='text'>Windows command line special characters</title><content type='html'>If, at some point, you find it necessary to pass untrusted user input along in the command line, here is my list of special characters on the MS-DOS command line. This list comes from &lt;a href="http://www.robvanderwoude.com/escapechars.html"&gt;http://www.robvanderwoude.com/escapechars.html&lt;/a&gt;. (I also enjoyed his &lt;a href="http://www.robvanderwoude.com/useless.html"&gt;useless tips&lt;/a&gt; page. That's entertainment.)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Redirection: &lt;&gt;|&lt;/div&gt;&lt;div&gt;Quotes: "&lt;/div&gt;&lt;div&gt;Escape character: ^&lt;/div&gt;&lt;div&gt;Whitespace: (space) (carriage returns and linefeeds)&lt;/div&gt;&lt;div&gt;Conditionals: |&amp;amp;&lt;/div&gt;&lt;div&gt;Parameters: / (not inherent but many command line apps parse for this)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quite a long list. Trying to sanitize a command line is a horrible idea, especially for security so it's best avoided but sometimes it's not an option.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-7977452666172350405?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/7977452666172350405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=7977452666172350405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7977452666172350405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7977452666172350405'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2008/11/windows-command-line-special-characters.html' title='Windows command line special characters'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-4910568924581273237</id><published>2008-01-25T13:27:00.000-05:00</published><updated>2008-01-25T13:37:16.195-05:00</updated><title type='text'>Stupid PL/SQL tricks</title><content type='html'>I needed to load a a few gigs of test data into an Oracle tablespace.  Sadly there really aren't any tools for the task.  I created a simple table with two columns: id (integer, which apparently is an alias for number(38)) and data (char(512)).  PL/SQL code blocks are a little bit more formal than most SQL variants:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;DECLARE&lt;br /&gt; i NUMBER;&lt;br /&gt;BEGIN&lt;br /&gt; for i in 1..10000000 loop&lt;br /&gt;   insert into sys.t1 values(i,'ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ');&lt;br /&gt; end loop;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Other notes: Every user has a schema.  Users are granted permissions to create objects in tablespaces via quotas (although most god roles bypass quota checks). To see if archive logs are enabled, use ARCHIVE LOG LIST;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-4910568924581273237?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/4910568924581273237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=4910568924581273237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4910568924581273237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4910568924581273237'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2008/01/stupid-plsql-tricks.html' title='Stupid PL/SQL tricks'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-8760349140586281409</id><published>2008-01-21T17:54:00.000-05:00</published><updated>2008-01-21T18:04:28.777-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off-topic'/><title type='text'>OT: Rock band</title><content type='html'>Just a quick off-topic note: if you are serious about Guitar Hero or Rock Band, my friend Mike is running a blog about it.  He has worked really hard on this blog and the content so check it out and add the feed to your reader if you want an easy way to keep up with the latest simulated rock-n-roll news (I am a very occasional contributer there as well):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rockgamer.com/"&gt;http://www.rockgamer.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-8760349140586281409?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/8760349140586281409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=8760349140586281409' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/8760349140586281409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/8760349140586281409'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2008/01/ot-rock-band.html' title='OT: Rock band'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-4728736665120934996</id><published>2008-01-21T17:38:00.000-05:00</published><updated>2008-01-21T17:48:51.788-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='post'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><title type='text'>The art of software development</title><content type='html'>A team in our company recently created a new API to integrate with a legacy system.  The technology behind this new API?  HTTP POST, no SOAP or anything fancy.  This worked out real well for me since we don't use this legacy system except in the most cursory and peripheral way, so I only needed the barest of interface.  In fact, we derived a lot of benefit just by creating a two field form (with the rest of the data in hidden fields) to this application.&lt;br /&gt;&lt;br /&gt;I talked to the application's developer about the interface.  I asked him (with as much diplomacy as possible) if HTTP POST was his first choice of interfaces.  Personally I would have used SOAP for this one.  POST is OK but for two issues - first, you can't give an array of values as parameters with POST.  Instead, you have fields like TITLE1, ABSTRACT1, CATEGORY1, etc etc etc.  Second, there is no meaningful, machine readable way to send data back to the caller.  You wind up assuming that a person is going to be the ultimate consumer of whatever result or error message this API spits out.  What he said to me has been spinning around in my mind for a while.  &lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;"The art of software development is the art of compromise."&lt;/blockquote&gt;&lt;/span&gt;  What a true quote, thank you &lt;span style="font-weight:bold;"&gt;Ryan H.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I write this as I am neck deep in a side project involving a SOAP interface to an ORM managed database.  I've been procrastinating on this project.  I am avoiding writing the hibernate XML descriptors for the structure.  I have the DB created in MSSQL from visio diagrams, but hand crafting all this XML from the structure of about 30 tables....  ugh.  Hopefully I'll get to it in the next week or so but I've put it off for nearly a month so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-4728736665120934996?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/4728736665120934996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=4728736665120934996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4728736665120934996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4728736665120934996'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2008/01/art-of-software-development.html' title='The art of software development'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-7437445461621926380</id><published>2007-09-24T23:39:00.000-04:00</published><updated>2007-09-25T10:31:43.075-04:00</updated><title type='text'>HD Radio, Mark Mothersbaugh, BarCamp notes to come</title><content type='html'>I have been fascinated from a distance with HD Radio.  The rare opportunities I have to hear terrestrial radio have exposed me to the industry's advertisements for this new service.  Receivers are rare - if there are more than 5 (excluding car sets, or maybe even including them), I would be surprised.  The ones that exist are $400, keeping my curiosity only in the realm of reading about them every now and then.  That is, until last week.  I happened into the Best Buy in Sanford and sure enough, they had an HD radio setup with an antenna.  So I figured out the menu system and did a scan.  How many HD stations would you guess Orlando has?  10?  Lower.  5?  Lower.  The correct answer is 2.  2 stations, not including the ones that I heard the ad on.  Given that not all area stations here put out RDS, I suppose I am not surprised.  Good luck to ye, terrestrial radio.  Full disclosure: I am a subscriber and shareholder of Sirius satellite radio.&lt;br /&gt;&lt;br /&gt;Can I just say that I am smitten with the Mark Mothersbaugh tracks from the soundtrack to "The Life Aquatic With Steve Zissou."  Aside from the Devo cut, he has four tracks, and three of them are aces.  Ping Island is, of course, fantastic.  I am also a real fan of "Let Me Tell You About My Boat."  It is a cut that is bursting with hope and pride, emotions which were hidden brilliantly in the subtext of Bill Murray's character.  I love that scene in the movie for the song and for the visual.  Growing up, I had a poster in my room of Jacques Cousteau's research vessel, the Calypso.  It was a cutaway blueprint of the ship which I spent many hours scrutinizing.  Whether intentional or not, Wes Anderson recreated that poster for me brilliantly in this scene.  It was an emotional moment for me.&lt;br /&gt;&lt;br /&gt;I attended BarCamp Orlando - a great event.  I will post my notes on that shortly.  I am enlightened.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-7437445461621926380?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/7437445461621926380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=7437445461621926380' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7437445461621926380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/7437445461621926380'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2007/09/i-have-been-fascinated-from-distance.html' title='HD Radio, Mark Mothersbaugh, BarCamp notes to come'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-4442921808413405019</id><published>2007-05-03T00:13:00.000-04:00</published><updated>2007-05-03T00:23:45.251-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>New home compruter</title><content type='html'>A new iMac recently arrived.  I have had an on and off again relationship with Apple products.  Actually I've only personally owned two other Macs - a Bondi Blue iMac and a PowerBook 520 (not a 520c).  Mom had a PowerMac 6300 also, back in the pre-"G" days.&lt;br /&gt;&lt;br /&gt;Anyway, it all started innocently enough.  I was working on a video presentation at work.  I have a Mini on my desk (for.. uh.. testing purposes, of course, not just iTunes).  It occurred to me that I needed to take a look at the movie capabilities built in to the mini.  I was completely blown away by the free iMovie.  I have done some NLE before (old school premier and Ulead's rubbish).  iMovie blew all of that out of the water.  I wish I could YouTube this video since it's a little bit funny.&lt;br /&gt;&lt;br /&gt;ANYWAY...  I looked at the online Apple store for a while, then went down to the Apple Store at Millenia, then looked online some more, then compared prices of my company discount vs. my school discount (school is better)...  Finally wound up getting a 24" refurb.  The warranty is the same on refurbs as new, and I was able to extend it for the same price as new (I was going to extend the warranty anyway).  It was a no-brainer.  Let me just say this right now.  Apple or no, if you have the means, go out and get a 24" widescreen monitor for your computer.  It is almost overwhelming to see the desktop take up so much of your view.  I have a totally different posture with this system (leaning back, more comfortable) than with the 19" standard LCD I was using before.  This isn't supposed to be my primary system, but come on...  it's new and shiny.&lt;br /&gt;&lt;br /&gt;ANYWAY: Also bought Final Cut Express HD 3.5.  Played with GarageBand and Soundtrack (comes with FCE) last night - sweet.  I really haven't felt this creative since I was a kid.  Now I have to get out there and start shooting video.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-4442921808413405019?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/4442921808413405019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=4442921808413405019' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4442921808413405019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4442921808413405019'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2007/05/new-home-compruter.html' title='New home compruter'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-6381693235016571980</id><published>2007-04-25T01:38:00.000-04:00</published><updated>2007-04-25T02:11:25.330-04:00</updated><title type='text'>The Blogocycle and Jamie's Hierarchy of Fortunes</title><content type='html'>What is it about blogs that make them so cyclical?  Are there any psychological phenomenon that explain it?&lt;br /&gt;&lt;br /&gt;I am a passionate person, and when something catches my interest I am a great evangelist.  Blogs almost fit my normal pattern of interest - Learn -&gt; Research -&gt; Do -&gt; Decline -&gt; Ignore.  The only thing is that I do come back after the "Ignore" phase eventually.  Odd...  Irrelevant trivia: my first blog post ever was on June 12th, 2003.&lt;br /&gt;&lt;br /&gt;More irrelevant trivia: I am the official creator of the hierarchy of fortunes (of the cookie variety).  Let me explain:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tier 1 - Information&lt;/span&gt;&lt;br /&gt;This tier lies at the base of the pyramid of fortune cookies.  It is by far the most common type of fortune and particularly irritating to me.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A smile is your personal welcome mat&lt;/li&gt;&lt;li&gt;Your emotional nature is strong&lt;/li&gt;&lt;li&gt;Everyone agrees you are the best&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You are not illiterate&lt;/li&gt;&lt;/ul&gt;As you can see, the information tier contains fortunes that tell you things...  but nothing that you really need to know.  If you need to know information about virtually anything, I would suggest a well-formed Google or Wikipedia search as a good starting point, and then a visit to the local library's reference desk for more information.  Another theme in this category is to give you information about your personality or other attributes.  In any case, I question the credibility and value of any source that contains high fructose corn syrup.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tier 2 - Advice&lt;/span&gt;&lt;br /&gt;Wondering how to live your life?  Fortunes are happy to tell you in this tier.  The middle tier is only slightly less prevalent than tier 1, meaning that advice fortunes are also relatively common in the grand scheme of things.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You will obtain your goal if you stay the course&lt;/li&gt;&lt;li&gt;Avoid taking unnecessary gambles&lt;/li&gt;&lt;li&gt;Trust your intuition - the universe is guiding your life&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Don't kiss an elephant on the lips today&lt;/li&gt;&lt;/ul&gt;Thanks cookie!  Now I don't need to buy that self-help book!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tier 3 - Prediction&lt;/span&gt;&lt;br /&gt;I don't know about you, but this is the type of fortune I most closely associate with the cookie.  Ironic, then, that this tier is the rarest of all types of fortunes!  Getting a tier 3 fortune is worthy of celebration, and if you are playing my drinking game you must take at least 5 shots if you get one of these.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You may attend a party where strange customs prevail&lt;/li&gt;&lt;li&gt;You will soon be more aware of your growing awareness&lt;/li&gt;&lt;li&gt;You are going to have some new clothes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You will die today (I saw this one in an episode of the twilight zone I think)&lt;/li&gt;&lt;/ul&gt;Hope this guide has helped you identify that fortune.  I was going to mock it up in Visio but I'm a lazy bastard.  Fortunes courtesy of &lt;a href="http://weirdfortunecookies.com/"&gt;weirdfortunecookies.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-6381693235016571980?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/6381693235016571980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=6381693235016571980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/6381693235016571980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/6381693235016571980'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2007/04/blogocycle-and-jamies-hierarchy-of.html' title='The Blogocycle and Jamie&apos;s Hierarchy of Fortunes'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-794918860407049975</id><published>2007-04-18T13:14:00.000-04:00</published><updated>2007-04-18T13:27:58.081-04:00</updated><title type='text'>Shameful plug</title><content type='html'>Can I just take a moment to recommend the Google Pack? This handy tool&lt;br /&gt;is something I use every time I setup a new PC. It has versions of&lt;br /&gt;common software you need to browse the net (like Adobe reader andFirefox), and some optional goodies like Skype, RealPlayer and Google Earth. If all it did was install those, I wouldn't make a big deal but the awesome part is that it has an unintrusive updater that takes care of keeping those programs up to date. If you are like me, the RealPlayer and Adobe updaters are your nemesis. Google Pack takes the pain away.&lt;br /&gt;&lt;br /&gt;Full disclosure: I may get a small pittance if you click a Google Pack link on this page.&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;!-- google_ad_client = "pub-3052364133607405"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as_rimg"; google_cpa_choice = "CAAQ2M6kgwIaCB6v4uodbkYGKPC34IEB"; google_ad_channel = ""; //--&gt; &lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-794918860407049975?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/794918860407049975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=794918860407049975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/794918860407049975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/794918860407049975'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2007/04/shameful-plug.html' title='Shameful plug'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-4897909877075912469</id><published>2007-04-16T21:53:00.000-04:00</published><updated>2007-04-16T22:01:34.526-04:00</updated><title type='text'>Current status</title><content type='html'>I am hungry, thirsty, tired, and I have to go to the bathroom.  If this is the Sims, I will die very soon (probably after some despot builds walls around the pool).&lt;br /&gt;&lt;br /&gt;I am so busy at work that posting here is completely irresponsible (but I need the time off).  Here's the scoop.  I have a slightly different job under a somewhat different management structure.  That's about all the detail I have right now.  EXCEPT that I have to do a bunch of crap for my old job first and then I already have a queue of stuff waiting at my new job.  AND they gave me this project to make a video, which was pretty fun (if very time consuming) and then all this criticism about how I need to change this and that, so those changes are in process.  I feel beaten up. &lt;br /&gt;&lt;br /&gt;Here's my computer lesson of the day: VMRUN.EXE cannot be run from inside a guest with 100% reliability.  I'm using vmrun revertToSnapshot to have the guest revert it's own snapshot.  Apparently this is not a supported use case.  I am going to need to bug my contacts at VMware (which, surprisingly is rather a lot, I did well at networking over there) to find out how to submit this as an enhancement request.  Meanwhiles, I had to build a very rudimentary client/server architecture to have the guests send in a revert "request" to a controller that stays online.&lt;br /&gt;&lt;br /&gt;You know, this use case seems to have escaped VMware fairly completely since I can name several operations where it would be handy for the guest to have a little more sense.  I know that some people are using VMware in situations where guest knowledge of the virtualized environment is considered a vulnerability, but for software QA, this is far from the case.  If my guests could get some information about the hosts, it would simplify what I do quite a bit.  For instance, if there was some way to query the VM Tools about, say, the name or path of the guest, then I could write some generalized code to snapshot and revert the guests with minimal user configuration.  As things stand now, it feels like a total hack the way I have to do this stuff.  ANYWAY...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-4897909877075912469?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/4897909877075912469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=4897909877075912469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4897909877075912469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/4897909877075912469'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2007/04/current-status.html' title='Current status'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-115630964523068680</id><published>2006-08-23T00:12:00.000-04:00</published><updated>2006-08-23T01:11:45.700-04:00</updated><title type='text'>Mutating ITIL for ISVs and hardware manufacturers</title><content type='html'>&lt;span style="font-size:100%;"&gt;In a &lt;a href="http://thelightness.blogspot.com/2006/07/shuttle-sn25p-and-faulty-sata.html"&gt;previous post&lt;/a&gt;, I talked a little bit about ITIL could help an organization like Shuttle identify and resolve widespread issues that they may not find out about within the confines of traditional technical support.  I want to expand on a few concepts.  ITIL is a big standard.  For now, I am focusing on a small subset - incident and problem tracking.&lt;br /&gt;&lt;br /&gt;The basic concept is that every customer call is at least one incident (or case).  Every incident is associated with a problem.  In a theoretical model where we assume  perfect knowledge, a problem would contain complete information about the error messages, other symptoms, associated defects, and resolution.&lt;br /&gt;&lt;br /&gt;A few mutations occur to me right off the bat.  First of all, at a large ISV, the support team for a major product can have up to five levels and hundreds of reps.  All of these reps must be able to create and update problem IDs.  The problem tracking (on top of the already standard incident tracking) cannot seriously impact the time needed to handle a call; both for economic reasons and compliance - a tech will not properly use a system that takes extra time out of their day.&lt;br /&gt;&lt;br /&gt;So, the first hurdle is adding problem tracking to incident tracking systems.  The most obvious solution would be to use a knowledge management or defect tracking system to handle this.  Subsequently, only a minor modification to the incident tracking system would be needed.  The time consuming factor may come into play here.  How long will it take a tech to find a problem ID for a case?  How long to create?  Maybe most importantly, how long to update an existing problem?  Finally, does everyone have rights to quickly update a problem?&lt;br /&gt;&lt;br /&gt;I can give you a couple of pitfalls to watch out for when considering these existing systems.  Knowledge management systems in a large organization are formal beasts.  My company, for instance, requires every article (internal or external) to follow a three level approval process for publishing.  There is a strict ownership chain which prevents others from modifying an article which you have checked out.  Defect tracking systems may meet more requirements than a knowledge base.  They generally allow multiple people to work on a defect.  Both types of systems can be slow and rarely are they tightly integrated into the incident management system.&lt;br /&gt;&lt;br /&gt;The requirements become more complex when you change from the perfect information model to a realistic model.  When a customer calls in, it may be easy to identify an existing problem, or the problem may not be identifiable on the first call.  In another scenario, maybe the product just shipped a new version and customers are calling in with crashes or a specific error message.  So, the first time a customer gets an "incompatible version" error, for instance, the workflow should be something like this:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Tech enters in basic information - product, version, OS&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Tech initiates search for "incompatible version"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Problem system searches within entered parameters and returns no results&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Tech enters in what he knows - at this point, just the error - and a new problem is created.  In a tightly bound system, a lot of data should come from the case, such as product versions and other configuration data.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;Move a week down the road and there are 25 cases associated with this problem ID.  As things move on, it becomes clear that this error has multiple causes.  In this case, the problem ID should be split into multiple problem IDs.  The old ID could be retired and not applicable to new cases.  Other management tasks need to be performed, such as marking a problem ID as a duplicate.  To me, all this sounds like some kind of franken-wiki.  Anyone should be able to open a problem, click edit, and type in their observations about the issue or add data (and remove outdated information).&lt;br /&gt;&lt;br /&gt;The best investment a company can make into a problem tracking system is search.  This is extremely hard to get right.  Technical support searches are not normal searches.  The search engine must be able to handle a search for "file not found", "18345926", or "*.*", and all of these queries should be treated literally.  This means minimizing noisewords and considering punctuation in the query.  Don't dare introduce a search engine that uses "or" by default since you aren't guaranteed to have technicians that know when to use and, or, or exact phrase.  There are easy ways to improve search efficiency in the context of a problem tracking system.  Relevancy can be determined in a few ways - first, is the problem "fresh", meaning, have cases been associated with it recently?  How closely does the configuration data from the current incident match the problem?  Is the problem still open and not a dupe or split?  If I search for incompatible version, I would want the first result to be a problem "hit" in the last week by a customer using the same product version and OS as my customer is.  Each relevancy point could be indicated graphically - perhaps 1-5 stars for freshness, configuration, product version, etc.&lt;br /&gt;&lt;br /&gt;There are a lot of benefits that can be realized if such a system is tightly bound to the incident tracking system.  For instance, at the point where 25 incidents are associated with a problem, there is a lot of data we can gain about the problem just from the natural relationship.  What operating systems does the problem tend to affect?  Does it typically affect large or small customers?  How about new or inexperienced users?  Has the problem existed in more than one version of the product?&lt;br /&gt;&lt;br /&gt;On the macro scale, organizations should mine the heck out of these problem reports.  Usability teams, developers and QA should all know exactly what the top 10% of the problems are and should be thinking about how to develop and test around them.  In my experience, this already happens, but in a much less formal way.  Companies develop and test around less concrete metrics, such as the top knowledge base article, or most referenced defect or error message.  The ISV I work for analyzes the knowledge base search queries to find patterns.  These techniques are all surrogates for real problem tracking.&lt;br /&gt;&lt;br /&gt;Remedy has been a big proponent of ITIL for a long time, and their &lt;a href="http://www.bmc.com/products/proddocview/0,2832,19052_19429_22743834_121272,00.html"&gt;service desk product&lt;/a&gt; is billed as "an incident and problem automated workflow solution".  My complaint about Remedy (and ITIL, for that matter) is that it is tailored to the much larger in-house help desk market.  While ISV technical support has similar needs, the needs of the in-house help desk will always win with Remedy because that is where the vast majority of their money comes from.  I haven't seen how their solution handles problems.  Do you have any experience with Remedy?  Have a problem with this idea?  Comment below and we'll talk about it.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-115630964523068680?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/115630964523068680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=115630964523068680' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115630964523068680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115630964523068680'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/08/mutating-itil-for-isvs-and-hardware.html' title='Mutating ITIL for ISVs and hardware manufacturers'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-115556646189348900</id><published>2006-08-14T10:36:00.000-04:00</published><updated>2006-08-14T10:41:01.893-04:00</updated><title type='text'>Redirect a port on Linux</title><content type='html'>Randomly I had a need to redirect a request from the local LAN to another machine on the local LAN.  Don't ask...  Actually this would also come in handy for, for instance, services which can only be configured to listen on 127.0.0.1 (such as SSH dynamic port forwarding) that you want to export to the world at large.  If there is an easy way to do this with IPTables, I can't find it (I'm not acting as a gateway to any systems so rules in the FORWARD chain don't count).  A userspace util, rinetd, will accept connections on port A and send them to IP and port B.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-115556646189348900?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/115556646189348900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=115556646189348900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115556646189348900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115556646189348900'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/08/redirect-port-on-linux.html' title='Redirect a port on Linux'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-115556598715202346</id><published>2006-08-14T10:28:00.000-04:00</published><updated>2006-08-14T10:33:07.166-04:00</updated><title type='text'>Phishing vigilante?</title><content type='html'>Received an email today from what seems to be a phishing vigilante.  Google has no results for it.  Interesting.  Note the link and link's target.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;X-Gmail-Received: ffd7a329f43426f6e21c05d6f0a330c02fbe4c1e&lt;br /&gt;Delivered-To: my address@gmail.com&lt;br /&gt;Received: by 10.70.37.13 with SMTP id k13cs309860wxk;&lt;br /&gt;     Sun, 13 Aug 2006 16:13:39 -0700 (PDT)&lt;br /&gt;Received: by 10.70.50.18 with SMTP id x18mr8978354wxx;&lt;br /&gt;     Sun, 13 Aug 2006 16:13:39 -0700 (PDT)&lt;br /&gt;Return-Path: &lt;online@security.com&gt;&lt;br /&gt;Received: from flpvm09.prodigy.net (flpvm09.prodigy.net [207.115.20.39])&lt;br /&gt;     by mx.gmail.com with ESMTP id h11si3436504wxd.2006.08.13.16.07.06;&lt;br /&gt;     Sun, 13 Aug 2006 16:13:39 -0700 (PDT)&lt;br /&gt;Received-SPF: neutral (gmail.com: 207.115.20.39 is neither permitted nor denied by best guess record for domain of online@security.com)&lt;br /&gt;X-ORBL: [75.15.23.30]&lt;br /&gt;Received: from User (adsl-75-15-23-30.dsl.pltn13.sbcglobal.net [75.15.23.30])&lt;br /&gt; by flpvm09.prodigy.net (8.13.7 out spool5000 dk/8.13.7) with SMTP id k7CMkdAn008485;&lt;br /&gt; Sat, 12 Aug 2006 15:46:40 -0700&lt;br /&gt;Message-Id: &lt;200608122246.k7cmkdan008485@flpvm09.prodigy.net&gt;&lt;br /&gt;Reply-To: &lt;no.reply@paypal.com&gt;&lt;br /&gt;From: "Paypal Security Center"&lt;online@security.com&gt;&lt;br /&gt;Subject: Accounts Management&lt;br /&gt;Date: Sat, 12 Aug 2006 18:47:10 -0700&lt;br /&gt;MIME-Version: 1.0&lt;br /&gt;Content-Type: text/html;&lt;br /&gt; charset="Windows-1251"&lt;br /&gt;Content-Transfer-Encoding: 7bit&lt;br /&gt;X-Priority: 3&lt;br /&gt;X-MSMail-Priority: Normal&lt;br /&gt;X-Mailer: Microsoft Outlook Express 6.00.2600.0000&lt;br /&gt;X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000&lt;br /&gt;&lt;br /&gt;&lt;/online@security.com&gt;&lt;/no.reply@paypal.com&gt;&lt;/online@security.com&gt;&lt;/pre&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="600"&gt;&lt;br /&gt;&lt;span style=";font-family:Verdana,Arial,Helvetica,sans-serif;font-size:85%;"  &gt;&lt;br /&gt;&lt;img src="http://www.paypal.com/images/paypal_logo.gif" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dear PayPal customer,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      &lt;br /&gt;As part of our security measures, we regularly screen activity in the PayPal system.&lt;br /&gt;We recently noticed the following issue on your account:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our system requires further account verification.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Case ID Number: PP-132-378-817&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For your protection, we have limited access to your account until additional security&lt;br /&gt;measures can be completed. We apologize for any inconvenience this may cause.&lt;br /&gt;To review your account and some or all of the information that PayPal used to make its&lt;br /&gt;decision to limit your account access, please visit the Resolution Center.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://SCAMSCAMSCAMSCAMSCAM"&gt;THIS AND ALL OTHER PAYPAL MAILS ARE SCAMS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If, after reviewing your account information, you seek further clarification regarding&lt;br /&gt;your account access, please contact PayPal by visiting the Help Center and clicking&lt;br /&gt;"Contact Us". We thank you for your prompt attention to this matter. Please understand&lt;br /&gt;that this is a security measure intended to help protect you and your account. We apologize&lt;br /&gt;for any inconvenience.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sincerely,&lt;br /&gt;&lt;br /&gt;PayPal Account Review Department&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;center&gt;&lt;span style=";font-family:Verdana,Arial,Helvetica,sans-serif;font-size:85%;"  &gt;&lt;span style="color: rgb(119, 119, 119);font-size:85%;" &gt;Copyright  1999-2006 PayPal. All rights reserved.&lt;/span&gt;&lt;/span&gt;&lt;/center&gt;&lt;span style=";font-family:Verdana,Arial,Helvetica,sans-serif;font-size:85%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-115556598715202346?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/115556598715202346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=115556598715202346' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115556598715202346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115556598715202346'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/08/phishing-vigilante.html' title='Phishing vigilante?'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-115231557021783660</id><published>2006-07-07T19:04:00.000-04:00</published><updated>2006-08-23T01:10:58.733-04:00</updated><title type='text'>Shuttle SN25P and faulty SATA</title><content type='html'>About six months ago, my wife bought a &lt;a href="http://global.shuttle.com/Product/Barebone/SN25P.asp"&gt;Shuttle SN25P&lt;/a&gt; and put together a pretty nice system.  It has a decent Athlon 64, 2GB RAM and the 74GB WD Raptor which have all been performing pretty well, except for a couple of things.  She took the system to Dallas and found that when powering it up, it couldn't find the HDD.  After reseating the SATA and power cables, it started behaving normally.  During another recent trip, I powered down her machine to save power, only to find that it wouldn't power back up with the same issue.  HDD access seemed to be behind everything.  There were occasional lockups that left the HDD light on solid, and occasional bouts of not being able to find the HDD.  So, given the really slick engineering of this system, my first suspicion was the Raptor.  I pulled down their data lifeguard suite and took a look at the SMART readings - all were nominal.  That would be odd, I think, on a system that showed every symptom of a gradual HDD failure - the exact sort that SMART was designed to detect.&lt;br /&gt;&lt;br /&gt;Fast forward to two weeks ago.  Tracey indicated to me that the computer seemed to be in a major hurt.  I powered it up and Windows XP started booting to safe mode.  It threw an error about not being able to read the registry and seemed to hang (HDD light on again).  Now, booting shows an error - the SYSTEM registry hive is completely gone.  This is one of the worst things that can happen to a Windows machine, because at this point the best she can hope for is to salvage the data on the drive.  Installing a clean SYSTEM registry hive will wreck many of the installed programs, probably to the point of being virtually irreparable.&lt;br /&gt;&lt;br /&gt;I had a hunch that it might be the motherboard so I did a quick Google for &lt;a href="http://www.google.com/search?q=sn25p+sata+problem"&gt;SN25P SATA problem&lt;/a&gt; and hit paydirt.  Shuttle is shipping these with, of all things, defective SATA cables.  Post after post describes exactly the symptoms she was seeing.  It is highly frustrating to think that a $1 cable replacement could have prevented the loss of her system.  Then again, it's also really difficult to fathom a defective cable in a PC.  I realize that these little cables are transferring tons of information but to see a cable failure on an internal component... it's beyond rare.  So, my opinion of Shuttle has gone down a little bit.  Not their Engineering, but their Support.&lt;br /&gt;&lt;br /&gt;One of the most serious problems facing any support organization is how to communicate defects to customers.  I worked support for a large ISV for several years.  We actually had a policy that words like defect or bug could not be used.  (This mindset was later changed to a certain degree.)  So, here are the possibilities as far as Shuttle support is concerned.&lt;br /&gt;&lt;br /&gt;Shuttle support really might not know this is a widespread problem.  My gut reaction is to see this as a technology problem.  Their case management system could be poor or nonexistent.  What seems like an oddball problem or random defect to one customer should be easy to identify as a more widespread problem affecting larger numbers of customers in the case management system.  The reality though is that this would be more of a process problem.  Serious corporate IT/helpdesks have a set of standards called ITIL.  I think it is a failing of the software and hardware industries to apply these ITIL practices to Tech Support.  Basically, the relevant sections of ITIL define a customer support request as having two components: a support request ID and a problem ID.  For instance, if 10 people wrote in about SATA problems on their SN25P, ultimately this should result in 10 different support request IDs and a single problem ID.  That's the first step towards determining the real scope of a problem.&lt;br /&gt;&lt;br /&gt;I believe Shuttle support does know about SATA cable problems on the SN25P.  There are any number of reasons why they might not acknowledge it.  The most optimistic is that the problem isn't widespread enough to note it as a defect.  A defect that affects an immeasurably small portion (for instance, 0.01%) of your customers simply isn't cost effective to research, publicize, and fix.  This may upset you but then again, you wouldn't have purchased a Shuttle if you had to pay for the Engineering department to chase down every single issue experienced by every customer.  The market would bankrupt them.  Another possibility is that Shuttle support is not well connected to Engineering.  There is a natural disdain between a support department and an Engineering department that can result in this type of problem going unresolved.  I imagine this might be amplified by support being in the USA and Engineering being in Taiwan.  Companies fear revealing serious defects may provide fodder to competitors.  The support hierarchy (1st, 2nd, and 3rd line) may be ineffective at communicating this type of issue.&lt;br /&gt;&lt;br /&gt;In any case, I'm replacing the SATA cable now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; It's more than a month later and no lockups.  It really was the SATA cable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-115231557021783660?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/115231557021783660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=115231557021783660' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115231557021783660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115231557021783660'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/07/shuttle-sn25p-and-faulty-sata.html' title='Shuttle SN25P and faulty SATA'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-115067038202124086</id><published>2006-06-18T18:28:00.000-04:00</published><updated>2006-06-18T18:39:42.106-04:00</updated><title type='text'>Cleaning off the dust</title><content type='html'>I haven't posted here in about a billion years because I haven't had time to code.  I've been so busy at work, due to where we are in the release cycle.  We are inching closer to gold and so everyone is putting in lots of time and effort.&lt;br /&gt;&lt;br /&gt;I've started a small comic collection and so I should plug a couple of sites.  First, support your local comic book store.  These guys provide many valuable services like back issues, special requests, and just knowing their customers.  It's important that they aren't eaten by giants like Amazon and the like.  In that spirit, if you're in the Orlando area may I suggest you pay a visit to &lt;a href="http://www.acme-superstore.com"&gt;Acme Comics&lt;/a&gt;.  These guys have really taken care of me.  Orlando is lucky to have several local comic book artists.  If you like humor and anthro, check out Altamonte Springs resident Derrick Fish.  His webcomic &lt;a href="http://www.dandyandcompany.com/"&gt;Dandy &amp; Company&lt;/a&gt; is worth a look.  Another project he is involved with is a collaboration with local writer Marc Hammond in &lt;a href="http://www.tailstoamaze.com/"&gt;Tails to Amaze&lt;/a&gt;.  Tails is really a local treat since it doesn't have wide distribution at this time.  The first issue is excellent though.  Finally, once you've built up your exciting new comic collection, may I suggest managing it with &lt;a href="http://www.stashmycomics.com/"&gt;Stash My Comics&lt;/a&gt;.  Despite being written entirely in ASP, webmaster Igor Nikitenko has created a fantastic and free community site for managing your collection.  There are a lot of comic book manager programs, and a couple of similar web sites but this one is by far the best.&lt;br /&gt;&lt;br /&gt;Hopefully, I'll be back to coding very soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-115067038202124086?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/115067038202124086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=115067038202124086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115067038202124086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/115067038202124086'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/06/cleaning-off-dust.html' title='Cleaning off the dust'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-114453418781893348</id><published>2006-04-08T17:06:00.000-04:00</published><updated>2006-04-08T18:09:47.916-04:00</updated><title type='text'>MVC - beautiful OO</title><content type='html'>It took learning C# for me to really get OO.  I suppose that learning Java would do it as well, but Visual Studio Intellisense plus the strong typing of C# really put it in perspective.  I'd probably read a hundered times that objects model the real world but I really saw it when I could see how a well designed object model worked.  The first one I really saw was fairly simple - the Microsoft Virtual Server COM interface (as wrapped and marshalled by Visual Studio .NET 2003).&lt;br /&gt;&lt;br /&gt;You start by getting an object representing the whole COM interface.  This object has methods that return other objects, such as Virtual Server hosts.  These host objects return machine objects, and so on.  This model really didn't meaningfully demonstrate much, except maybe indirectly.  For instance, encapsulation - each object contained enough data to do what it needed to do without needing tons of parameters passed to some arcane function.  The namespaces were all clean and each object came with the methods I needed to get work done.&lt;br /&gt;&lt;br /&gt;More reading and experimenting led me to the &lt;span style="font-style:italic;"&gt;Design Patterns&lt;/span&gt; book, and time and community momentum has led me to &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt;.  It's not the first time I've seen Model-View-Controller.  The afforementioned app I was working on was messy, and we had tight coupling between the UI and the business logic.  My first peek at frameworks led to a lot of MVC and finally to J2EE.  Interesting, but impractical since C# was the shortest distance between a web page and MSVS.&lt;br /&gt;&lt;br /&gt;Time has changed a lot of things.  VMware is the obvious winner in virtualization.  Our organization has started to look at automating VMware server and I have been working off and on with Rails.  Rails has a lot of great stuff going for it right now - Instantrails for Windows offers an almost perfect environment to get started.  Several free (and free) Ruby and even Rails IDEs are out there (&lt;a href="http://freeride.rubyforge.org/"&gt;FreeRIDE&lt;/a&gt;, &lt;a href="http://rubyeclipse.sourceforge.net/"&gt;RDT&lt;/a&gt;, and &lt;a href="http://www.radrails.org/"&gt;RadRails&lt;/a&gt; for instance).  A brand new release of Rails improved the maturity of the code even more.&lt;br /&gt;&lt;br /&gt;But still I didn't get MVC.  My understanding until yesterday was that the model handled populating and storing business objects in the datastore, the view created the HTML or other UI and the controller responded to all user input.  I now think I had an overly narrow definition of the model.  One of the things that got me thinking about it was looking at &lt;a href="http://www.typosphere.org/"&gt;Typo&lt;/a&gt;, the CMS included with Instantrails.  After poking at the app a bit, I started peeking around in their files to see how things were setup.&lt;br /&gt;&lt;br /&gt;I started with the post class in the model.  As expected, it's an ActiveRecord.  That's the Rails object/relational mapper which handles storing and retrieving data from the database.  The surprise was a method on the post class - ping.  It's the method for pinging blog trackers like Technorati about new posts.  So, my new definition of a model is the persistence and business object layer.  It makes sense that a class that models a blog post would have a ping method.  Pinging is universal to blog posts, regardless of the view or the controller.  It's a beautiful thing.  I can take my model from one application and move it directly to another because the model has no dependence (or coupling in OO parlance) to the view or the controller.  Right away this helped clarify most of my "what goes where" questions.&lt;br /&gt;&lt;br /&gt;If you're at all interested in Rails or MVC in general, take a look at the Typo code.  It's clean and simple and not a bad way to learn about the possibilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-114453418781893348?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/114453418781893348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=114453418781893348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114453418781893348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114453418781893348'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/04/mvc-beautiful-oo.html' title='MVC - beautiful OO'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-114322699148272393</id><published>2006-03-24T13:55:00.000-05:00</published><updated>2006-03-24T14:03:38.596-05:00</updated><title type='text'>Calling nsupdate from PHP script</title><content type='html'>First, I should note that this is very situational but hopefully someone can make use of it.  The environment at work is mostly Windows machines.  There is a Windows DNS server as well which accepts dynamic updates for reverse lookups, among other things.  This can be a pain when you are working on various Unix/Linux platforms.  I wrote up a very quick web page that uses the nsupdate package (should be available for most platforms) to remove stale reverse lookup entries from the server.  Released public domain, a comment here would be appreciated if it helped you at all.&lt;br /&gt;&lt;code&gt;&lt;font color="#000000"&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Jamie's&amp;nbsp;DNS&amp;nbsp;fixer&amp;nbsp;thingy&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;P&amp;gt;This&amp;nbsp;tool&amp;nbsp;clears&amp;nbsp;reverse&amp;nbsp;lookup&amp;nbsp;entries&amp;nbsp;for&amp;nbsp;a&amp;nbsp;given&amp;nbsp;IP.&amp;nbsp;&amp;nbsp;Stale&amp;nbsp;reverse&amp;nbsp;lookup&lt;br /&gt;entries&amp;nbsp;can&amp;nbsp;cause&amp;nbsp;problems&amp;nbsp;with&amp;nbsp;non-Windows&amp;nbsp;systems.&amp;nbsp;&amp;nbsp;Entering&amp;nbsp;an&amp;nbsp;IP&amp;nbsp;here&amp;nbsp;submits&lt;br /&gt;a&amp;nbsp;dynamic&amp;nbsp;update&amp;nbsp;request&amp;nbsp;to&amp;nbsp;the&amp;nbsp;DNS&amp;nbsp;server&amp;nbsp;for&amp;nbsp;removal&amp;nbsp;of&amp;nbsp;the&amp;nbsp;entry&amp;nbsp;for&amp;nbsp;that&amp;nbsp;IP.&amp;lt;/P&amp;gt;&lt;br /&gt;&amp;lt;form&amp;nbsp;method="POST"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;name="IP"&amp;nbsp;type="text"&amp;nbsp;value="&lt;font color="#0000BB"&gt;&amp;lt;?=&lt;/font&gt;&lt;font color="#007700"&gt;(!empty(&lt;/font&gt;&lt;font color="#0000BB"&gt;$_POST&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#DD0000"&gt;'IP'&lt;/font&gt;&lt;font color="#007700"&gt;]))&amp;nbsp;?&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$_POST&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#DD0000"&gt;'IP'&lt;/font&gt;&lt;font color="#007700"&gt;]&amp;nbsp;:&amp;nbsp;&lt;/font&gt;&lt;font color="#DD0000"&gt;""&lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;/font&gt;"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;name="Submit"&amp;nbsp;type="submit"/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$input&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$_POST&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#DD0000"&gt;'IP'&lt;/font&gt;&lt;font color="#007700"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$valid&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;preg_match&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#DD0000"&gt;'/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/'&lt;/font&gt;&lt;font color="#007700"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$input&lt;/font&gt;&lt;font color="#007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isset(&lt;/font&gt;&lt;font color="#0000BB"&gt;$_POST&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#DD0000"&gt;'Submit'&lt;/font&gt;&lt;font color="#007700"&gt;]))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/font&gt;&lt;font color="#0000BB"&gt;$valid&lt;/font&gt;&lt;font color="#007700"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;font color="#0000BB"&gt;&amp;lt;?=&lt;/font&gt;&lt;font color="#007700"&gt;empty(&lt;/font&gt;&lt;font color="#0000BB"&gt;$input&lt;/font&gt;&lt;font color="#007700"&gt;)&amp;nbsp;?&amp;nbsp;&lt;/font&gt;&lt;font color="#DD0000"&gt;"You&amp;nbsp;must&amp;nbsp;specify&amp;nbsp;an&amp;nbsp;IP&amp;nbsp;address."&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;:&amp;nbsp;&lt;/font&gt;&lt;font color="#DD0000"&gt;"$input&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;valid&amp;nbsp;IP&amp;nbsp;address."&lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;/font&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000BB"&gt;&amp;lt;?&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;}&amp;nbsp;else&amp;nbsp;{&amp;nbsp;&lt;/font&gt;&lt;font color="#FF8000"&gt;//&amp;nbsp;Input&amp;nbsp;validated&amp;nbsp;by&amp;nbsp;regexp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$iparr&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;split&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#DD0000"&gt;'\.'&lt;/font&gt;&lt;font color="#007700"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$input&lt;/font&gt;&lt;font color="#007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$iprev&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$iparr&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;3&lt;/font&gt;&lt;font color="#007700"&gt;].&lt;/font&gt;&lt;font color="#DD0000"&gt;'.'&lt;/font&gt;&lt;font color="#007700"&gt;.&lt;/font&gt;&lt;font color="#0000BB"&gt;$iparr&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;2&lt;/font&gt;&lt;font color="#007700"&gt;].&lt;/font&gt;&lt;font color="#DD0000"&gt;'.'&lt;/font&gt;&lt;font color="#007700"&gt;.&lt;/font&gt;&lt;font color="#0000BB"&gt;$iparr&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;1&lt;/font&gt;&lt;font color="#007700"&gt;].&lt;/font&gt;&lt;font color="#DD0000"&gt;'.'&lt;/font&gt;&lt;font color="#007700"&gt;.&lt;/font&gt;&lt;font color="#0000BB"&gt;$iparr&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;0&lt;/font&gt;&lt;font color="#007700"&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$dnscmd&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;=&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;EOF&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;update&amp;nbsp;delete&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;{&lt;/font&gt;&lt;font color="#0000BB"&gt;$iprev&lt;/font&gt;&lt;font color="#007700"&gt;}&lt;/font&gt;&lt;font color="#0000BB"&gt;.in-addr.arpa&lt;br /&gt;send&lt;br /&gt;exit&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;font color="#007700"&gt;EOF;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$nsupdate&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;popen&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#DD0000"&gt;'/usr/bin/nsupdate'&lt;/font&gt;&lt;font color="#007700"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#DD0000"&gt;'w'&lt;/font&gt;&lt;font color="#007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;fwrite&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$nsupdate&lt;/font&gt;&lt;font color="#007700"&gt;,&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$dnscmd&lt;/font&gt;&lt;font color="#007700"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$retval&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;=&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;pclose&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$nsupdate&lt;/font&gt;&lt;font color="#007700"&gt;);&amp;nbsp;&lt;/font&gt;&lt;font color="#FF8000"&gt;//&amp;nbsp;nsupdate&amp;nbsp;doesn't&amp;nbsp;return&amp;nbsp;anything&amp;nbsp;useful&amp;nbsp;when&amp;nbsp;called&amp;nbsp;this&amp;nbsp;way&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&amp;lt;p&amp;gt;Submitted&amp;nbsp;removal&amp;nbsp;request&amp;nbsp;for&amp;nbsp;stored&amp;nbsp;DNS&amp;nbsp;record&amp;nbsp;on&amp;nbsp;&lt;font color="#0000BB"&gt;&amp;lt;?=$input?&amp;gt;&lt;/font&gt;.&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000BB"&gt;&amp;lt;?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;}&amp;nbsp;&lt;/font&gt;&lt;font color="#FF8000"&gt;//&amp;nbsp;if(!$valid)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;}&amp;nbsp;&lt;/font&gt;&lt;font color="#FF8000"&gt;//&amp;nbsp;if(isset($_POST['Submit']))&lt;br /&gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;br /&gt;&lt;/font&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-114322699148272393?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/114322699148272393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=114322699148272393' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114322699148272393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114322699148272393'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/03/calling-nsupdate-from-php-script.html' title='Calling nsupdate from PHP script'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-114136644724971472</id><published>2006-03-03T00:34:00.000-05:00</published><updated>2006-03-03T01:14:07.343-05:00</updated><title type='text'>Good luck, Maxis (or not)</title><content type='html'>The parallels between the future Will Wright offering &lt;span style="font-style: italic;"&gt;Spore&lt;/span&gt; and Peter Molyneux's &lt;span style="font-style: italic;"&gt;Black and White&lt;/span&gt; are easy to conjure.  On the shallow side, neat graphics (the zoom-outs in the spore video look very familiar), possible similarities in gameplay, and tapping in to the god complex of gamers everywhere.  Legendary pre-release buzz is another common factor.  The deepest connection seems to be the awe-inspiring stuff of gamer's dreams: a virtual world where anything is possible.&lt;br /&gt;&lt;br /&gt;With the exception of my wife, who wouldn't watch the &lt;a href="http://video.google.com/videoplay?docid=8372603330420559198&amp;q=spore"&gt;spore video&lt;/a&gt; because it was too long, this game has sparked the imagination of everyone I know who has seen it.  I'm no exception.  I do like sims and certainly I am a fan of MMOs.  But why do we love the type of game that &lt;span style="font-style: italic;"&gt;Spore&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Black and White&lt;/span&gt; promise?&lt;br /&gt;&lt;br /&gt;I'm not sure that anyone could answer that game concretely, but I will take a shot.  My first guess is that gamers love the idea that a game is so smart, it will evolve beyond anything the designers predicted based on the unique actions of the player.  &lt;span style="font-style: italic;"&gt;Black and White&lt;/span&gt; actually partially delivered on this one.  The creatures in B&amp;amp;W are able to learn.  The interface for teaching is kind of crummy - you don't know what you're teaching and players tend to overtrain due to the wacky interface for it.  Many creatures develop very strange eccentricities this way - mine loved to water trees, to the point where he did nothing but sleep, water trees, and scare villagers.  Bill actually trained his creature not to poop.  This was clearly an unintended consequence, and was fixed in the better-very-late-than-never first patch.&lt;br /&gt;&lt;br /&gt;I love stories of the early days of Ultima Online.  If you haven't heard of it, it is one of the oldest MMOs.  UO was released in 1997 and predates EverQuest by about two years.  I have heard a lot of meta-folklore about the early days of UO.  One story that sticks out is the changeable world that marked UO's beginning.  Players could compete for resources, animals could level up, and basically anything was possible.  Perhaps needless to say, this did not go well.  Within a few months, every tree and mine in UO was bare and if the packs of superinteligent max level wolves didn't kill you, the packs of murderers in every town would.  These problems were eventually fixed.&lt;br /&gt;&lt;br /&gt;Anyone reading this blog has probably given some thought to &lt;a href="http://en.wikipedia.org/wiki/Simulation_argument"&gt;the simulation argument&lt;/a&gt;.  If you think you haven't, follow the link and read up on it - this is undoubtedly a topic that has crossed your mind one way or another.  It's only a thought exercise since it doesn't change anything one way or another.  This thinking about what gamers like in games did lead me to it though.  Let me propose a corollary notion.  If simulations are possible and humans decide to start them, the technology will wind up in a computer game sooner or later.  Chew on that - the possibility exists that you live in a computer simulation, and to add some scare on the top, the simulation is on an Xbox in some alien's living room :)  At least if we're erased we won't see it coming.&lt;br /&gt;&lt;br /&gt;So back to Spore.  I wish Maxis luck, but I almost don't have to.  This game is going to sell a billion copies.  Given that, I almost want to wish them failure, because I have a sneaking suspicion this game is going to suck me in.  Hopefully it will be released for the 360 so I can feel like I've gotten my money's worth out of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-114136644724971472?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/114136644724971472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=114136644724971472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114136644724971472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114136644724971472'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/03/good-luck-maxis-or-not.html' title='Good luck, Maxis (or not)'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-114123692091697035</id><published>2006-03-01T12:53:00.000-05:00</published><updated>2006-03-01T13:17:39.153-05:00</updated><title type='text'>Kubuntu upgrade and gam-server (gamin) nightmare</title><content type='html'>My desktop has been upgraded from Debian testing (Etch) to Kubuntu Breezy. I did this in a kind of stupid way: I commented out all Debian sources in sources.list and used aptitude to do the upgrade. The version of aptitude in Etch has an AWESOME dependency resolution system - I marked a few Kubuntu packages for install and it noted that they would be broken. Next, I told Aptitude that these packages must be installed and set it to search for a way to make it work. After a few hundred thousand possibilities (about 30 minutes), it came up with a list of about 500 downgrades/upgrades/installs/removals that would satisfy my criteria. So far, so good.&lt;br /&gt;&lt;br /&gt;The first problem came during the install. There were a few libraries that dpkg just refused to install citing dependency problems. I manually installed these from the apt cache folder with dpkg -i --force all, and then set aptitude to work again. This pattern worked pretty well.&lt;br /&gt;&lt;br /&gt;The next problem was that the config I chose in aptitude left a handful of Debian packages around (a few hundred). This wouldn't be so bad except that the version of aptitude that breezy installed doesn't have the spiffy dependency resolution mentioned above. The only thing that made it easier to chase down the stragglers was that at some point breezy replaced my trusted apt keys, which marked Debian packages as untrusted. All I have to do is keep an eye out for packages marked with a U in aptitude. Overall I would not recommend this procedure. It might not be so bad if a. Breezy had a newer aptitude and b. 90% of the Ubuntu packages are downgrades from Etch, making the process a bit like pulling teeth.&lt;br /&gt;&lt;br /&gt;I do love Kubuntu though. I am a huge supporter of free software but I can't use an all-free system. Nvidia drivers and an installable JRE were the first things I noticed. In fact, after running the popular Automatix script, I think my version of Firefox works with more websites than Firefox on XP.&lt;br /&gt;&lt;br /&gt;Gam-server is driving me crazy. It's the daemon component of gamin, the gnome file alteration monitor. That's a bit of a misnomer because there are a bunch of KDE dependencies on it and it's not an optional component. Reading the ubuntu forums, I don't know why more posts aren't about gam-server, except that maybe not everyone knows how to open ksysguard or another process monitor app. Both on my work systems and at home, gam-server will start to leak memory quickly. Here's how I see the problem. I get to work and tap a key to pop the password prompt on my screen saver. If the prompt takes more than 2 seconds to appear, I know gam-server is now using 750MB+ RAM or so. The system has 2GB but I run a bunch of virtual machines and stuff so I can't afford to have some crap runaway process eat all this memory. I don't even know what triggers the problem, perhaps opening folders in konqueror? I can't find an obvious cause.&lt;br /&gt;&lt;br /&gt;The only post I've seen with a solution has you download gamin packages (and one or two dependencies) from the Dapper repository, which sounds like it will work. There's also &lt;a href="https://bugzilla.ubuntu.com/show_bug.cgi?id=13449"&gt;this bug&lt;/a&gt; which describes most of the gamin problems. I'm pretty surprised that they didn't backport a new gamin to Breezy. This is a game breaker unless you are used to rebooting your system daily (or digging a little deeper to periodically kill gam-server).&lt;br /&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;br /&gt;The bugzilla has another solution which is a surefire fix:&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;sudo mv /usr/lib/gamin/gam_server /usr/lib/gamin/gam_server-disable &amp;&amp;amp; killall gam_server&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-114123692091697035?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/114123692091697035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=114123692091697035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114123692091697035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/114123692091697035'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2006/03/kubuntu-upgrade-and-gam-server-gamin.html' title='Kubuntu upgrade and gam-server (gamin) nightmare'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113332612572435131</id><published>2005-11-29T22:59:00.000-05:00</published><updated>2005-11-29T23:48:45.793-05:00</updated><title type='text'>ActiveState on ActivePerl Windows x64 follow-up</title><content type='html'>You may remember an &lt;a href="http://thelightness.blogspot.com/2005/11/activestate-activeperl-for-windows-x64.html"&gt;earlier post&lt;/a&gt; regarding an ActivePerl Windows x86_64 version.  It turns out that many of my readers are also interested in the availability of ActivePerl for x64.  With that in mind, I contacted ActiveState product manager Matt Herdon to ask about an x64 port of ActivePerl.&lt;br /&gt;&lt;br /&gt;Let me start by saying that it's pretty great when a product manager is as accessible as Matt (but please don't start emailing him a bunch of crap).  Being a product manager is like trying to herd cats, except developers are more stubborn and you have the sales department chained to your ankles.  And you're blindfolded.  You should see the product lifecycle management systems used in big time development.  Look at a company like Microsoft and I am sure you could find a few cases of the code to implement a feature being smaller than the design documentation supporting it.  Anyway...&lt;br /&gt;&lt;br /&gt;The bad news:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"The bottom line is that there are no immediate plans to do an x64 port of ActivePerl.&lt;br /&gt;&lt;br /&gt;"[...]For our other languages, Python and Tcl, it has been relatively easy to do, since both seem to have few issues related to 64-bit. Not so with Perl.&lt;br /&gt;&lt;br /&gt;"The usefulness of Perl lies on the use of modules (CPAN etc.), a huge number of which won't work in 64-bit mode. Therefore there's lots of work to do -- both for us and the Perl community -- to get 64-bit firing on all cylinders.&lt;br /&gt;&lt;br /&gt;"We have limited resources, so unless a large customer (or Microsoft for that matter) wants to sponsor the port, it's going to be hard to get to unless the demand is large, which, currently, it's not."&lt;/blockquote&gt;My take on this is that ActiveState has at least partially compiled the base Perl interpreter in 64 bit.  The problem was in building the modules and PPDs.  As mentioned above, Perl without any modules is pretty much useless.  You could do little things like read and write files, do some math, print some output, but anything more complex requires modules.  In fact, unless you're doing some processor intensive computing with ActivePerl, most anything will require some modules to work.&lt;br /&gt;&lt;br /&gt;Perl modules come in two big varieties.  The first can be called a native Perl module.  This sort is a module comprised of all Perl code.  The other variety is XS or compiled.  XS modules are usually written in C/C++ and must be compiled with a C/C++ compiler.  There is a speed benefit with compiled modules but more importantly they allow access to system calls.  For instance, to reboot a Windows machine you might use Win32::InitiateSystemShutdown.  The Perl code in the Win32 module ties this function call to the compiled code in the Win32 module.  The compiled code is what is actually tied in to the Microsoft Win32 API.&lt;br /&gt;&lt;br /&gt;The compiled code is exactly the sort that might break in a 64 bit port.  Data types in C get broken because the size of core variables changes in a bit-width change like 32 to 64 bits.  This would affect tons of code in the Win32 modules alone, but extend this to all of CPAN and you see the problem ActiveState has.&lt;br /&gt;&lt;br /&gt;One thing I have &lt;a href="http://thelightness.blogspot.com/2005/10/notes-on-creating-perl-module-on-win32.html"&gt;mentioned&lt;/a&gt; before is that ActiveState automatically tries to build packages for all CPAN modules.  This is one of the reasons their Win32 Perl port is the best.  PPM is the easiest way to install Perl modules on a Windows machine, which almost certainly won't have all the compilers and tools needed to install a traditional CPAN module.  In other words, if a platform is added to ActivePerl and it lacks a majority of modules, the quality of ActivePerl suffers a great deal.  It's not an option.&lt;br /&gt;&lt;br /&gt;On the upside, if you believe as I do that x64 is an inevitable conclusion in the data center (and beyond...), ActiveState most certainly will release an x64 version of ActivePerl.  It will only take demand from the majority of the market, or more likely demand from the right customer.  The other positive note is that the majority of ActivePerl is functional on x86.  The few bits that don't work well are accessing system files, spawning 64 bit processes, and accessing the registry.  I wonder if there isn't a solution to these problems that doesn't require a full blown port to x64?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113332612572435131?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113332612572435131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113332612572435131' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113332612572435131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113332612572435131'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/activestate-on-activeperl-windows-x64.html' title='ActiveState on ActivePerl Windows x64 follow-up'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113253326683754041</id><published>2005-11-20T19:32:00.000-05:00</published><updated>2005-11-20T19:34:26.846-05:00</updated><title type='text'>CentOS (or RHEL or Fedora) and system-config-securitylevel</title><content type='html'>So, if you enable FTP and expect that to just work... Think again.  You have to edit /etc/iptables-config.  The first line has a note about other modules to load.  If the machine is a NAT firewall, adding ip_nat_ftp is needed.  If it's just a regular endpoint, ip_conntrack_ftp will do the trick.  This dynamically opens the ports needed for FTP passive (PASV) connections.&lt;br /&gt;&lt;br /&gt;This public service announcement has been brought to you by things that should just work but don't.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113253326683754041?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113253326683754041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113253326683754041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113253326683754041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113253326683754041'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/centos-or-rhel-or-fedora-and-system.html' title='CentOS (or RHEL or Fedora) and system-config-securitylevel'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113252289259351700</id><published>2005-11-20T16:36:00.000-05:00</published><updated>2005-11-20T16:41:32.606-05:00</updated><title type='text'>Neato tool for developing Smarty templates</title><content type='html'>Things have been a bit slow on this blog lately only because of how busy I've been. I've been working on a weekend project that I'm very excited about. It's not ready yet and I'm not going to say more about it until it's up and running. I did want to swing by and note a great tool I found for dealing with Smarty templates.&lt;br /&gt;&lt;br /&gt;There are actually at least five Smarty DreamWeaver extensions I found but by far the best is at &lt;a href="http://smartydwt.klitsche.org/"&gt;http://smartydwt.klitsche.org/&lt;/a&gt;.  Very full featured and it's actually maintained!  Thank you very much, Dirk, for this fantastic tool.&lt;br /&gt;&lt;br /&gt;More to come soon, I hope :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113252289259351700?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113252289259351700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113252289259351700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113252289259351700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113252289259351700'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/neato-tool-for-developing-smarty.html' title='Neato tool for developing Smarty templates'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113225108572516639</id><published>2005-11-17T13:11:00.000-05:00</published><updated>2005-11-17T13:27:15.676-05:00</updated><title type='text'>I'm about to stab PHP in the face</title><content type='html'>NuSOAP and PEAR SOAP are both pretty popular for SOAP clients and to a lesser extent SOAP servers.  NuSOAP has been around for 4 years, and PEAR SOAP at least 3 (based on the NuSOAP code).  So in four years time, WHY is this API still largely undocumented!  PEAR's lack of documentation for SOAP is completely inexcusable.  The docs generated from PHPDocumenter list each class and their members, but the list ends with the valid parameters and maybe a one sentence description.  What the hell guys?&lt;br /&gt;&lt;br /&gt;PEAR SOAP has a couple of examples included, and NuSOAP has a bunch of examples and a tutorial, but I would really like to understand what some of these parameters mean.  Perl's SOAP::Lite is nothing if not well documented.  I may be lazy but if this SOAP server isn't fast to code, I don't have time to do it.  I can say one thing - if I contribute to either PHP project it will be documentation.&lt;br /&gt;&lt;br /&gt;I do want to mention that PEAR SOAP looks very, very cool.  The server example seems to show a server method which points to an entire class.  The class winds up published in SOAP and WSDL.  That sounds nearly as easy as a C# .NET SOAP server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113225108572516639?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113225108572516639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113225108572516639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113225108572516639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113225108572516639'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/im-about-to-stab-php-in-face.html' title='I&apos;m about to stab PHP in the face'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113225079243135212</id><published>2005-11-17T13:03:00.000-05:00</published><updated>2005-11-17T13:08:17.486-05:00</updated><title type='text'>Ads by gooooooooooooooooooogle part 2</title><content type='html'>Well folks, it's been a wild ride, and I just want to take a moment to say thank you everybody. With your generous support, my ad revenue for the last two months has reached &lt;span style="font-weight: bold;"&gt;ONE DOLLAR&lt;/span&gt;! I really don't know what to say, except that I wouldn't be where I am today without you, the fans. You guys are the best.  I added a link to Firefox with Google Toolbar.  If you are on a new computer and you need to install Firefox, I invite you to experience the convenience of my "Get Firefox" link.  Proceeds will benefit restaurants in the Lake Mary, Florida area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113225079243135212?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113225079243135212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113225079243135212' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113225079243135212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113225079243135212'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/ads-by-gooooooooooooooooooogle-part-2.html' title='Ads by gooooooooooooooooooogle part 2'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113218486603255464</id><published>2005-11-16T18:30:00.000-05:00</published><updated>2005-11-16T18:47:46.080-05:00</updated><title type='text'>Tales of a hobbyist software architect</title><content type='html'>I am working on some automated testing at work.  The product I test is very complicated.  I was doing some procedural testing on one property window which has 300 children across 15 tree items (plus three more trees and a few modal dialogs of additional options).  It occurred to me that OO was the way to go here, but the implementation was an issue.&lt;br /&gt;&lt;br /&gt;The implementation I've hashed out so far is as follows.  A class representing the entire window is created (the facade).  Objects for each type of child in the property window are created via a factory which also populates them with data needed to find them (the factory creates four types of objects so far representing 150 different choices in the window).  These objects are passed to the facade in an array.  The facade then opens the properties window and iterates through each class.  Because all four classes have a common interface, the facade doesn't care what sort of class they really are.  The method it calls is always the same.&lt;br /&gt;&lt;br /&gt;There's a few problems with this approach.  First is VBScript.  TestComplete is the automation tool we are using, and it was decided that VBScript is the language we should use.  There are some pros to this choice since VBScript makes things like WMI very simple.  The cons relate to things like objects.  There's no inheritance!  These four classes have a considerable amount of common code.&lt;br /&gt;&lt;br /&gt;The second is TestComplete itself.  TC has a neat Object Driven Testing (ODT) UI.  Unfortunately it has limitations.  First, the UI itself is cumbersome - keyboard navigation is kind of a pain, and copy/paste doesn't seem to work.  Second is portability - how do I share my ODT tests with other testers?  The third seems a little more abstract but I'll try to explain it.  The model I architected represents each option in the properties window (but feel free to abstract this idea to the entire UI).  This model can be incorporated into tests, where you are using the model to control the UI programatically.  This has a few benefits over simple recorded scripts which I won't get into too much (unless you want me to).  The thing is that AutomatedQA's idea of ODT is to use the object model to represent the tests rather than the UI.  Here's a comparison:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My model&lt;/span&gt; - The user instantiates the option factory and creates option objects representing the settings she needs to test in the properties window.  She then uses the facade to open the window and set the settings.  This may generate immediate results or further steps may be required to validate results.  One thing is certain - most test units will involve multiple trips to this properties dialog.  This is supported by simply using the factory to create different options and passing them to the facade.  It's a repeatable process.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TestComplete's model&lt;/span&gt; - Each test you run is represented by a class.  A facade class would have subclasses that perform tests or components of tests.  A factory class is not supported.  Representing the UI, therefore, is extremely difficult and it's even more difficult to say "first, do this in the UI, then exit that and do this, finally go back to square 1 and do some more".  At least, that would be impossible to do with the architecture I have chosen.&lt;br /&gt;&lt;br /&gt;So... It's an impasse of sorts.  If this was "the TestComplete way" to do ODT, that would provide some guidance.  If I &lt;span style="font-style: italic;"&gt;knew&lt;/span&gt; other testers would use this model, that would give some guidance.  I feel like it's pretty easy to maintain and the interfaces are pretty easy to use, but it will require some time investment to get it right.&lt;br /&gt;&lt;br /&gt;Ultimately, it's a selfish decision.  Each big project like this seems to take something out of me.  I'm trying to evaluate whether the emotional return I get when people really use my code will equal the emotional toll creating the code will take.  Creating the code actually isn't that bad, but "selling" it to peers, documenting it, supporting it...  This is daunting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113218486603255464?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113218486603255464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113218486603255464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113218486603255464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113218486603255464'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/tales-of-hobbyist-software-architect.html' title='Tales of a hobbyist software architect'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113202725015794393</id><published>2005-11-14T22:31:00.000-05:00</published><updated>2005-11-14T23:00:50.233-05:00</updated><title type='text'>Language overload</title><content type='html'>Definitely having a case of language overload.  Today I swore to two colleagues that VBScript functions can have optional parameters.  What was I thinking! :)&lt;br /&gt;&lt;br /&gt;There is really only one documented way to have an optional parameter in VBScript - use an array as the function parameter.  Items missing from the array can be defaulted.  Another high ranked Google post suggests using objects, but really if you're going to do that why not go full out OOP?&lt;br /&gt;&lt;br /&gt;Actually, you can't.  VBScript allows you to create classes and instantiate them (it supports constructors and destructors as well) but doesn't support inheritance.  Ghetto.&lt;br /&gt;&lt;br /&gt;Here's a fun trick - create a recursive function in VBScript and overflow the stack.  On a relatively fast machine with 1GB of RAM this took VBScript about 15 minutes to do.  It's incredible really that in this age of scripting, a modern language was created that is interpreted rather than compiled to an intermediate language for execution.  This is really fun when you forget to pre-declare a variable in a function deep in your program.  (Assuming you actually use Option Explicit.)  It churns along happily until it encounters this error (which it should have caught at compile time) and your program dies.  D'oh!&lt;br /&gt;&lt;br /&gt;Interestingly, VBScript is in it's fifth generation (version 5.6 to be exact).  How far it's come... not.&lt;br /&gt;&lt;br /&gt;The overload continues, though.  Today I worked on PHP, C# and VBScript.  Good lord.  I had a developer telling me about a TCL script I needed to see...   Good times though, there's not much I'd rather be doing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113202725015794393?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113202725015794393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113202725015794393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113202725015794393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113202725015794393'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/language-overload.html' title='Language overload'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113182782774555040</id><published>2005-11-12T15:04:00.000-05:00</published><updated>2005-11-12T15:37:07.813-05:00</updated><title type='text'>New PHP app</title><content type='html'>PHP has changed a lot.  Actually that's probably not true, but I have changed a lot.  C# opened my eyes to OOP.  So when I got an idea that needed a rapid web app with a database tied to it, I turned to PHP first, except now thinking in terms of OO.&lt;br /&gt;&lt;br /&gt;There are some easy wins here for PHP developers.  Procedural PHP pages typically begin like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;require_once('dbinfo.php');&lt;br /&gt;require_once('utils.php');&lt;br /&gt;include('header.php');&lt;br /&gt;&lt;br /&gt;error_reporting(E_ALL);&lt;br /&gt;&lt;br /&gt;$conn = mysql_connect($server, $user, $password, $database);&lt;br /&gt;&lt;br /&gt;// blah blah&lt;br /&gt;&lt;br /&gt;include('footer.php');&lt;br /&gt;mysql_close ($conn);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note all the duplication.  Even worse is that changing anything here globally becomes more difficult as the number of pages increases.  Finally, the namespace is polluted with all kinds of variables and functions that are pulled in by the other files.  There are ways around this procedurally, of course, but the OO way is to have each page inherit a base page.  The constructor and destructor of the base page handles everything that needs to be handled on every page:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;require_once('adodb/adodb.inc.php');&lt;br /&gt;class page_base {&lt;br /&gt;        var $dbserver = 'localhost';&lt;br /&gt;        var $dbuser = 'user';&lt;br /&gt;        var $dbpassword = 'pass';&lt;br /&gt;        var $dbdatabase = 'db';&lt;br /&gt;        var $db;&lt;br /&gt;&lt;br /&gt;        function page_base() {&lt;br /&gt;                $db =&amp; ADONewConnection('mysql');&lt;br /&gt;                $db-&gt;debug = true;&lt;br /&gt;                $db-&gt;PConnect($this-&gt;dbserver, $this-&gt;dbuser,&lt;br /&gt;                        $this-&gt;dbpassword, $this-&gt;dbdatabase);&lt;br /&gt;                $this-&gt;db = $db;&lt;br /&gt;&lt;br /&gt;                register_shutdown_function(array(&amp;$this, 'DESTROY'));&lt;br /&gt;&lt;br /&gt;                error_reporting(E_ALL);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        function DESTROY() {&lt;br /&gt;                $db = $this-&gt;db;&lt;br /&gt;                $db-&gt;Close();&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Subordinate pages inherit like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class test extends page_base {&lt;br /&gt;        function go() {&lt;br /&gt;              [....]&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$obj =&amp; new test;&lt;br /&gt;$obj-&gt;go();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Data and methods are encapsulated in the object.  Resultantly, object methods always have access to the data they need to work.  That keeps things tidy.&lt;br /&gt;&lt;br /&gt;This code can be extended with inheritance.  The base_page class instantiates an ADODB instance, so every class that inherits page_base will wind up with a database instance whether they need it or not.  The solution is to create a page_base_db class that inherits page_base and adds the database connection.  Subordinate pages that require the database connection can use page_base_db and reap the benefits of both classes.&lt;br /&gt;&lt;br /&gt;One interesting tenet of encapsulation in "true" OO systems is protecting class members.  The idea is that an interface (say, the page base class) may have variables and methods that should not be used by another class.  True encapsulated systems will actually prevent these members from being accessed from outside their designated scope.  Perl (and Perl-derived languages like PHP) do not enforce protection like this.  The risk of using "protected" methods or properties is placed on the shoulders of the user.  This makes sense since generally the source is available anyway.  So, to protect a class member in Perl/PHP: don't write documentation for it and name it differently (perhaps with an underscore) than public members.&lt;br /&gt;&lt;br /&gt;Some other nice developments in PHP since I last examined it.  &lt;a href="http://smarty.php.net"&gt;Smarty&lt;/a&gt; looks fantastic.  I love abstraction in my apps and Smarty will help abstract the presentation and business logic even more.  Also, I knew I didn't want to do Object-Relational Modeling for this project, but I did want a nice OO interface to the database.  &lt;a href="http://adodb.sourceforge.net/"&gt;ADODB&lt;/a&gt; fit the bill nicely.  &lt;a href="http://pear.php.net/package/DB"&gt;Pear::DB&lt;/a&gt; would probably also be very nice but the object model in ADODB is a little closer to what I wanted.  If I can pull it off I will probably use &lt;a href="http://xajax.sourceforge.net/"&gt;xajax&lt;/a&gt; to nicen up the UI a bit and speed up the app.  Lots of exciting stuff going on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113182782774555040?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113182782774555040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113182782774555040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113182782774555040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113182782774555040'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/new-php-app.html' title='New PHP app'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113150046664372749</id><published>2005-11-08T20:31:00.000-05:00</published><updated>2005-11-08T20:54:36.960-05:00</updated><title type='text'>Finding items with attributes in SQL</title><content type='html'>I have a MySQL database like this:&lt;br /&gt;&lt;br /&gt;create table t (item int, attr int);&lt;br /&gt;insert into t values (1, 1), (1,2), (2,1), (2,3), (3,2), (3,3), (4,1), (4,2);&lt;br /&gt;&lt;br /&gt;I need to find items with a list of attributes, ie show me all items that have 1 and 2 or 1 and 3 or 1, 2, and 3, etc.&lt;br /&gt;&lt;br /&gt;The answer was an inner join:&lt;br /&gt;&lt;br /&gt;select t1.item&lt;br /&gt;from t t1&lt;br /&gt;inner join t t2 on t1.item=t2.item AND t2.attr=2&lt;br /&gt;where t1.attr = 1;&lt;br /&gt;&lt;br /&gt;So, the first criteria appears in the where clause. Subsequent criteria appear in the inner join condition which it turns out is treated as basically another where clause. The results are pared down by items that appear in both lists only. (Duh, that's an inner join!) Can you tell I'm no good at SQL? :(&lt;br /&gt;&lt;br /&gt;There may be a better way to do this (group by?) but I hope this is reasonably optimized.&lt;br /&gt;&lt;br /&gt;EDIT: The query does indeed seem nicely optimized when you create a unique index on item and attr:&lt;br /&gt;&lt;br /&gt; alter table t add unique (item, attr);&lt;br /&gt;&lt;br /&gt;Explain now shows:&lt;br /&gt;&lt;br /&gt;&lt;table id="table_results" border="0" cellpadding="2" cellspacing="1"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;th&gt;     id     &lt;/th&gt;                  &lt;th&gt;     select_type     &lt;/th&gt;                  &lt;th&gt;     table     &lt;/th&gt;                  &lt;th&gt;     type     &lt;/th&gt;                  &lt;th&gt;     possible_keys     &lt;/th&gt;                  &lt;th&gt;     key     &lt;/th&gt;                  &lt;th&gt;     key_len     &lt;/th&gt;                  &lt;th&gt;     ref     &lt;/th&gt;                  &lt;th&gt;     rows     &lt;/th&gt;                  &lt;th&gt;     Extra     &lt;/th&gt;                  &lt;/tr&gt;          &lt;!-- Results table body --&gt;      &lt;tr style="cursor: default;" onmouseover="setPointer(this, 0, 'over', '#E5E5E5', '#CCCCFF', '#FFCC99');" onmouseout="setPointer(this, 0, 'out', '#E5E5E5', '#CCCCFF', '#FFCC99');" onmousedown="setPointer(this, 0, 'click', '#E5E5E5', '#CCCCFF', '#FFCC99');"&gt;                  &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" class="nowrap" align="right" bgcolor="#ffcc99" valign="top"&gt;1&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" bgcolor="#ffcc99" valign="top"&gt;SIMPLE&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" bgcolor="#ffcc99" valign="top"&gt;t2&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" bgcolor="#ffcc99" valign="top"&gt;index&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" bgcolor="#ffcc99" valign="top"&gt;item&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" bgcolor="#ffcc99" valign="top"&gt;item&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" class="nowrap" align="right" bgcolor="#ffcc99" valign="top"&gt;10&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" bgcolor="#ffcc99" valign="top"&gt;&lt;i&gt;NULL&lt;/i&gt;&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" class="nowrap" align="right" bgcolor="#ffcc99" valign="top"&gt;6&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete0');" bgcolor="#ffcc99" valign="top"&gt;Using where; Using index&lt;/td&gt;  &lt;/tr&gt;              &lt;tr style="cursor: default;" onmouseover="setPointer(this, 1, 'over', '#EEEEEE', '#CCCCFF', '#FFCC99');" onmouseout="setPointer(this, 1, 'out', '#EEEEEE', '#CCCCFF', '#FFCC99');" onmousedown="setPointer(this, 1, 'click', '#EEEEEE', '#CCCCFF', '#FFCC99');"&gt;                  &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" class="nowrap" align="right" bgcolor="#eeeeee" valign="top"&gt;1&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" bgcolor="#eeeeee" valign="top"&gt;SIMPLE&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" bgcolor="#eeeeee" valign="top"&gt;t1&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" bgcolor="#eeeeee" valign="top"&gt;ref&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" bgcolor="#eeeeee" valign="top"&gt;item&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" bgcolor="#eeeeee" valign="top"&gt;item&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" class="nowrap" align="right" bgcolor="#eeeeee" valign="top"&gt;10&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" bgcolor="#eeeeee" valign="top"&gt;builds.t2.item,const&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" class="nowrap" align="right" bgcolor="#eeeeee" valign="top"&gt;2&lt;/td&gt;     &lt;td onmousedown="setCheckboxColumn('id_rows_to_delete1');" bgcolor="#eeeeee" valign="top"&gt;Using where; Using index&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;So, the index is used in 1, which results in a constant getting plugged in to the second part (and the index is used again).  Spiff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113150046664372749?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113150046664372749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113150046664372749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113150046664372749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113150046664372749'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/finding-items-with-attributes-in-sql.html' title='Finding items with attributes in SQL'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113148159552251526</id><published>2005-11-08T15:18:00.000-05:00</published><updated>2005-11-08T15:26:35.533-05:00</updated><title type='text'>Obtuse companies</title><content type='html'>The company I work for has some pretty rigid procurement rules.  They're big.  These rules, though, are not off the wall.  We have preferred suppliers who we've negotiated deals with.  If product isn't available from the preferred supplier, we get a quote and send it to purchasing, where it's "handled".&lt;br /&gt;&lt;br /&gt;Today, I decided to try to order Zend Studio.  It's an awesome IDE for PHP.  As far as the IDE and the debugger, it's as good as Visual Studio.  The problem: Zend doesn't support the quote - PO process... at least not the way my company needs it.  Quotes are saved in my shopping cart (?).  Supposedly they do take POs but... ugh.  I submitted it through the chain, we'll see how it goes.  With management approval it will wind up in the Q1 buying cycle.  Should be fun.  So anyway, they're obtuse as well :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113148159552251526?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113148159552251526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113148159552251526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113148159552251526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113148159552251526'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/obtuse-companies.html' title='Obtuse companies'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113139859882730486</id><published>2005-11-07T16:20:00.000-05:00</published><updated>2005-11-07T16:23:18.840-05:00</updated><title type='text'>Activestate Activeperl for Windows x64</title><content type='html'>Hey, I have a question, Activestate: when are you going to release an x64 version of Activeperl?  There's already a Solaris version available.  The 32 bit version works 90% ok but there are key issues which are a deal breaker for me here.  One is that 32 bit apps can't see the entire registry.  Another is that 32 bit apps can't spawn 64 bit children.  These issues make sysadmin tasks with ActivePerl impossible on a 64 bit system.&lt;br /&gt;&lt;br /&gt;Even stranger is the lack of communication from ActiveState on this issue.  The only thing search turns up is a mailing list message from July asking when/if 64 bit Windows support will be available.  Is this thing on? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113139859882730486?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113139859882730486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113139859882730486' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113139859882730486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113139859882730486'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/activestate-activeperl-for-windows-x64.html' title='Activestate Activeperl for Windows x64'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113107745369475724</id><published>2005-11-03T23:03:00.000-05:00</published><updated>2005-11-03T23:10:53.706-05:00</updated><title type='text'>Explaining programming</title><content type='html'>It's fun and frustrating watching someone learn programming.  My friend Bill, an excellent math student, is working on some projects involving VBScript at work.  It's interesting seeing the order in which he gains knowledge.  It seems to begin with blind trial and error - Google, MSDN and help files produce code which is copied and pasted without understanding.  It seems that the mother of awareness is laziness. He noticed that there was a lot of repetition in the code he was putting out so he changed some string constants to variables to cut down on typing.  Soon, subroutines (and a vague awareness of the stack).  The subroutines resulted in a ton of sphagetti code.  It seemed that half of his routines called another routine.  Operator precedence was an issue until recently.  Today he "got" functions.  I think. &lt;br /&gt;&lt;br /&gt;He's still a little bit unclear on statements vs. expressions and foreach loops.  Confounding the problem is the test automation tool he is working in.  Their objects that should be returning a collection (for instance, Window.Children) are returning arrays that aren't enumeratable.  That means you have to setup a for loop.  I spent about 30 minutes poking at a foreach.  You know, I should email those guys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113107745369475724?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113107745369475724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113107745369475724' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113107745369475724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113107745369475724'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/explaining-programming.html' title='Explaining programming'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113097387240605892</id><published>2005-11-02T15:14:00.000-05:00</published><updated>2005-11-02T18:52:11.676-05:00</updated><title type='text'>Cross platform serial developing</title><content type='html'>I have heard some people say that any time you need to code for hardware cross platform, you are doomed to fail. Maybe that is true in some circumstances. I'm so inexperienced code wise that I can't say one way or another. I can tell you what I've seen with Perl.&lt;br /&gt;&lt;br /&gt;First, the pain level really depends on what you're trying to do with the serial port. If you were, say, trying to communicate with a modem and a remote system or a live user, that is probably going to be relatively easy to create something that will work on the platforms you need it to. Problems will likely arise with things like identifying the serial port (/dev/blah, Com1, or more esoteric depending on the platform).&lt;br /&gt;&lt;br /&gt;In a simple exercise, even this isn't a big deal. You can rely on the user to specify their serial port correctly or use a little bit of conditional logic to try to guess at it. Another option is to abstract it via a conditionally loaded object. To someone who had only used procedural programming for so long, this feels like magic.&lt;br /&gt;&lt;br /&gt;The idea is this. Class A needs to communicate with the serial port. This involves things like configuring the port (setting baud rates, buffers, etc), writing data, reading data and getting status (for instance, whether the buffer has characters waiting or whether CTS is high or low). Class A conditionally loads a serial class based on the platform. For instance, this probably bug-ridden code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;package a;&lt;br /&gt;&lt;br /&gt;my $osname = $^O;&lt;br /&gt;&lt;br /&gt;if ($osname eq 'Win32') {&lt;br /&gt; use Win32::SerialPort;&lt;br /&gt; my $serial = new Win32::SerialPort;&lt;br /&gt;} elsif ($osname eq 'Linux') {&lt;br /&gt; use Device::SerialPort;&lt;br /&gt; my $serial = new Device::SerialPort;&lt;br /&gt;} else&lt;br /&gt; die "Oops, not cross-platform enough";&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case, Win32::SerialPort and Device::SerialPort both have nearly identical interfaces. In a case where they didn't, an object could be created to abstract a native serial port object to a common interface.&lt;br /&gt;&lt;br /&gt;Abstraction isn't the exclusive domain of OOP. Much of the same could be implemented with procedural calls. The difference is that once the object is instantiated, a method call is already routed to the correct class library. Without objects you are probably relying on the exporter to export the same interface into your namespace. That's ugly. It gets uglier when you're using a language that doesn't do that magic exporting.&lt;br /&gt;&lt;br /&gt;This goes a little beyond theory. I ran into several modules on CPAN that control X10 products and things like the XM PCR which use exactly this technique to port between Windows and Linux. And, although I figured out that I really need to rewrite the serial communication methods in Audio::Radio::Sirius, it limps along there as well. We'll see how it turns out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113097387240605892?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113097387240605892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113097387240605892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113097387240605892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113097387240605892'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/cross-platform-serial-developing.html' title='Cross platform serial developing'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113088912005681561</id><published>2005-11-01T18:47:00.000-05:00</published><updated>2005-11-01T18:52:00.056-05:00</updated><title type='text'>Legacy</title><content type='html'>This module writing stuff is addictive.  I tell you if you are a programmer and haven't done it yet, I highly suggest it.  Write a module and submit it to CPAN, or start an open source project, or contribute something.  You feel like you're leaving a legacy.  All my coding to this point has been selfish, I have released virtually nothing.  Had I known the feeling you get when someone uses your code, I would have been coding all along.  Nothing is more satisfying than seeing your code used.  That's probably untrue but suffice to say it's very satisfying.&lt;br /&gt;&lt;br /&gt;I don't know if anyone has even looked at the Perl module yet.  I do know that between the Perl module and the scripts I've created at work, my code is getting out there.  I have gotten feedback on the code at work and it's pretty uber.  I'm totally excited to keep contributing.&lt;br /&gt;&lt;br /&gt;Incidentally, if you are enjoying the fruits of a small OSS project, take a moment to thank the author.  They will appreciate it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113088912005681561?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113088912005681561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113088912005681561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113088912005681561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113088912005681561'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/11/legacy.html' title='Legacy'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113079702310202608</id><published>2005-10-31T16:58:00.000-05:00</published><updated>2005-10-31T17:29:47.406-05:00</updated><title type='text'>Audio::Radio::Sirius 0.01 released!</title><content type='html'>And I'm already planning 0.02 :)&lt;br /&gt;&lt;br /&gt;If you're interested, here's &lt;a href="http://search.cpan.org/%7Ejtatum/Audio-Radio-Sirius-0.01/lib/Audio/Radio/Sirius.pm"&gt;Audio::Radio::Sirius 0.01&lt;/a&gt; on CPAN. I uploaded it last night (at 3 AM) and it was processed shortly later (within 30 minutes). I also submitted an application to be included on the module list, we'll see how that goes.&lt;br /&gt;&lt;br /&gt;I expected this barrage of emails from the automated builders but so far nothing. There is a big backlog and tons of packages get updated every day. We'll see what happens.&lt;br /&gt;&lt;br /&gt;There's still some legwork to be done in the module. I need to implement my gimpy events system, clean up the TX/RX code, and implement a bunch of events I haven't coded yet.&lt;br /&gt;&lt;br /&gt;Anyway I came to work all excited to use CPAN to install my module and got a rude awakening. The old CPAN module doesn't recognize Module::Build created modules. BUMMER! :) Module::Build has a built-in remedy for this situation in the form of Module::Build::Compat. It writes Makefile.PM files that CPAN can use to grok data about your module and install it in a way it understands. There are three modes of operation - traditional generates a MakeMaker makefile.PM based on your Build.PM. Passthrough just passes through the Makefile.PM arguments to build.pm (after translation). It sounds like either will work for me since my Build.PM file is very simple. I'll have to test this some.&lt;br /&gt;&lt;br /&gt;Another idea - I can't really setup automated tests of the big parts of the module, but there are some things I can do to test the smaller parts, like the checksumming and many of the handlers...  these things are somewhat fragile as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113079702310202608?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113079702310202608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113079702310202608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113079702310202608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113079702310202608'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/audioradiosirius-001-released.html' title='Audio::Radio::Sirius 0.01 released!'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113060723657269410</id><published>2005-10-29T12:48:00.000-04:00</published><updated>2005-10-29T13:34:27.893-04:00</updated><title type='text'>Notes on creating a perl module on Win32</title><content type='html'>ActiveState is great, there's no denying that.  Their ActivePerl port is top notch.  Windows itself is a bit of an issue.  Normally you stick with PPM and generally this will have all the packages you need.&lt;br /&gt;&lt;br /&gt;Suppose you decide to create a module though.  The biggest problem is documentation - it's all over the place.  Here's the steps as I have found so far:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Review prereqs.  Read perltoot and perlmod.  Hopefully you've made a few informal .pms before.&lt;/li&gt;&lt;li&gt;If you plan to distribute it, get an account on &lt;a href="http://pause.perl.org/"&gt;pause.perl.org&lt;/a&gt;.  Once your account is created you may want to look at your profile page, there are some interesting settings there.  PS - your email address propegate all over the Internet within a day or two, so take precautions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CPAN and Pause have a lot of FAQs but none really cover the whole process of creating the mod.  This is covered in perlnewmod.&lt;/li&gt;&lt;li&gt;For Windows, you will want to install the following PPMs: module-starter, module-builder, test-pod, and test-pod-coverage.&lt;/li&gt;&lt;li&gt;MakeMaker doesn't work on Windows without jumping through hoops.  Module-builder should work out of the box.&lt;/li&gt;&lt;li&gt;Be careful with dependencies.  They can be specified in build.pl.  After a cpan upload (and something like a week's time) your module is auto-built all over the place.  ActiveState tries to make a PPD.  CPANTesters has a crack at it.  &lt;a href="http://debian.pkgs.cpan.org/"&gt;debian.pkgs.cpan.org&lt;/a&gt; tries to build it.  There's probably a lot more automated builders and repackagers that I'm not covering here.&lt;/li&gt;&lt;/ul&gt;I'm pretty excited.  Hopefully this module thing will play out well.  There's a lot to think about and a lot of testing I need to do.  Gotta get well medicated and keep diving in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113060723657269410?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113060723657269410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113060723657269410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113060723657269410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113060723657269410'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/notes-on-creating-perl-module-on-win32.html' title='Notes on creating a perl module on Win32'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113046437400952916</id><published>2005-10-27T21:42:00.000-04:00</published><updated>2005-10-27T23:22:58.076-04:00</updated><title type='text'>Satellite parts and Perl module design</title><content type='html'>The SIR-ALP1 arrived today from ebay.  UPS was 1 day late which hopefully will result in some money back for me. &lt;br /&gt;&lt;br /&gt;The replacement part from &lt;a href="http://rush2112.net/"&gt;rush2112.net&lt;/a&gt; went in with no problem at all.  Sirius radios seem to be designed in two halves - the tuner, a standard component common to virtually every radio, and the UI end.  This is confirmed in the sportster, the starbase and the Sirius connect series.  Protocol analysis of the data between the tuner and the "front end" has revealed that the protocol is the same in all three of these tuners.  It's not a stretch to imagine that every other radio has an identical tuner built in.&lt;br /&gt;&lt;br /&gt;I'm starting to look seriously at the module development.  I registered an account on Perl PAUSE and am poring over the guidelines and directions.  I have two XM modules to base my design on - Audio::Radio::XM::PCR and Audio::Xmpcr.  I have reviewed the former first and the code looks good, except for one thing that is nagging me.  This design seems destined to be threaded.  These Serius tuners are very chatty.  Data is going back and forth all the time about all kinds of info - signal strength, what's playing on every channel, the time, and other info (probably the sports scores data).  The PCR is similar in this regard.  The module I looked at had a monitor method that was designed to be called in a loop.  This is sloppy IMO and how efficient could it be?  On the other hand, how many modules force threading on you when you instantiate an object?  I suppose it could be optional but I'd still like to see some precedent.  I need to review Audio::Xmpcr.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113046437400952916?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113046437400952916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113046437400952916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113046437400952916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113046437400952916'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/satellite-parts-and-perl-module-design.html' title='Satellite parts and Perl module design'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113038709774342423</id><published>2005-10-27T00:18:00.000-04:00</published><updated>2005-10-27T00:28:19.063-04:00</updated><title type='text'>First parts for home satellite system arriving</title><content type='html'>Got the Sirius mod from &lt;a href="http://rush2112.net/"&gt;rush2112.net&lt;/a&gt; in.  The alpine tuner is set to arrive tomorrow.  My house is being tiled at the moment and I have to stay home during that process.  So, I will have time to work on the Perl code needed to support this crazy idea.  How exciting for me!&lt;br /&gt;&lt;br /&gt;Surfing around &lt;a href="http://sparkfun.com/"&gt;sparkfun.com&lt;/a&gt; makes me want to learn a lot more about Electrical Engineering.  I checked and the local community "collage" does indeed have a couple of Electrical Engineering classes.  Registration is in November...  The only hesitation is the intro to EE prereq...  5 credit hours of learning V=IR probably.  If I can get my friend Bill to sign up I'm in.  On the other hand he may take Physics next semester and seeing him in intro physics might be too funny to miss.  &lt;a href="http://sparkfun.com/"&gt;Sparkfun &lt;/a&gt;has most of the parts you would need to make your own GPS enabled GSM MP3 USB LCD cell phone with accelerometer.  And don't we all?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113038709774342423?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113038709774342423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113038709774342423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113038709774342423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113038709774342423'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/first-parts-for-home-satellite-system.html' title='First parts for home satellite system arriving'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-113035535866292249</id><published>2005-10-26T15:32:00.000-04:00</published><updated>2005-10-26T15:35:58.670-04:00</updated><title type='text'>Another stupid batch trick part 2</title><content type='html'>A coworker astounded me today by showing me this lovely batch syntax:&lt;br /&gt;&lt;br /&gt;set scriptname = %~n0&lt;br /&gt;set scriptnamewithext = %~nx0&lt;br /&gt;&lt;br /&gt;Damn it Microsoft, did it occur to anyone over there to document this? So frustrating. If it is documented, it's not in "help set" or the Windows XP help file.  It's also nearly unsearchable due to being loaded with special characters. I did find plenty of usage of this technique on Google though so I'm probably the last one to know about it. The ones I found:&lt;br /&gt;&lt;br /&gt;d-drive&lt;br /&gt;p-path&lt;br /&gt;s-short filename modifier&lt;br /&gt;n-name&lt;br /&gt;x-extension&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-113035535866292249?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/113035535866292249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=113035535866292249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113035535866292249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/113035535866292249'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/another-stupid-batch-trick-part-2.html' title='Another stupid batch trick part 2'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112995834422684736</id><published>2005-10-22T01:05:00.000-04:00</published><updated>2005-10-22T01:19:04.266-04:00</updated><title type='text'>Home satellite radio distribution</title><content type='html'>Here's my great idea for distributing satellite radio around and about my house (and also to my desk at work).&lt;br /&gt;&lt;br /&gt;Parts:&lt;br /&gt;&lt;br /&gt;* SIR-ALP1 Sirius Connect receiver for Alpine head units&lt;br /&gt;* RS-232 mod for SIR-ALP1 from &lt;a href="http://rush2112.net"&gt;rush2112.net&lt;/a&gt; (+ power supply)&lt;br /&gt;* &lt;a href="http://www.ramseyelectronics.com/cgi-bin/commerce.exe?preadd=action&amp;key=FM10C"&gt;Ramsey FM10C&lt;/a&gt; FM transmitter (w/power supply)&lt;br /&gt;* Icecast2 server for Linux&lt;br /&gt;* Darkice streamer creating MP3 streams&lt;br /&gt;* Need to create a whole buncha Perl libraries to communicate with the Sirius gear - analogous to CPAN's Audio::XMPCR&lt;br /&gt;&lt;br /&gt;Right now my concerns are with the FM10C.  I will be broadcasting Howard Stern to various radios around my house.  I know the FM10C is strong enough to do it.  My concern is that it will leak too much and be scrutinized by someone else.  I have searched and searched the Internet and FCC regulations themselves and it seems that obscenity and indecency regulations don't apply to part 15 very low power devices.  This seems to be confirmed by the fact that nobody has been fined for playing George Carlin on their Griffin iTrip.  In fact many Sirius Howard Stern listeners will be listening via the FM transmitter built in to plug and play radios.&lt;br /&gt;&lt;br /&gt;A bit more - the FM10C should meet or exceed the part 15 requirement of no more than 250 microvolts per meter at 3 meters distance.  This puts me square into the consumer/hobbyist realm of FCC licensing.  FCC indecency and obscenity regulations apply to broadcast license holders, not individual broadcasters.  So these things shouldn't concern me, hopefully.  I'm going to keep looking.  Don't take this as legal advice, BTW, these are just my probably inaccurate conclusions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112995834422684736?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112995834422684736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112995834422684736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112995834422684736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112995834422684736'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/home-satellite-radio-distribution.html' title='Home satellite radio distribution'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112977920385035393</id><published>2005-10-19T23:33:00.000-04:00</published><updated>2005-10-19T23:37:06.466-04:00</updated><title type='text'>Mmmm... bread</title><content type='html'>&lt;a href='http://photos1.blogger.com/img/278/1963/640/IMG_0170.jpg'&gt;&lt;img border='0' style='border:2px solid #660000; margin:2px' src='http://photos1.blogger.com/img/278/1963/320/IMG_0170.jpg'&gt;&lt;/a&gt;&lt;br /&gt;In the tradition of my friend and fellow blogger &lt;a href="http://twistedrat.blogspot.com"&gt;Jeff&lt;/a&gt;, I am going to post some pictures of food.   I made bread this weekend...&lt;br /&gt;&lt;a href='http://photos1.blogger.com/img/278/1963/640/IMG_0171.jpg'&gt;&lt;img border='0' style='border:2px solid #660000; margin:2px' src='http://photos1.blogger.com/img/278/1963/320/IMG_0171.jpg'&gt;&lt;/a&gt;&lt;br /&gt;Well, I'm not sure if this can be called making bread, but I did it.  Sort of :)  I do have a tip for checking yeast.  Next time you pull that old bread mix out of the pantry, empty the yeast packet into some warm water and add a teaspoon or so of sugar.  If the yeast is even partly alive, within about ten minutes you'll see some activity - bubbles which hopefully escalate to a little bit of foam.  This is good.  Add the whole yeasty business to your dough and turn it on.  Even if 3/4 of the yeast is dead you've "awakened" enough of it to reproduce and "goodify" your bread.  (I've placed the highly technical terms in quotes for your convenience.)&lt;br /&gt;&lt;a href='http://photos1.blogger.com/img/278/1963/640/IMG_0172.jpg'&gt;&lt;img border='0' style='border:2px solid #660000; margin:2px' src='http://photos1.blogger.com/img/278/1963/320/IMG_0172.jpg'&gt;&lt;/a&gt;&lt;br /&gt;The finished product!  Golden and delicious.  It's really best when it's still warm enough to melt butter by itself.  Proof - I haven't eaten any since Sunday :(&amp;nbsp;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' border='0' style='border:0px;padding:0px;background:transparent;' align='absmiddle'&gt;&lt;/a&gt;&lt;br /&gt;BTW - it's really sad that Blogger's picture publishing tools still suck.  To post multiple pictures you have to use "Hello" (a windows only app) and an undocumented feature (the double-pipe trick) to put more than one picture in the same post.  They added Blogger to Picassa but for some reason it only allows one picture at a time.  Does Google hate Blogger?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112977920385035393?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112977920385035393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112977920385035393' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112977920385035393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112977920385035393'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/mmmm-bread.html' title='Mmmm... bread'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112959577188853008</id><published>2005-10-17T20:35:00.000-04:00</published><updated>2005-10-17T20:48:00.480-04:00</updated><title type='text'>The new project</title><content type='html'>So far I'm up to 1729 lines of code, including comments and blanks.  That's pretty depressing considering how long I've been working on it.&lt;br /&gt;&lt;br /&gt;I used this command to check:&lt;br /&gt;wc `find . -iname "*.pl" -or -iname "*.cmd" -or -iname "*.bat" -or -iname "*.pm" -or -iname "*.ini" -or -iname "*.txt"`&lt;br /&gt;&lt;br /&gt;Although, for comparison sake, it is replacing 209 lines of code...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112959577188853008?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112959577188853008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112959577188853008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112959577188853008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112959577188853008'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/new-project.html' title='The new project'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112949035170081587</id><published>2005-10-16T15:08:00.000-04:00</published><updated>2005-10-16T15:19:12.456-04:00</updated><title type='text'>Yes, I know, the Prius stalls</title><content type='html'>Two things really bug me about &lt;a href="http://www.cnn.com/2005/AUTOS/10/14/prius_recall.reut/index.html"&gt;all&lt;/a&gt; &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2005/10/13/AR2005101301564.html"&gt;the&lt;/a&gt; &lt;a href="http://www.newsday.com/business/ny-bztoyo144468193oct14,0,6034945.story?coll=ny-business-headlines"&gt;news&lt;/a&gt; &lt;a href="http://news.zdnet.com/2100-1040_22-5895574.html"&gt;articles&lt;/a&gt; about the Prius stalling issue.&lt;br /&gt;&lt;br /&gt;First, it's a hybrid.  If you think about it, a hybrid is exactly the sort of car you want to be in if it stalls.  If the Internal Combustion Engine (ICE) doesn't work, the battery motor can at least get you to a safe place in a pinch.  I had my ICE fail to start once when I was driving with low fuel.  I was really near a gas station and just pulled in.  Even if I wasn't, the battery should be able to move you up to, say, 1/4 of a mile I'd think.&lt;br /&gt;&lt;br /&gt;The main thing that bothers me about this is that it's a story at all.  Recalls usually only make the news if they cause explosions or rollovers.  This is a stalling problem.  I think the real reason is that deep down, people want Hybrids to fail.  I can't tell you how many people tell me about this "news" item.  I have heard about it probably 15 times, including 3 times from one coworker.  "GOOD, HYBRIDS HAVE PROBLEMS.  Glad I bought my 15 MPG SUV!"  It must be a relief, that, yes, my personal worst MPG for one tank is 45, but hey, my car can stall.  Ugh.  I just want to smack people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112949035170081587?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112949035170081587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112949035170081587' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112949035170081587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112949035170081587'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/yes-i-know-prius-stalls.html' title='Yes, I know, the Prius stalls'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112939713406483391</id><published>2005-10-15T13:24:00.000-04:00</published><updated>2005-10-15T13:31:08.603-04:00</updated><title type='text'>Goodbye, hello</title><content type='html'>Michelle's blog got eaten by some new gamergurl.  On the upside I found Bill's blog so I added it to my blogroll.  Zero sum I guess&lt;br /&gt;&lt;br /&gt;UPDATE: I just noticed that Bill's blog is 99% dead, so oh noes! I lose after all :'(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112939713406483391?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112939713406483391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112939713406483391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112939713406483391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112939713406483391'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/goodbye-hello.html' title='Goodbye, hello'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112934557520032048</id><published>2005-10-14T22:50:00.000-04:00</published><updated>2005-10-14T23:06:15.206-04:00</updated><title type='text'>Autoupdating software for free</title><content type='html'>OK, so I allegedly work for a company that has the best known software updater in computers today.  Allegedly.&lt;br /&gt;&lt;br /&gt;In any case, the situation came up at work where I need to update a Perl solution used internally.  This perl solution consists of about 50 scripts (hard to count how many with these CVS folders everywhere) that perform various functions.&lt;br /&gt;&lt;br /&gt;Some of these files have to be edited by the user, but the overall solution was written in Perl for a reason - users should be able to tweak it.  So, consider that any of those 100 files might be updated by the end user.  This adds a tough requirement - it has to be able to handle user modified files in a sane way.&lt;br /&gt;&lt;br /&gt;Part of the problem is my lazy programming.  I started out with a config file that was a Perl script wearing a fake moustache and glasses.  Not much of a disguise but it turned out not to be so bad for my three test subjects.  Well, when updating, if I add a new config variable, it would somehow have to make it's way into that script.&lt;br /&gt;&lt;br /&gt;First I tried CVS, because I thought that the CVS merge could fix everything.  It can't. :)  The merge, when it worked, was OK, but there are some files that will always be in conflict, and a config file is one of them.  Any time a user changes a default option from "no" to "yes", that line goes into conflict.  When CVS puts a file in conflict, that is CVS talk for wrecking your lazy perl script config file.  Additionally I think CVS has some high overhead, and setting up a pserver took entirely too long.  &lt;br /&gt;&lt;br /&gt;I started looking for how to disable that conflict handling behavior, and found a few things that seemed possibly promising, such as cvswrapper and other options... but ultimately it was a square peg that didn't fit in the slightly smaller rectangular hole, or ... something like that.&lt;br /&gt;&lt;br /&gt;CVS led to a 5 minute investigation of subversion but I quickly found &lt;a href="http://ask.slashdot.org/article.pl?sid=05/09/16/1635218&amp;tid=185&amp;tid=126&amp;tid=164&amp;tid=4"&gt;this Slashdot article&lt;/a&gt; which reminded me about rsync.  D'oh!&lt;br /&gt;&lt;br /&gt;rsync isn't perfect here either, but it's closer.  It has an option to skip files if the modified time is newer.  This is 99% what I want except that if I update the default config file, it will overwrite the modified version the user installed.  SO, I need a "builder" script that installs the product in the rsync repository and sets the modified dates back, I'm thinking about 20 years to account for wackiness on the target machines.  In QA it's not uncommon to goof around with your date to test... date stuff.  So 20 years should be pretty safe.  I hope :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112934557520032048?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112934557520032048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112934557520032048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112934557520032048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112934557520032048'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/autoupdating-software-for-free.html' title='Autoupdating software for free'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112934429562915869</id><published>2005-10-14T22:20:00.000-04:00</published><updated>2005-10-14T22:44:55.653-04:00</updated><title type='text'>Visual development environments</title><content type='html'>I totally had this great idea for a World of Warcraft mod.  It was so good and I think the implementation will be so easy that I spent about 3 hours yesterday poking at the WoW UI.  The problem is that there's no Visual Warcraft UI editor.  I have to guess at where controls go, how big things should be, etc.  Sorry, but I'm not visually oriented at all and trial and error is not appealing when reloading the UI takes so long.  Not to mention it isn't working too well for me but that's probably because I have a bunch of broken mods or something.&lt;br /&gt;&lt;br /&gt;On a positive note, the UI is fully modular and very extensible in a friendly and logical way.  Now I just have to wait for the &lt;a href="http://forums.worldofwarcraft.com/thread.aspx?fn=wow-interface-customization&amp;t=213557&amp;tmp=1"&gt;WoW UI designer&lt;/a&gt; to come out.  And do a bunch of coding.  My estimate for my uber mod: 200 lines of code.  Minus all the xml shit I mean.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112934429562915869?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112934429562915869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112934429562915869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112934429562915869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112934429562915869'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/visual-development-environments.html' title='Visual development environments'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112916657548491991</id><published>2005-10-12T21:18:00.000-04:00</published><updated>2005-10-12T21:24:03.716-04:00</updated><title type='text'>Google Reader</title><content type='html'>Had a chance to play with &lt;a href="http://reader.google.com"&gt;Google Reader&lt;/a&gt; today.  It's pretty neat.  I'd like to see some sort of grand unified interface to Google, particularly the reader, mail, and news.  The reader interface is pretty slick and has some elements that will probably migrate to gmail.  Speed is very good.  I like a centralized location for checking friends blogs, especially those who don't update often.  The rub in integration will be somehow keeping the clutter down.&lt;br /&gt;&lt;br /&gt;If anyone at Google reads this, please make your stock go back up :) Allow me to suggest more Wifi rumors or something.  Maybe you could merge Google talk with ICQ or something.  TIA&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112916657548491991?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112916657548491991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112916657548491991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112916657548491991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112916657548491991'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/google-reader.html' title='Google Reader'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112909641755640821</id><published>2005-10-12T01:51:00.000-04:00</published><updated>2005-10-12T01:53:37.556-04:00</updated><title type='text'>Ads by gooooooooooooooooooogle</title><content type='html'>I posted a million ads here.  I COULD MAKE UP TO 5 CENTS A DAY!!!  I figure I'll replace my comment spam problem with even more advertisements.&lt;br /&gt;&lt;br /&gt;BTW - are we on Web 2.0 or Web 3.0?  I forget which version.  Come on, Web!  If you don't send out CDs like that other service how will people know what version you have out!  I'm holding out for Web 10.0 TopSpeed Ultra with ActiveAJAX&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112909641755640821?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112909641755640821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112909641755640821' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112909641755640821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112909641755640821'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/ads-by-gooooooooooooooooooogle.html' title='Ads by gooooooooooooooooooogle'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112909060395609345</id><published>2005-10-12T00:15:00.000-04:00</published><updated>2005-10-12T00:16:43.956-04:00</updated><title type='text'>Comment spam</title><content type='html'>Been getting tons of comment spam.  Blogger just put up a note about enabling word verification.  Let's see if that makes a difference.  Weird anyway since they have nofollow on comment links, so spam is pointless...  Guess that won't deter a stupid spammer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112909060395609345?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112909060395609345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112909060395609345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112909060395609345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112909060395609345'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/comment-spam.html' title='Comment spam'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112898201851643281</id><published>2005-10-10T18:00:00.000-04:00</published><updated>2005-11-16T18:53:50.126-05:00</updated><title type='text'>Another stupid batch trick</title><content type='html'>I had to determine the directory where a .CMD file lives from within the CMD file. This is very hard to search on. $0 has the full path (like "C:\PATH\FILE.CMD") but there didn't seem to be any other environment variables that had it.&lt;br /&gt;&lt;br /&gt;I finally found a Microsoft article (Q121387) which shows how to find it:&lt;br /&gt;&lt;br /&gt;http://support.microsoft.com/default.aspx?scid=kb;en-us;Q121387&lt;br /&gt;&lt;br /&gt;Good luck finding this one.  Took me 20 minutes in Google :)  The secret:&lt;br /&gt;&lt;br /&gt;:: change to my home directory&lt;br /&gt;cd $0\..&lt;br /&gt;Man is that ghetto :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112898201851643281?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112898201851643281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112898201851643281' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112898201851643281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112898201851643281'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/another-stupid-batch-trick.html' title='Another stupid batch trick'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112873523229862030</id><published>2005-10-07T21:31:00.000-04:00</published><updated>2005-10-12T10:37:32.806-04:00</updated><title type='text'>Getting data into environment variables</title><content type='html'>After all this time, I still have to write DOS batch files now and then.  The one I'm working on now requires that I populate environment variables from a text file.  This one was tough to search out with Google but eventually I found a page that lists many, many ways to read data from a file to a variable in batch:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.student.northpark.edu/pemente/sed/bat_env.htm"&gt;http://www.student.northpark.edu/pemente/sed/bat_env.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are two relatively easy solutions there - strings.exe, which is under a bit of a cloud due to Ziff Davis sending C&amp;D letters to people using their 20K DOS program from 1992, and a method that uses SED to construct batch files on the fly which are called from the first batch file.  Oy! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112873523229862030?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112873523229862030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112873523229862030' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112873523229862030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112873523229862030'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/getting-data-into-environment.html' title='Getting data into environment variables'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112865705185684829</id><published>2005-10-06T23:22:00.000-04:00</published><updated>2005-10-06T23:50:51.916-04:00</updated><title type='text'>I believe you have underestimated my sneakiness</title><content type='html'>For the last ten years we've seen a &lt;a href="linux.slashdot.org/article.pl?sid=05/07/13/2310216&amp;tid=166&amp;tid=106"&gt;constant&lt;/a&gt; &lt;a href="linux.slashdot.org/article.pl?sid=04/07/29/140217&amp;tid=165"&gt;brigade&lt;/a&gt; of &lt;a href="linux.slashdot.org/linux/05/09/09/1218238.shtml?tid=163"&gt;articles&lt;/a&gt; starting with the phrase "Linux isn't ready for ______".  Once upon a time the word was servers, but at this point Linux has done a pretty damn good job of penetrating the server market ready or not.  Now the blank is desktop.&lt;br /&gt;&lt;br /&gt;For those already on the bandwagon, it feels like being on the edge of the first wave.  For the first time it seems we're on the cusp of Linux being ready for the desktop.  There are a lot of technologies converging which only serve to ready it more.  In a way it almost seems as though it will sneak up and be "ready" before many see it coming.&lt;br /&gt;&lt;br /&gt;- Accessories&lt;br /&gt;Anyone who hasn't looked at the FOSS versions of their favorite accessories in over a year should immediately do so.  kopete is at least as glitzy as Trillian and gaim is rock solid.  It's nice that FOSS hasn't forgotten about things like IRC as well.  xchat is like the Firefox of IRC offering the bulk of it's functionality via plugins and scripts.  Noatun has a great interface for multimedia although winamp fans may be drawn to xmms.&lt;br /&gt;&lt;br /&gt;- Desktop environment&lt;br /&gt;The difference between logging in to kubuntu and logging in to Windows is kubuntu's KDE login looks a lot nicer than Windows.  The funny thing about gnome vs. kde is that to a new user it probably doesn't matter that much.  They have come together enough that installing an application results in new menu items in both gnome and kde.  There are important differences in how administrative tasks are performed but the result is you won't go wrong by sticking with what your distro installs.  I use KDE and Mom would have no problem here.  The future looks even better (and simpler) with KDE 3.5 and beyond.  Simplicity good&lt;br /&gt;&lt;br /&gt;- Office apps&lt;br /&gt;I spent some time in openoffice calc, working on a spreadsheet the other day.  The application was very responsive and had all the functionality I expect from a spreadsheet.  It surprised me by continuing to perform when doing more advanced tasks like a few complicated formulas and macros.  OO 2 is right around the corner and they say MS office compatability is even better.  Furthermore, the Mass decision to standardise on opendoc is clearly a boon here, although it won't be long before MS introduces opendoc.&lt;br /&gt;&lt;br /&gt;- Web&lt;br /&gt;Firefox.  Enough said.  FF extensions are platform independant.  I also have acrobat reader and flash and if the flash audio stayed in sync with the video I'd never have to use VMWare to read somethingawful.com :)  I expect this to work virtually flawlessly in 6 months.&lt;br /&gt;&lt;br /&gt;So, when will the naysayers decide it's ready?  Will it be the point when 50% of new games are released for Linux as well?  Perhaps when Dell offers a desktop distribution preinstalled with a new PC?  Some people will never switch, and they don't have to.  Certainly, though, your choice of desktop influences how you look at the situation.  So, perhaps the "not ready" articles will live on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112865705185684829?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112865705185684829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112865705185684829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112865705185684829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112865705185684829'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/10/i-believe-you-have-underestimated-my.html' title='I believe you have underestimated my sneakiness'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112352868182009801</id><published>2005-08-08T15:15:00.000-04:00</published><updated>2005-08-08T15:20:32.033-04:00</updated><title type='text'>The many faces of C# delegates</title><content type='html'>Delegates in C# serve a few common purposes: asynchronous method invocation, event handling and callback functions.  This article builds a nice example that shows all three of these roles in an entertaining format:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sellsbrothers.com/writing/default.aspx?content=delegates.htm"&gt;http://www.sellsbrothers.com/writing/default.aspx?content=delegates.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All of these patterns are very common and good documentation on them is very hard to find.  Kudos to the author!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112352868182009801?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112352868182009801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112352868182009801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112352868182009801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112352868182009801'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/08/many-faces-of-c-delegates.html' title='The many faces of C# delegates'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112300659141600736</id><published>2005-08-02T14:13:00.000-04:00</published><updated>2005-08-02T14:16:31.423-04:00</updated><title type='text'>Prompting for arguments with KDE</title><content type='html'>Today, I needed to make an application shortcut (.desktop file) that prompted for arguments.  I searched Google ten different ways and couldn't find any posts on doing what should be a simple task.  I finally solved the mystery in a highly ghetto way - I used bash to find all binaries that begin with K.  When I saw kdialog I knew how to do it.  Good luck ever finding this on Google:&lt;br /&gt;&lt;br /&gt;server=`kdialog --inputbox "Server to connect to"` ; rdesktop -x l -a 24 -u administrator -g 1024x768 $server&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112300659141600736?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112300659141600736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112300659141600736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112300659141600736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112300659141600736'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/08/prompting-for-arguments-with-kde.html' title='Prompting for arguments with KDE'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112244241496169903</id><published>2005-07-27T01:14:00.000-04:00</published><updated>2005-07-27T01:37:04.046-04:00</updated><title type='text'>Various and sundry</title><content type='html'>HELO blog readers!&lt;br /&gt;&lt;br /&gt;Haha, just kidding!  I have no readers.  I can't prove that without violating the Heisenberg uncertainty principal though.&lt;br /&gt;&lt;br /&gt;ANYHOO...  I've been meaning to update with a wrap-up from vacation.  You know, because I was blogging every day and then, stopped.  That's nothing new from me, but I should make some notes about how things turned out and all...  Basically they turned out great.  I posted a few times about the meaning of the word "Aloha".  I'm the stupidest of haole but I have at least a basic inkling of the real meaning of the word.  You know, the way we (tourists) abuse the word aloha is really symbolic of the way the west has abused Hawaii as a whole.  The simplest way to think of Aloha and Mahalo are as a thought and a blessing.  Aloha, to me, means we are brothers and I love you as myself.  Mahalo I think of as the highest prayer of goodwill/good fortune.  These words are incredibly sacred and powerful words, and the foremost representatives of a really cool philosophy.  I miss Hawaii.  It has definitely been added to the "places to live" list, although that's tempered by a few things.  I don't want to be a net negative to the local infrastructure, etc (Oahu in particular is getting full).&lt;br /&gt;&lt;br /&gt;After Hawaii was California.  I got over the cold in San Francisco but not soon enough to enjoy it.  I remember a meal at a little Italian restaurant with Tracey's uncle Michael (really nice fellow).  I was eating soup to try to stop my nose from running constantly.  In order to eat the soup, I set aside my cough drop which was the only thing preventing constant coughing.  I probably made a worse impression than normal.&lt;br /&gt;&lt;br /&gt;LUCKILY, I did get better in time to have a fun visit to the Jelly Belly factory.  I took the tour and bought some rejected candy.  Those things are ridiculously good.&lt;br /&gt;&lt;br /&gt;Spent a couple of days in LA.  The throughways are complicated, even with a nav system.  I didn't like Rodeo Drive (I am prejudiced against rich people).  I did do a studio tour at Warner Brothers which was interesting (but expensive).  I'm sure I'll visit California again.&lt;br /&gt;&lt;br /&gt;Shuttle launches.  I have tried twice to see the launches.  The first time got scrubbed.  I went out to today's attempt with good intentions only to get shafted by my own stupidity.  I stupidly assumed that 2 hours leeway would be enough.  I only got to within 11 miles of the intercoastal in that time.  My view of today's launch was of everyone on the beeline pulled over with their radio's on looking at NOTHING.  On the way home, I took highway 50 which was much faster.  Found out that people at work had a much better view than I did.  Next launch I'm taking a vacation day and doing this properly.&lt;br /&gt;&lt;br /&gt;An unrelated thought on the "3-tier pattern": I'm working on an app at work that is using a different pattern.  It's more of a 4 tier pattern, and the business logic is totally abstracted from the database engine.  The UI talks to a component that talks to the database and is connected to the business logic.  The database is used to populate objects (via NHibernate).  These objects are sent to a blind business tier.  Typically it's the other way around - the UI talks to the business tier which is fully aware of and talks to a database tier.  I may post a diagram.  I'm very new to this programming stuff but this way seems more encapsulated.  It may be more common when O/R mappers are in use.  Also, there are some patterns that come in handy when the business tier needs database access, such as for logging normal events (aside from exceptions) and I may post an example of that as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112244241496169903?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112244241496169903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112244241496169903' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112244241496169903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112244241496169903'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/07/various-and-sundry.html' title='Various and sundry'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-112109393926898882</id><published>2005-07-11T10:58:00.000-04:00</published><updated>2005-11-16T18:52:22.216-05:00</updated><title type='text'>Getting a shortcut's target in C#</title><content type='html'>The .NET Framework has a lot of handy classes but none that read a shortcut's target. Normally you can add a reference to Shell32, instantiate it, NameSpace over to the shell link hoo-hah and read the target. I couldn't get this to work for a UNC path in an ASP.NET application without changing the account listed in the application pool. I found &lt;a href="http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf"&gt;a doc&lt;/a&gt; that has the file format and wrote a method for reading the data I need:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    &lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;private&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;string&lt;/span&gt;&lt;span style="font-size:85%;"&gt; GetShortcutTarget(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;string&lt;/span&gt;&lt;span style="font-size:85%;"&gt;file)&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Based on shortcut file format documentation by Jesse Hager.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// This reads paths for local files. It would need tweaking if the shortcut&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// pointed to a UNC.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (System.IO.Path.GetExtension(file).ToLower() != ".lnk")&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;throw&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt; new&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Exception("Supplied file must be a .LNK file");&lt;br /&gt;}&lt;br /&gt;FileStream fileStream = File.Open(file,&lt;br /&gt;FileMode.Open, FileAccess.Read);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;using&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (System.IO.BinaryReader fileReader = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;new&lt;/span&gt;&lt;span style="font-size:85%;"&gt; BinaryReader(fileStream))&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// uint constant = fileReader.ReadUInt32(); // Reads the letter "L"&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// byte[] guid = fileReader.ReadBytes(16); // Reads the GUID - another constant&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;fileStream.Seek(0x14, SeekOrigin.Begin); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Seek to flags&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;uint&lt;/span&gt;&lt;span style="font-size:85%;"&gt; flags = fileReader.ReadUInt32(); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Read flags&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;//Results.Text += "&amp;lt;br&amp;gt;" + flags.ToString("x") + "&amp;lt;br&amp;gt;";&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;//Results.Text += "uflags &amp; 1 = " + (uflags &amp;amp; 1) + "&amp;lt;br&amp;gt;";&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; ((flags &amp; 1) == 1) &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Bit 1 set means we have to skip the shell item ID list&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;{&lt;br /&gt;fileStream.Seek(0x4c,SeekOrigin.Begin); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Seek to the end of the header&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;uint&lt;/span&gt;&lt;span style="font-size:85%;"&gt; offset = fileReader.ReadUInt16(); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Read the length of the Shell item ID list&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;fileStream.Seek(offset, SeekOrigin.Current); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Seek past it (to the file locator info)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;long&lt;/span&gt;&lt;span style="font-size:85%;"&gt; fileInfoStartsAt = fileStream.Position; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Store the offset where the file info&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// structure begins&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;uint&lt;/span&gt;&lt;span style="font-size:85%;"&gt; totalStructLength = fileReader.ReadUInt32(); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// read the length of the whole struct&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;fileStream.Seek(0xc, SeekOrigin.Current); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// seek to offset to base pathname&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;uint&lt;/span&gt;&lt;span style="font-size:85%;"&gt; fileOffset = fileReader.ReadUInt32(); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// read offset to base pathname&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// the offset is from the beginning of the file info struct (fileInfoStartsAt)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;fileStream.Seek((fileInfoStartsAt + fileOffset), SeekOrigin.Begin); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// Seek to beginning of&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// base pathname (target)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;long&lt;/span&gt;&lt;span style="font-size:85%;"&gt; pathLength = (totalStructLength + fileInfoStartsAt) - fileStream.Position - 2; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// read&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// the base pathname. I don't need the 2 terminating nulls.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;char&lt;/span&gt;&lt;span style="font-size:85%;"&gt; [] linkTarget = fileReader.ReadChars((&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;int&lt;/span&gt;&lt;span style="font-size:85%;"&gt;)pathLength); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// should be unicode safe&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;string&lt;/span&gt;&lt;span style="font-size:85%;"&gt; target = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;new&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;string&lt;/span&gt;&lt;span style="font-size:85%;"&gt;(linkTarget); &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);font-size:85%;" &gt;// convert the character array to a string&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;return&lt;/span&gt;&lt;span style="font-size:85%;"&gt; target;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;Edit: I'm glad this code is getting some use.  Please consider it public domain, but bear in mind that I make no warranties about the fitness or merchantability of this code for any particular use or purpose.  Apologies about the crazy formatting.  If it works for you feel free to email me: jtatum@gmail.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-112109393926898882?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/112109393926898882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=112109393926898882' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112109393926898882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/112109393926898882'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/07/getting-shortcuts-target-in-c.html' title='Getting a shortcut&apos;s target in C#'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111983468426062624</id><published>2005-06-26T21:11:00.000-04:00</published><updated>2005-06-26T21:11:24.266-04:00</updated><title type='text'>Car Waxing</title><content type='html'>Jamie waxed his car.  You really need to ask him about it! ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111983468426062624?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111983468426062624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111983468426062624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111983468426062624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111983468426062624'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/06/car-waxing.html' title='Car Waxing'/><author><name>Tracey</name><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-8617984.post-111792975839159254</id><published>2005-06-04T19:41:00.000-04:00</published><updated>2005-06-05T17:46:40.716-04:00</updated><title type='text'>Random Thoughts</title><content type='html'>*sigh*&lt;br /&gt;&lt;br /&gt;Back home after a two-week vacation.  Can we go again, please?&lt;br /&gt;&lt;br /&gt;Let's see...Jamie did a great job keeping up with the Hawaii stuff.  I just want to add:&lt;br /&gt;&lt;br /&gt;1) Regarding Maui and the time we got on the road for Hana, I really did want him to sleep in and get his rest :p  &lt;br /&gt;&lt;br /&gt;2) I think my first choice of where to live would be Kuaui, then the Big Island.  Jamie likes Oahu, but it had too much traffic!  He has a point, though: if we had to have jobs, we'd have to live on Oahu :(  But if we win the lottery...! =D&lt;br /&gt;&lt;br /&gt;3) All the people in Hawaii are fantastically friendly.  Like, when we were in Hilo, I took a shuttle into town, and then needed a taxi to get to the airport for my (cancelled due to weather) helicopter excursion.  The taxi driver was very helpful and friendly, and I ended up using him to go to Big Island Candies (mmmm Chocolate!), then to the airport, then from the airport to the ship.  I just called, and he would be there.  Later, when I got back on the ship, Jamie wanted to get out and do &lt;i&gt;something&lt;/i&gt; (not letting his illness totally destroy his vacation, which I admire!), so I gave Joe (the taxi driver) a call, and arranged for him to take us on a little tour.  We saw Rainbow Falls (very pretty!) and then went to the Mauna Loa Macadamia Nut Factory.  What gets me is that you really don't get any deals on the macs even at the factory...I mean, come on--they aren't shipping them, there isn't a normal retailer mark-up...but the macs still weren't &lt;i&gt;cheap&lt;/i&gt; by any stretch of the imagination.  Joe told us lots of insider stuff too, so it was a kitschy trip (sp?).&lt;br /&gt;&lt;br /&gt;4) No helmet...hard, solid pavement...would YOU want to scream around at 35 MPH on a moped?!?  Yeah, I got more used to it, but it still bothered me a bit.  But I didn't want to give into my fears, so I got better and went faster.  As for the sunglass thing...well duh!  You drive along on a moped at 35 MPH and the wind is really in your eyes...and my glasses don't begin to fully cover them.  So I bought some cheap (in construction, not actual cost :p) sunglasses that were almost like goggles!  Problem solved, no more tearing eyes.&lt;br /&gt;&lt;br /&gt;5) Our luau in Maui sucked donkey eggs (I can say that on my own blog, right?)  Even if the weather hadn't delayed it, it still would have sucked donkey eggs.  I should have complained and gotten our full $$ back, not just the 30% we all got.&lt;br /&gt;&lt;br /&gt;OK so after Hawaii, we flew into LAX and rented a car.  We drove straight up to San Francisco for two days.  Let me just say that the weather on our entire trip was fabulous!  (except for the day in Hilo where it got my helicopter trip cancelled :p).  San Francisco was 70-75 each day, blue skies, gorgeous.  We went to Alcatraz, had italian one night at a real, family-owned for decades, small italian restaurant, had lunch at Boudin's Cafe (bakery famous for it's sourdough), went to Ghiradelli (sp?), had dinner at a restaurant in Chinatown, met my uncle Michael's girlfriend, Martina, who was a interesting and very animated french woman....just had a lot of fun!&lt;br /&gt;&lt;br /&gt;We then drove back to LAX.  We got in late, after midnight, and stayed two nights.  That first morning we got up and drove down Sunset Blvd., then down through Beverly Hills ("Rodeo Drive, baby!"), stopping in Hollywood near the Chinese Theater.  We had lunch there at Miceli's, which claims to be Hollywood's oldest italian restaurant (circa 1949), where, after tasting their rolls, Jamie declared me a genius (for selecting the restaurant).  &lt;br /&gt;&lt;br /&gt;We rushed from there to the Warner Bros. studios, where we took the VIP tour (meaning we got the privelege to pay ~$35/each to be shown their stuff :p).  We saw sets for "The West Wing", "Gilmore Girls", the exterior set for "ER", which neither of us knew was filmed in LA (and saw the actual spot that the helicopter was dropped on Dr. Romano!).  There is a museum there at the studios as well, and I got to sit and be sorted by the sorting hat from the Harry Potter movies!  I was sorted as Gryffindor, and Jamie was Slytherin (hissssssssssssssssssss! :p)  He could care less, though! :)&lt;br /&gt;&lt;br /&gt;I'll let Jamie tell the rest, I'm done for now.&lt;br /&gt;&lt;br /&gt;OH!  PS!  Jamie let me shop the last night at the Nortstrom Rack.  I didn't buy anything, but he let me look and I &lt;i&gt;could&lt;/i&gt; have bought something if I had found something!!&lt;br /&gt;&lt;br /&gt;PPS: I think I'm getting sick now.  I most definitely blame Jamie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111792975839159254?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111792975839159254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111792975839159254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111792975839159254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111792975839159254'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/06/random-thoughts.html' title='Random Thoughts'/><author><name>Tracey</name><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-8617984.post-111748548453281974</id><published>2005-05-30T16:38:00.000-04:00</published><updated>2005-05-30T16:38:04.536-04:00</updated><title type='text'>Day 9 - Maui</title><content type='html'>After waking up at 1 AM feeling terrible, I got up at 8 AM and felt much better than yesterday.  I'm bringing all my cough drops to dinner to give away to my travel companions (four of whom have gotten sick).  The Sepocol was a big hit.&lt;br /&gt;&lt;br /&gt;Our big plan was to wake up at like... 6 or something today so we could get on the road to Hana nice and early.  It seemed like a good idea since the road is supposed to be pretty long and the idea was supported by the uber guidebook of the century, Maui Revealed or whatever it's called.  Well, apparently Tracey made an executive decision to let me sleep in or something (funny how I got up before her) so we didn't get out until around 9.  Then, we tooled around at KMart and stuff and finally hit the road at 11.  &lt;br /&gt;&lt;br /&gt;The driving was pretty interesting.  If you enjoy driving I really suggest you try this.  I do get carsick and this is the only time I have ever gotten a little bit nauseous as the driver (normally being the passenger or worse, the back seat makes me ill).  Tracey took a ton of pictures all of which are fantastic.  It's hard to believe that some of them are real.  I have a billion to post but no time really.&lt;br /&gt;&lt;br /&gt;Speaking of no time, we were really in a hurry so there was a lot to miss on this road.  We did see all the waterfalls visible from the road and then some (a couple of smaller ones at the side that were not mentioned in the guidebook).  We stopped and ate at Halfway to Hana (really 2/3 of the way to Hana).  We stopped for pictures four or five times.  Unfortunatley, we had to turn around pretty much as soon as we arrived in Hana.  One really memorable moment was coming out of one turn and seeing a road about 500 feet above our current altitude in the next mountainside.  I thought there was no possible way we could get up there but after a few hairpin turns we started the ascent.  This road has tons of altitude changes so this wasn't unusual but it was interesting to really see ahead of time just how high we were going.  The cars on this higher road looked so small.&lt;br /&gt;&lt;br /&gt;Put the bags out tonight with White tags on a Pink tagged floor.  White is the color used by 8, which is Steve's floor and leaves earlier than ours.  They said we can do it so we'll see how it goes when we get off tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111748548453281974?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111748548453281974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111748548453281974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111748548453281974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111748548453281974'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-9-maui.html' title='Day 9 - Maui'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111734226099507535</id><published>2005-05-29T00:51:00.000-04:00</published><updated>2005-05-29T00:51:01.026-04:00</updated><title type='text'>Day 8 - Maui</title><content type='html'>I feel sicker than ever.  My throat is so sore I can barely swallow.&lt;br /&gt;&lt;br /&gt;Tonight, on the bus to the Lu`au, I ran out right as we pulled in to the hotel where it was being held.  That shouldn't be a problem because every hotel gift shop has cough drops.  Unfortunately, it rained pretty hard right before we got there.  All 13 busses had to wait for 30 minutes.  I thought I was going to die.  Eventually I got off with the "I have to go to the bathroom" excuse and bought some.  Tracey also needed some gum because her breath was totally garlicky.&lt;br /&gt;&lt;br /&gt;We rented a car today and drove to Lahaina.  We were going to just drive around but again I was out of cough drops and had to go to Long's.  Long's is the Hawaii drug store and seems to be almost half as prolific as ABC stores, which is quite an accomplishment.  I bought some uber halls or something that had benzine and menthol.  They work pretty well.  Unfortunately I left most of them in the rental before the Lu`au.  After we found the Long's we didn't really have time to explore Lahaina.  Driving through it reminded Tracey of Key West and I agree.  We had to get back to the ship for her Spa appointment.&lt;br /&gt;&lt;br /&gt;The rental is a 2005 Jeep Grand Cherokee.  It has a nice trip computer and a weird shifter.  I think it's in 4 wheel drive mode all the time as well.  The theory is that we will need this to drive "the road to Hana", but Maui Unleashed or whatever it's called disputes that idea.  We'll see.&lt;br /&gt;&lt;br /&gt;You know, I can't stop thinking about Maui X-stream Software and the surrounding controversy when I'm in Maui and to a lesser extent Hawaii at large.  I can't imagine that there are even a dozen programming jobs in Maui.  Real programming jobs are probably pretty hard to come by even on Oahu.  It's a very unusual setting for this kind of controversy.  GPL violations are totally against the "Aloha spirit" I'm pretty sure.  I should have gotten their address and checked it out if it was nearby.&lt;br /&gt;&lt;br /&gt;I need to create an avatar of Elvis from Blue Hawaii.  I have a specific scene in mind for a still or an animated gif.  When I get back home I'll have to grab the DVD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111734226099507535?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111734226099507535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111734226099507535' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111734226099507535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111734226099507535'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-8-maui.html' title='Day 8 - Maui'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111724152923848060</id><published>2005-05-27T20:52:00.000-04:00</published><updated>2005-05-27T20:52:09.303-04:00</updated><title type='text'>Hmm</title><content type='html'>This is hot: http://www.daskeyboard.com/&lt;br /&gt;&lt;br /&gt;I want one.  I think I can Martha Stewart one with some electrical tape.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111724152923848060?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111724152923848060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111724152923848060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111724152923848060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111724152923848060'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/hmm.html' title='Hmm'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111719680689355148</id><published>2005-05-27T08:26:00.000-04:00</published><updated>2005-05-27T08:26:46.930-04:00</updated><title type='text'>Day 7 - Kona</title><content type='html'>Jason called.  Apparently several people have booked the December cruise.  How exciting!  I hope we get a lot of people, it's so fun to cruise with people you know.  Unless you have an upper respiratory infection.  I really haven't seen our travel companions much, and when I do I"m feeling nervous about being possibly contagious.&lt;br /&gt;&lt;br /&gt;Today's the day I was supposed to SCUBA.  Damn it.  I have my C card and a bunch of gear (not my wetsuit, it doesn't fit - too fat).  I hope I get well enough before I leave Oahu at least.  I have to do something this trip.  The Kawai snorkeling was good if nothing else and it used the majority of the gear I took.&lt;br /&gt;&lt;br /&gt;Took an early tender to Kona.  I heard a comparison from a shuttle bus driver (in Kawai) that Hilo and Kona were opposites in many ways.  Hilo is cheap, Kona is expensive.  Hilo is green and Kona is all moon-like and rocky.  This is not entirely true.  As I look out the window of the longboard bar (a very reliable place to get 1xRTT service on the Pride of Aloha) I see a lush hillside.  The Kona hills seem to go on forever.&lt;br /&gt;&lt;br /&gt;We rented mopeds in town ($25 apiece for 5 hours, very reasonable) and drove around the island such as we could.  At the beginning, Tracey was having problems which for some reason caused her to need another pair of sunglasses.  Also, she didn't like approaching the top speed of the mopeds.  After climbing a few hills and looking out over the bay, she got used to it.  The bikes became the limiting factor - trying to share the road with cars on a 35 MPH stretch when the bikes went 20 MPH uphill was tough.  We pulled over a lot.&lt;br /&gt;&lt;br /&gt;We went in to two housing areas.  One was up a hill and was the highest area we drove to.  The other was one Tracey randomly drove into because she saw a sales office sign.  It was a new development where all the houses can see the ocean because of the grade of the hill.  Prices started at 750K and went to 1.3 million for a two story house.  We &lt;b&gt;were&lt;/b&gt; told that Kona was the expensive side.&lt;br /&gt;&lt;br /&gt;Watched the tenders get loaded on to the ship, watched Kona fade off into the mist, and caught up on blog postings.  I'm still feeling sick today.  I didn't eat too much at dinner.  Now it's 1 AM, and the pain from my ears and throat has woken me up.  Going to try to surf the net a little bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111719680689355148?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111719680689355148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111719680689355148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111719680689355148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111719680689355148'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-7-kona.html' title='Day 7 - Kona'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111716445780868167</id><published>2005-05-26T23:27:00.000-04:00</published><updated>2005-05-26T23:27:37.813-04:00</updated><title type='text'>Day 6 - Hilo</title><content type='html'>Woke up very sick today.  My throat was extremely sore.  Not only that but I'd been asleep for like...  20 hours or something.  Tracey does some investigating and determines that I have to see the doctor so at least we can cancel my shore excursions.  The volcano one is scheduled for today and SCUBA tomorrow - ack!&lt;br /&gt;&lt;br /&gt;The doctor is nice and ($75 later) dispenses some pills, some tussin and some losenges.  The pills are "Diclofenac Sodium".  I was too sick to discuss anything with him or ask what this medicine was.  According to Google it's a "non-steroid anti-inflamitory".  According to the $75 invoice he left in my room I have URI, which I am guessing means upper respiratory infection.  I'm really bummed out about the volcano and scuba.&lt;br /&gt;&lt;br /&gt;The cruise line partly made up for it.  At 10PM Hawaiian time (which is like...  9AM Eastern or something - there's a 5 or 6 hour time difference depending on daylight savings) we drove by the lava flows.  Wow.  What an awesome sight.  There's no way to get good pictures or video of this, you have to be there.  These volcanoes add hundereds of acres of land every year.&lt;br /&gt;&lt;br /&gt;I didn't really get to see Hilo too much.  I did venture out a little bit to go to the Mauna Loa factory and gift shop.  Macadameas are the best.  I will eat 1 million.  They don't seem to be any cheaper here unfortunately.&lt;br /&gt;&lt;br /&gt;In the back of my mind I kept thinking about how Bill T says that Hilo is his fav and he wants to move there.  The taxi driver that took me to the factory says that Hilo is the cheapest on Hawaii, even compared to Kona which is on the other side of the big island.  Houses average about $300,000 which is not outside the realm of possibility.  The problem would be finding a computer job.  Plus, these islands are a little vulnerable to things like hurricanes, tsunamis, earthquakes and in the case of the big island, volcano eruptions.  Hawaiian women might make up for it all though.  I wish I could see this the way Bill might have but I'm too sick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111716445780868167?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111716445780868167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111716445780868167' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716445780868167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716445780868167'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-6-hilo.html' title='Day 6 - Hilo'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111716337532725289</id><published>2005-05-26T23:09:00.001-04:00</published><updated>2005-05-26T23:09:35.326-04:00</updated><title type='text'>Day 5 - Kawai</title><content type='html'>Steve, Andrea and I were trying to get back to Hanalei bay, one of the areas we saw during the movie tour, to do some swimming and snorkeling.  Apparently it's just way to far from the port to be practical to get to (one cab quoted us $80).  Andrea found a shuttle bus driver who was offering a shuttle to Poipu beach.  The price was right so on a whim we took it.  Fantastic!  The snorkeling was great.  TONS of fish, all different colors.  Schools swimming directly under you.  Each piece of coral hiding urchans in every crevace.&lt;br /&gt;&lt;br /&gt;The ship left at 1 PM, so I only had about an hour and a half in the sun.  Just long enough to get very badly burned on my back.  Once we got back to the ship I fell asleep at about 2PM for some reason.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111716337532725289?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111716337532725289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111716337532725289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716337532725289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716337532725289'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-5-kawai.html' title='Day 5 - Kawai'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111716336048502296</id><published>2005-05-26T23:09:00.000-04:00</published><updated>2005-05-26T23:09:20.486-04:00</updated><title type='text'>Day 4 - Kawai</title><content type='html'>Kawai is really cool.  It's nicknamed "the garden island".  We did kind of a long tour called Hollywood in Hawaii.  Kawai has hosted a lot of movies, some which you wouldn't expect.  They gave us a long excel spreadsheet and an annotated map.  As we approached scenes, a DVD player showed a short clip.&lt;br /&gt;&lt;br /&gt;One of the stops was the Coco Palms, which as far as I can tell was only featured in Blue Hawaii.  Elvis apparently liked the place and had his own suite.  We spent way too long (in my estimation) tooling around this hotel property which has been unused since 1992.  It's a big mess at this point although some people think it will be restored and reopened soon.  The property was recently purchased for $10 million.  I think it will need $50 million of work.  Steve thinks $200 million.&lt;br /&gt;&lt;br /&gt;The American crew on the ship is strange.  It's really unusual to hear the chatter of the employees in English.  Furthermore they talk the way US employees talk, IE about their boss, their shift, co-workers, etc.  The service has been fair so far except for dinners.  The dinner service is terrible.  Extremely slow.  Even the maintenance crew is American.  One thing that's weird is that some of the employees are middle-aged and overweight which is unusual on a cruise - but not unwelcome.  I don't mind a real crew on a ship rather than the artifically young crews from international cruises - as long as the service is great.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111716336048502296?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111716336048502296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111716336048502296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716336048502296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716336048502296'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-4-kawai.html' title='Day 4 - Kawai'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111716333562465930</id><published>2005-05-26T23:08:00.001-04:00</published><updated>2005-05-26T23:08:55.626-04:00</updated><title type='text'>Day 3 - Waikiki</title><content type='html'>Pearl Harbor.  December 7th is a date I won't soon forget.  Visited the USS Arizona memorial with Steve, Andrea, and Tracey.  What an experience.  All I can do is offer a moment of silence in memory of those lost.&lt;br /&gt;&lt;br /&gt;Boarded the Pride of Aloha.  The ship is on Pier 11.  It's right next to a shopping mall which I think is called the clocktower mall.  There's a neat clocktower which we need to visit when we have the camera on the return trip.&lt;br /&gt;&lt;br /&gt;The ship is OK, I'm still getting used to it.  Finally ran in to Dave and Pam today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111716333562465930?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111716333562465930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111716333562465930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716333562465930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716333562465930'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-3-waikiki.html' title='Day 3 - Waikiki'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111716328400030649</id><published>2005-05-26T23:08:00.000-04:00</published><updated>2005-05-26T23:08:04.040-04:00</updated><title type='text'>Day 2 - Waikiki</title><content type='html'>The day started with hopping in a rented 2005 Mustang convertible and heading to the Dole plantation.  Someone should have told me that pineapples are so awesome.  I never really ate them before, but now...  I'm addicted.   I think they put crack in them at the Dole plantation.  Since I've been there I've eaten something like 1200 pineapples.  It takes almost 2 years to grow a pineapple, so I won't be trying to grow these at home, but I will be buying them at the Publix.&lt;br /&gt;&lt;br /&gt;So, around 1920 (if I remember right, it's been a few days now), James Dole heads to Hawaii and realizes pineapple grows really well here.  He buys up a ton of land really cheap, brings in a crapload of foreign labor from China, the Philipines, and Portugal (not enough Hawaiians to do the job I guess).  We took a brief tour that shows all the Dole workers working at a very leisurly pace.  I wonder what the working conditions were like back in the early days of the Dole plantation.  What were they paying these laborers (if anything)?&lt;br /&gt;&lt;br /&gt;After the Dole plantation, we took the Mustang around Oahu.  We rode around the north shore (traffic was terrible!) and finally caught H3 back to H1 to Waikiki.  H3 had a neat tunnel through the mountains in the center of the island.  Spiffy.  &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111716328400030649?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111716328400030649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111716328400030649' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716328400030649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111716328400030649'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-2-waikiki.html' title='Day 2 - Waikiki'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111666120085200359</id><published>2005-05-21T03:40:00.000-04:00</published><updated>2005-05-21T03:40:00.976-04:00</updated><title type='text'>Day 1 - Waikiki</title><content type='html'>Waikiki is on Honolulu.  It was about 30 minutes from the airport in a cab.  Tracey decided cabs were the best way to go and it paid off - we got a limo for a cab.  The fare was $40 to the hotel for 4 which is roughly what the shuttle would have cost.&lt;br /&gt;&lt;br /&gt;Thoughts:&lt;br /&gt;&lt;br /&gt;Open air everything - when we arrived, the weather felt a lot like the weather in Orlando.  At first it seemed that we really hadn't left even.  Eventually you notice that a lot of the island is open air.  Our hotel lobby has no roof over half of it, and few walls.  This requires cooperative weather and no mosquitoes.  Florida fails both requirements.  Now I understand why the term Lanai is so popular.  Is the weather like this year round?&lt;br /&gt;&lt;br /&gt;Aloha - The translation I heard was that Aloha means hello and goodbye, but there is more to this word than those two thoughts.  I saw a number of usages that seem to infer some sort of Hawaiian identity or culture.  Need to research that more.&lt;br /&gt;&lt;br /&gt;ABC stores - Waikiki has more of these than Orlando has Walgreens and 7-11's combined.  Some blocks have two.  Our hotel has at least one inside and at least one outside.  It's some sort of convenience store.  Probably Hawaiian mafia.&lt;br /&gt;&lt;br /&gt;Japanese - The Japanese are everywhere.  It seems to dominate English as the language and Japanese tourists seem to outnumber American tourists.  Do more Japanese visit Hawaii than Americans or is this a Honolulu or Waikiki phenomenon?&lt;br /&gt;&lt;br /&gt;Verizon's 1x-RTT service is giving me 400 and 500 pings.  I was getting 300s in Lake Mary so I guess that the transcontinental link may be a factor.  Signal strength in the Hotel room is 100%.&lt;br /&gt;&lt;br /&gt;Time zone - I say it's 5 hours behind Eastern, Steve says 6 hours.  We'll see :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111666120085200359?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111666120085200359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111666120085200359' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111666120085200359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111666120085200359'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/day-1-waikiki.html' title='Day 1 - Waikiki'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111652013135074988</id><published>2005-05-19T12:28:00.000-04:00</published><updated>2005-05-21T03:44:35.403-04:00</updated><title type='text'>Stupid machine!</title><content type='html'>The candy machine here is out of quarters or something, so don't use it or you will be shorted at least 25 cents!  You have been warned.&lt;br /&gt;&lt;br /&gt;I always wanted to write a stupid blog entry like this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111652013135074988?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111652013135074988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111652013135074988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111652013135074988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111652013135074988'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/stupid-machine.html' title='Stupid machine!'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111628653769163289</id><published>2005-05-16T19:35:00.000-04:00</published><updated>2005-05-16T19:35:37.733-04:00</updated><title type='text'>A break</title><content type='html'>Got pulled over for speeding in Louisiana.  I was on the very lonely stretch of highway between Baton Rouge and Shreveport.  The officer was parked in the tall grass growing in the center.  As I approached, I spotted him, looked down at the spedometer (it said 80 as I recall), and looked back up.  He was starting to pull out so I started to pull over.  Eventually he was coming up behind me with the lights on so I pulled off to the side.&lt;br /&gt;&lt;br /&gt;84 in a 70 was what he read, and he was probably right.  He asked where I was heading - I said Dallas for simplicity.  He took my license and went back to the car.  When he came back, he handed me the ticket and clipboard and asked me to sign.  As I signed, he said he was writing me a ticket for a seatbelt infraction.  He said it would be something like $25.  That's a major break and it was a big surprise.  I thanked him and drove off, keeping a much closer eye on the spedometer (especially since I couldn't tell if he was following me).&lt;br /&gt;&lt;br /&gt;My first thought was that I got a break because I was in Tracey's beater.  I'm all stuffed in there so maybe he felt some sympathy.  Others have suggested that it was because I pulled over right away.  That's a possibility I suppose.  I was just happy to get a break.&lt;br /&gt;&lt;br /&gt;There's a picture I want to post from a prior trip through Louisiana.  It's just a little landmark that I always notice when driving I-10.  Maybe I will post it later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111628653769163289?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111628653769163289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111628653769163289' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111628653769163289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111628653769163289'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/break.html' title='A break'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111592137198196503</id><published>2005-05-12T14:09:00.000-04:00</published><updated>2005-05-12T14:16:27.420-04:00</updated><title type='text'>"Oh, SHIT" moments</title><content type='html'>You ever have a moment where you realize you just MAJORLY screwed up?  That's an "oh, shit" moment.  I remember one when I was working at my first real job, a big government defense contractor.  I was doing upgrades of desktops from Windows 3.1 to Windows 95.  The basic steps were copy all their data to a shared drive, ghost the box and restore the data.  This particular incident, the setup was a little challenging because the engineer had an unusual system configuration.  I spent some extra time working out the details of the upgrade, getting everything ready, and then I slipped in the ghost disk and started reloading his hard drive from the image.  "Wait... did I back up his data?"  Oh, SHIT!&lt;br /&gt;&lt;br /&gt;We had to buy a data recovery program to get everything back.  He got back his important files and was back up and running with Windows 95.  I had a great boss and everything worked out in the end so the worst part was the initial moment of dread.&lt;br /&gt;&lt;br /&gt;These guys probably weren't so lucky.  This is an incident that happened in 1993 while working on the Noaa N-prime satellite.  On this particular day, the satellite was on a special platform that holds it in place and can rotate it from an upright to a horizontal position.  Like any big company, there are a lot of procedures you need to follow when doing anything and they started going down the checklist of things to do.  After everything was cleared, they started moving the platform to the horizontal position.  When it reached 13 degrees of inclination, the satellite slid off the platform, got caught on the lip and tipped over.  Oops!  The person responsible for verifying the bolts that attach the satellite to the platform used a report to verify, rather than looking at the bolts.  &lt;a href="http://www.spacetoday.net/Summary/2230"&gt;One report&lt;/a&gt; estimated that Lockheed may pay $400 million for the accident.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img61.echo.cx/my.php?image=satellite36ps.jpg" target="_blank"&gt;&lt;img src="http://img162.echo.cx/img162/1813/satellite3c2kw.jpg" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;I like this picture.  The guys in the background are looking at the fallen satellite, arms folded.  Yep, it fell!  Click to enlarge.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img61.echo.cx/my.php?image=satellite22rm.jpg" target="_blank"&gt;&lt;img src="http://img61.echo.cx/img61/9645/satellite22rm.th.jpg" border="0" /&gt;&lt;/a&gt;&lt;a href="http://img61.echo.cx/my.php?image=satellite17od.jpg" target="_blank"&gt;&lt;img src="http://img61.echo.cx/img61/652/satellite17od.th.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Some different angles with clicky goodness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111592137198196503?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111592137198196503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111592137198196503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111592137198196503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111592137198196503'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/oh-shit-moments.html' title='&quot;Oh, SHIT&quot; moments'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111591244320514030</id><published>2005-05-12T11:35:00.000-04:00</published><updated>2005-05-12T11:40:43.836-04:00</updated><title type='text'>Guild Wars Screenshot Manipulation</title><content type='html'>Yes, I bought the game.  It's wonderful eye-candy; haven't played enough to comment on the gameplay.  Although first impressions are that gameplay won't be anything exciting.  Warcraft is still the best I've seen so far.&lt;br /&gt;&lt;br /&gt;Anyways, here's the original screenshot:&lt;br /&gt;&lt;img src="http://img212.echo.cx/img212/4349/sigorig4ss.jpg"&gt;&lt;br /&gt;&lt;br /&gt;And my manipulation:&lt;br /&gt;&lt;img src="http://img207.echo.cx/img207/207/rowansig6rf.jpg"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111591244320514030?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111591244320514030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111591244320514030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111591244320514030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111591244320514030'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/guild-wars-screenshot-manipulation.html' title='Guild Wars Screenshot Manipulation'/><author><name>Tracey</name><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-8617984.post-111585577447889132</id><published>2005-05-11T19:56:00.000-04:00</published><updated>2005-05-11T19:56:14.556-04:00</updated><title type='text'>All my lava questions have been answered</title><content type='html'>Answer 1.  A shovel.&lt;br /&gt;&lt;br /&gt;Answer 2. Yes, you can cook with lava.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dolphinbayhilo.com/cook.html"&gt;Cooking with lava&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111585577447889132?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111585577447889132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111585577447889132' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111585577447889132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111585577447889132'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/all-my-lava-questions-have-been.html' title='All my lava questions have been answered'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111582443194729452</id><published>2005-05-11T11:13:00.000-04:00</published><updated>2005-05-11T14:19:39.850-04:00</updated><title type='text'>Wireless digital camera</title><content type='html'>How come nobody is making a bluetooth digital camera yet?  I would totally photoblog if I could just snap pics and what not and have them sync up to my computer when the camera gets in range.  The usb cable / card reader bullshit is just annoying.&lt;br /&gt;&lt;br /&gt;Sony has one (DSC-FX77) but it came out in 2002 and doesn't seem to be available.  A noname company Concord makes one but it's more of a webcam like toy than a digital camera.  Kodak is working on a wi-fi camera but it's expensive and BT seems more appropriate for a transfer technology (standard profiles for interoperability, short range, good availability).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111582443194729452?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111582443194729452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111582443194729452' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111582443194729452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111582443194729452'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/wireless-digital-camera.html' title='Wireless digital camera'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111575585462226572</id><published>2005-05-10T16:10:00.000-04:00</published><updated>2005-05-10T16:15:09.780-04:00</updated><title type='text'>Lava</title><content type='html'>The upcoming trip to Hawaii means that I could possibly see some lava up close.  I read that it's illegal to remove anything from a national park (including magma) but I have been fascinated with the idea of getting some molten lava.  I've done a tiny amount of research and discussed this with my co-workers and we have some ideas.&lt;br /&gt;&lt;br /&gt;First, I suppose when I am talking about getting some lava, I mean surface flows.  While most of the lava from the current eruption at Kilauea travels through underground lava tubes, some lava fields from there have a dull red glow - evidence of an active and at least partially molten surface.  The serious molten lava that travels through the lava tubes is about 2000 degrees farenheit.  So, the dim red glows sometimes seen at the surface that I am interested in are somewhere between 1000-1500 degrees.&lt;br /&gt;&lt;br /&gt;My first idea here was to poke the lava with a stick.  The thinking here was that a small amount would stay attached to the stick and, because it is removed from the exposure of the surrounding burning hot magma, it would cool down quickly.  Even if the stick catches on fire, I thought, it might cool enough when not being poked in to retain it's basic stick shape and hold on to some of the lava.  This idea still has not gained any traction here at the office, despite my finding that searching Google for "poke lava with a stick" returns a result.&lt;br /&gt;&lt;br /&gt;Jason suggested some sort of container on a stick, like a coffee can.  I told him the sample size I was looking for was smaller, plus given the illegality I'm thinking about something less conspicuous.  "How about a can of dip on a stick?"  A can of dip is too cardboardey.  "Altoids tin attached to your shoe!"  This is a definite possibility.  The Altoids tin would certainly sustain considerable damage, but I think it would also probably successfully get at least a little lava maybe.&lt;br /&gt;&lt;br /&gt;Rick says he saw someone on TV with a giant heat resistant ladle.  If I see one on the way I will see how much it is.  Maybe K-Mart or Williams Sonoma would have something like this.  If the price is right I'll consider it.  Keep your eyes open for me.&lt;br /&gt;&lt;br /&gt;Bill was the office naysayer.  He didn't like any of these ideas.  He said the stick would immediately burn and the Altoids would melt.  His only suggestion for getting lava was to check Ebay.  That's why we call Bill "Mr. Useless."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111575585462226572?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111575585462226572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111575585462226572' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111575585462226572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111575585462226572'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/lava.html' title='Lava'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111567756284875491</id><published>2005-05-09T18:26:00.000-04:00</published><updated>2005-05-09T18:48:13.503-04:00</updated><title type='text'>More cryptic notes-to-self</title><content type='html'>Mike at work is loading Gentoo.  He didn't want to use genkernel to build the kernel and started with a clean .config.  We ran in to some interesting roadblocks when trying to get an initrd to work.  This crap is barely documented anywhere so here's my notes.&lt;br /&gt;&lt;br /&gt;initrd has two direct prerequisites in the kernel - ext2 (file system) and ramdisk support (block device).  Ramdisk support must be compiled with the enable initrd support option (this sounds dumb, but it got me).&lt;br /&gt;&lt;br /&gt;mkinitrd checks modules.conf for any scsi_hostadapter modules, which are automatically added.  It would be wise to ensure these modules were enabled in the .config.&lt;br /&gt;&lt;br /&gt;To mount an initrd to peek in to the linuxrc:&lt;br /&gt;&lt;br /&gt;# cp /boot/initrd-blah-blah.img /tmp&lt;br /&gt;# mv /tmp/initrd-blah.img /tmp/initrd.gz # for simplicity&lt;br /&gt;# gunzip /tmp/initrd.gz&lt;br /&gt;# mount -o loop /tmp/initrd /some/mount&lt;br /&gt;&lt;br /&gt;The gentoo mkinitrd wanted to change /proc/sys/kernel/real-root-dev.  In order for that to work, I think the kernel needs sysctl support enabled (general setting).&lt;br /&gt;&lt;br /&gt;Finally, there was a failure when nash tried pivot_root - it pivots the current root to /initrd on the real root.  That directory didn't exist.  Also, for some reason passing root=/dev/sda3 didn't work.  root=0803 (device major/minor id for sda2) did.  Still haven't tracked that one down.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111567756284875491?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111567756284875491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111567756284875491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111567756284875491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111567756284875491'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/more-cryptic-notes-to-self.html' title='More cryptic notes-to-self'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111567148990286035</id><published>2005-05-09T16:44:00.000-04:00</published><updated>2005-05-09T16:47:39.783-04:00</updated><title type='text'>The US Cruise Industry</title><content type='html'>I'm taking a cruise to Hawaii in a couple of weeks.  I like to research, so I did a bit of research on the history of NCL's America operations.  The US cruise industry has a long and probably boring history.  Read on only if bored.&lt;br /&gt;&lt;br /&gt;A company that operated a few small ships around the country called "American Classic Voyages" in 1999 decided to run their largest venture yet by far - an American flagged Hawaiian cruise line.  The American flagging is important - the Jones act (aka the "PSA") is a law that requires a cruise voyage to include a non-US port if the ship isn't US flagged.  To put it another way, if, say, Carnival brought one of their ships in (none of them are US flagged), picked you up on Honolulu, and dropped you off without sailing to a foreign port, they would be fined $200 x the number of passengers.  ACV saw an opportunity here - a US flagged line could cruise around Hawaii for a week and not have to do the day-and-a-half trip to the nearest non-US port in the Fanning Islands.&lt;br /&gt;&lt;br /&gt;ACV had to do a lot of lobbying to implement their plan.  The act stipulates that an American flagged cruise ship must be American built as well as American staffed.  ACV planned to buy one (foreign-built) cruise ship to start out and build another two ships in the US.  A modern cruise ship had never before been built in the US due to high manufacturing costs.  This never before attempted feat was made possible with a big loan guarantee from the US ($1.1 billion).&lt;br /&gt;&lt;br /&gt;ACV's first move was to purchase a ship formerly owned by Holland America Lines - the Nieuw Amsterdam for $114 million.  Through a special exemption granted thanks to their lobbying, they were allowed to register this ship in the US even though it wasn't built there.  They still had to meet the requirements of staffing the ship in the US.  Meanwhile, the government also granted subsidies to one of it's favorite subcontractors, Northrop Grumman who ran the shipyard responsible for building the two new ships.  The two new ships were to be completed in February 2004 and February 2005.&lt;br /&gt;&lt;br /&gt;Fast forward to October 2001.  Both Northrop and ACV are in neverending mediation because both sides blame the other for problems resulting in delays that have set back construction a year to 18 months.  Even worse, ACV ran out of money, claiming that the terrorist attacks ruined their bookings.  The bankruptcy means the US government (meaning you, the taxpayer) needed to cover their loan guarantee to the tune of $200 million net.  What does $200 million buy?  Most of the hull of the first ship and a bunch of construction equipment.  A rip off considering the amount of work needed to be done.  Consider this - NCL bought the partial hull, the construction material, and some construction equipment for $2 million.&lt;br /&gt;&lt;br /&gt;The ship ACV bought (the Nieuw Amsterdam) was still under mortgage from HAL, so they took it back and renamed it back to the Nieuw Amsterdam.  It was later sold.&lt;br /&gt;&lt;br /&gt;NCL is the current winner of government favor.  They were granted the only exception to the "American built" provision of the law for up to three ships.  The only terms left to meet are the "American staffing" terms.  Their exception only allows for sailings in Hawaii.  The Pride of Aloha was another ship renamed and sailed in.  The upcoming Pride of America is the result of taking the first hull partially built by ACV/Northrop and bringing it to a European shipyard to be finished.&lt;br /&gt;&lt;br /&gt;http://www.maritimematters.com/patriot.html - history of the Nieuw Amsterdam&lt;br /&gt;&lt;br /&gt;http://www.marinelog.com/DOCS/NEWSMMIII/MMIIIJan22b.html - A rundown&lt;br /&gt;of the legislative mess (greased palms)&lt;br /&gt;&lt;br /&gt;http://www.sealetter.com/Oct-99/alancol.html - A nice summary of how&lt;br /&gt;the Jones act affects cruises&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111567148990286035?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111567148990286035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111567148990286035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111567148990286035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111567148990286035'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/us-cruise-industry.html' title='The US Cruise Industry'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111544093305851203</id><published>2005-05-06T19:04:00.000-04:00</published><updated>2005-05-07T00:42:13.113-04:00</updated><title type='text'>The Hitchhikers Guide to the Galaxy</title><content type='html'>I just realized that I haven't posted about this movie yet!  I saw it the day it came out, despite the mixed reviews.  I liked it!  There were a few moments where I even got emotional seeing these incredible stories finally come to movie form.  &lt;br /&gt;&lt;br /&gt;I saw some criticisms that were right and some that were wrong.  For instance, yes, the love story (stories) is (are) crummy and detracts from the story.  No, Mos Def is actually quite good as Ford.  Yes, the story can seem disjointed to someone who isn't fully aware of the backstory.  No, the guide entries were very good and certainly met my expectations in narration and animation.&lt;br /&gt;&lt;br /&gt;The first review I read (by Adams biographer MJ Simpson) was horribly bad.  It was so bad that I expected the movie to be an unrecognizable shell of the story it depicts.  This was not the case.  There were several elements that I was sure even a moderately good movie would skip that made it in to this version.  For instance, the mental monologue of the sperm whale.  Fantastic.&lt;br /&gt;&lt;br /&gt;Tracey hasn't read the books in a long time and doesn't really remember them.  She picked up on a number of story elements that it seemed the movie didn't explain well.  For instance, she knew what Zaphod did to his brain, but not why.  The Heart of Gold didn't get the explanation it deserves.  The infinite improbability drive was only partially explained and more work could have been done here.  The drive in particular ties the story together so the adventure seems more non-sequitir if you don't understand it.  More frustrating still is that Tracey didn't understand why one might need a towel!  Still, as an adventure movie, Hitchhikers succeeds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111544093305851203?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111544093305851203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111544093305851203' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111544093305851203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111544093305851203'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/hitchhikers-guide-to-galaxy.html' title='The Hitchhikers Guide to the Galaxy'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111542045135703856</id><published>2005-05-06T18:58:00.000-04:00</published><updated>2005-05-06T19:00:51.396-04:00</updated><title type='text'>Google indexing</title><content type='html'>Why is it so hard to get indexed by google?  I don't even care really but it's just so strange.  I have 25 posts, I update it ... well ok, I hardly really ever update it.  It's just so strange.  I've been involved with a few other very low traffic specialty sites that have even had some SEO and gone nowhere with Google.  If I was a spammer I could probably throw it on a link farm and it would be indexed in a few seconds once they had a few hundered "reliable" inbound links.  Maybe I should try to get on DMOZ for fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111542045135703856?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111542045135703856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111542045135703856' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111542045135703856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111542045135703856'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/google-indexing.html' title='Google indexing'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111507283132987290</id><published>2005-05-02T18:27:00.000-04:00</published><updated>2005-05-02T18:27:11.330-04:00</updated><title type='text'>Ghost disk</title><content type='html'>I need to blog this for the record.  I know nobody cares but I'll forget otherwise probably.&lt;br /&gt;&lt;br /&gt;If you have a ghost disk that uses the old MS LANMAN net.exe DOS client, it may have problems appending to files on a Windows 2003 server.  IE:&lt;br /&gt;&lt;br /&gt;&gt; echo hi &gt; new.fil&lt;br /&gt;&lt;br /&gt;works, and&lt;br /&gt;&lt;br /&gt;&gt; echo hello &gt;&gt; new.fil&lt;br /&gt;&lt;br /&gt;Returns access denied.  After a few hours poking at this, I decided it was a problem with the redirector.  There's a net command that shows you running services on the DOS client. I checked it and it indicated the BASIC redirector was running.&lt;br /&gt;&lt;br /&gt;After that, I ran:&lt;br /&gt;&lt;br /&gt;&gt; net stop basic&lt;br /&gt;&gt; net start full&lt;br /&gt;&lt;br /&gt;Relogged in, reconnected to the drives... Everything works.  I don't think this is documented anywhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111507283132987290?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111507283132987290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111507283132987290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111507283132987290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111507283132987290'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/05/ghost-disk.html' title='Ghost disk'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111449114244394530</id><published>2005-04-26T00:52:00.000-04:00</published><updated>2005-04-26T00:53:44.183-04:00</updated><title type='text'>How do they find me?</title><content type='html'>&lt;a href='http://photos1.blogger.com/img/278/1963/640/WoWScrnShot_042405_233617.jpg'&gt;&lt;img border='0' style='border:1px solid #660000; margin:2px' src='http://photos1.blogger.com/img/278/1963/320/WoWScrnShot_042405_233617.jpg'&gt;&lt;/a&gt;&lt;br /&gt;My first applicant interview for my guild! &lt;br /&gt;&lt;a href='http://photos1.blogger.com/img/278/1963/640/WoWScrnShot_042405_234323.jpg'&gt;&lt;img border='0' style='border:1px solid #660000; margin:2px' src='http://photos1.blogger.com/img/278/1963/320/WoWScrnShot_042405_234323.jpg'&gt;&lt;/a&gt;&lt;br /&gt;How much am I getting paid for this?&amp;nbsp;&lt;a href='http://www.hello.com/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbh.gif' alt='Posted by Hello' border='0' style='border:0px;padding:0px;background:transparent;' align='absmiddle'&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111449114244394530?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111449114244394530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111449114244394530' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111449114244394530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111449114244394530'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/04/how-do-they-find-me.html' title='How do they find me?'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111333682358348067</id><published>2005-04-12T16:13:00.000-04:00</published><updated>2005-04-12T16:13:43.583-04:00</updated><title type='text'>Anything is possible...</title><content type='html'>This wound up on my desk.  Imagine a website where anything is possible... you have imagined &lt;a href="http://zombo.com"&gt;zombo.com&lt;/a&gt;.  The only limit is yourself.&lt;br /&gt;&lt;br /&gt;Still enjoying the BBC World Service.  I have their signature song stuck in my head.  I went on a little research jaunt to find out what the signature song was, and a general history of the world service.  I should have hit Wikipedia first.  The wikipedia article has all the information I found during my research.  &lt;a href="http://en.wikipedia.org/wiki/BBC_World_Service"&gt;http://en.wikipedia.org/wiki/BBC_World_Service&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111333682358348067?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111333682358348067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111333682358348067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111333682358348067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111333682358348067'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/04/anything-is-possible.html' title='Anything is possible...'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111301097974496349</id><published>2005-04-08T21:41:00.000-04:00</published><updated>2005-04-08T21:42:59.746-04:00</updated><title type='text'>Bill's Games</title><content type='html'>Bill has begun a new blog documenting his game antics.  As an occational co-conspirator, I am an author over there as well.  I'm waiting for him to post the first game so I can chime in.  Here's the URL, be sure to check it out (but you might want to wait until next week):&lt;br /&gt;&lt;br /&gt;http://billsgames.blogspot.com/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111301097974496349?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111301097974496349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111301097974496349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111301097974496349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111301097974496349'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/04/bills-games.html' title='Bill&apos;s Games'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111280061531396435</id><published>2005-04-06T11:16:00.000-04:00</published><updated>2005-04-06T11:16:55.313-04:00</updated><title type='text'>Morea-apolis</title><content type='html'>An observation about the populace of Minneapolis - they are descended from dwarves.  I think you know what I mean.  The typical Minneapolis dwarf is stout, hearty, round, and moustache-laden.  They like beer - a lot.  I bet they'd be mining in Minneapolis if the ground wasn't frozen solid.  God love 'em.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111280061531396435?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111280061531396435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111280061531396435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111280061531396435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111280061531396435'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/04/morea-apolis.html' title='Morea-apolis'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-111275834513744177</id><published>2005-04-05T23:32:00.000-04:00</published><updated>2005-04-05T23:48:19.443-04:00</updated><title type='text'>When I damn well please!</title><content type='html'>The un-awaited, non-anticapted update has arrived.  [Applause]&lt;br /&gt;&lt;br /&gt;I wanted to mention two things.  First, I am dumb.  I recently went on a trip to Minneapolis.  I took the spiffy light rail from MSP to the downtown area.  When I got there, I arrived to a 27 degree farenheit (for my german readers, that's something like -15 centigrade or some such) ghost town.  My first impression was that everyone must hate Minneapolis since the streets were deserted.  I was walking down a street called Nicolette Mall, which is something like Denver's 6th St. Mall if you've ever been to Denver.  There were stores, and they were open since it was noon on Sunday, but nobody was there.  Also, I froze - I had only my coat and light gloves.  For some reason, I forgot to pack my &lt;a href="http://www.mnteverest.net/gear.html"&gt;Gore-Tex shell jacket and Polartec pants&lt;/a&gt; needed for explorations in to the frozen tundra.&lt;br /&gt;&lt;br /&gt;Anyway, after I walked the 6 blocks to the hotel, I discovered that Minneapoleanineses had moved from street level to Skyways.  They constructed &lt;a href="http://www.tonnhaus.com/portfolio/city_area/mpls_skyway.htm"&gt;5 miles of skyways&lt;/a&gt; that link all sorts of downtown areas together in climate controlled comfort.  Even the homeless now inhabit the luxury skyways, shunning the streets inhabited only by clueless tourists from Florida.  Man, I felt dopey.  The skyways are cool though and it turns out that Minneapolis is a pretty neat city that I would visit again, even in the awful cold (as long as I had convenient skyway access).&lt;br /&gt;&lt;br /&gt;XM has a channel called "BBC World Service".  Basically the BBC terminated all shortwave service that covered the US and moved to XM and Sirius instead.  It's not all dry shortwave morse-code shit.  They have quite a bit of music and discovery-channel like documentaries.  One of the music shows they had on recently covered a new band from Australia - &lt;a href="http://www.wolfmother.com/"&gt;Wolfmother&lt;/a&gt;.  They have really captured the sound of the Doors.  The BBC also made comparisons to early Black Sabbath, but I can't say I've listened to much of that, due to I'm a dork or something.  It's interesting to hear what they have brought to the sound anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-111275834513744177?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/111275834513744177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=111275834513744177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111275834513744177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/111275834513744177'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/04/when-i-damn-well-please.html' title='When I damn well please!'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-110472522164011574</id><published>2005-01-02T23:06:00.000-05:00</published><updated>2005-01-02T23:07:01.640-05:00</updated><title type='text'>First WoW Stuff from me</title><content type='html'>&lt;a href="http://www.brierlea.com/Gallery/Pipp/Legend.gif"&gt;http://www.brierlea.com/Gallery/Pipp/Legend.gif&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A funny idea I had :)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-110472522164011574?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/110472522164011574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=110472522164011574' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/110472522164011574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/110472522164011574'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2005/01/first-wow-stuff-from-me.html' title='First WoW Stuff from me'/><author><name>Tracey</name><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-8617984.post-110124199483544998</id><published>2004-11-23T15:33:00.000-05:00</published><updated>2004-11-23T15:34:14.823-05:00</updated><title type='text'>Panda pics</title><content type='html'>&lt;a href='http://photos1.blogger.com/img/278/1963/640/prints.jpg'&gt;&lt;img border='0' style='border:1px solid #660000; margin:2px' src='http://photos1.blogger.com/img/278/1963/320/prints.jpg'&gt;&lt;/a&gt;&lt;br /&gt;Pandas have tiny footprints &lt;br /&gt;&lt;a href='http://photos1.blogger.com/img/278/1963/640/sleep.jpg'&gt;&lt;img border='0' style='border:1px solid #660000; margin:2px' src='http://photos1.blogger.com/img/278/1963/320/sleep.jpg'&gt;&lt;/a&gt;&lt;br /&gt;Sleepy panda&amp;nbsp;&lt;a href='http://www.hello.com/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbh.gif' alt='Posted by Hello' border='0' style='border:0px;padding:0px;background:transparent;' align='absmiddle'&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-110124199483544998?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/110124199483544998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=110124199483544998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/110124199483544998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/110124199483544998'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2004/11/pandas-have-tiny-footprints-sleepy.html' title='Panda pics'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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-8617984.post-110115858287875630</id><published>2004-11-22T16:23:00.000-05:00</published><updated>2004-11-24T10:39:25.213-05:00</updated><title type='text'>Orlando area WoW players</title><content type='html'>Change of plan, let's go to Pacific - Hyjal - Alliance.&lt;br /&gt;Email me - jtatum@gmail.com with character name if you want to be on the list:&lt;br /&gt;&lt;br /&gt;Mike F - Mike - ? / Jacob - Warlock&lt;br /&gt;Jamie T - Colleen - Mage&lt;br /&gt;Jason V - Von - Mage&lt;br /&gt;Bill S - Bill - Paladin&lt;br /&gt;James T - Lor - Priest / Rum - Hunter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8617984-110115858287875630?l=thelightness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thelightness.blogspot.com/feeds/110115858287875630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8617984&amp;postID=110115858287875630' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/110115858287875630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8617984/posts/default/110115858287875630'/><link rel='alternate' type='text/html' href='http://thelightness.blogspot.com/2004/11/orlando-area-wow-players.html' title='Orlando area WoW players'/><author><name>James Tatum</name><uri>http://www.blogger.com/profile/07299141230261999745</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></feed>
