<?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-7899729191481151759</id><updated>2011-07-30T22:06:01.496-07:00</updated><category term='completion'/><category term='dll'/><category term='javascript'/><category term='gdk'/><category term='swing'/><category term='bug'/><category term='permission'/><category term='import'/><category term='tomcat'/><category term='preferences'/><category term='command'/><category term='HTML Help'/><category term='help'/><category term='toc'/><category term='tables'/><category term='css'/><category term='ms'/><category term='teamspeak'/><category term='wicket'/><category term='ati'/><category term='hhc'/><category term='keyboard'/><category term='windows'/><category term='alsa'/><category term='eclipse'/><category term='port'/><category term='catalog'/><category term='driver'/><category term='linux'/><category term='xml'/><category term='tightvnc'/><category term='scala'/><category term='workshop'/><category term='java'/><category term='internet connection'/><category term='internet explorer'/><category term='vmware'/><category term='security'/><category term='static'/><category term='jsp'/><category term='quirks mode'/><category term='xslt'/><category term='format'/><category term='web framework'/><category term='algorithm'/><category term='labels'/><category term='date arithmetic'/><category term='button'/><category term='gui'/><category term='ie'/><category term='blogger'/><category term='namespace'/><category term='servlets'/><category term='html'/><category term='xmldom'/><category term='microsoft'/><category term='ubuntu'/><category term='parser'/><category term='j2ee'/><category term='gotcha'/><title type='text'>Wonders Of Computing</title><subtitle type='html'>One of the important tenets of computer science is the &lt;a href="http://en.wikipedia.org/wiki/Principle_of_least_astonishment"&gt;Principle of Least Astonishment&lt;/a&gt;.&lt;p&gt; Unsurprisingly, software and often  hardware turn out to be full of surprising quirks. One questions if anyone else has ever heard of this principle.
&lt;p&gt;
This blog presents situations I encounter in my travails as a software developer, and solutions to problems which arise.&lt;/p&gt;&lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-3087313858228205079</id><published>2010-10-22T06:12:00.000-07:00</published><updated>2010-10-22T06:12:02.487-07:00</updated><title type='text'>Java Console for Linux</title><content type='html'>&lt;p&gt;From &lt;a href="https://bugs.launchpad.net/ubuntu/+source/firefox/+bug/241277"&gt;here&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Johan Dahl, 2008-09-01:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A workaround&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In gnome: Select &lt;tt&gt;System &amp;gt; Settings Sun Java x.x Control Panel&lt;/tt&gt;&lt;br/&gt;&lt;br /&gt;In terminal: &lt;tt&gt;jcontrol&lt;/tt&gt;&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Select the tab advanced.&lt;br /&gt;&lt;li&gt;Expand the node "Java-console"&lt;br /&gt;&lt;li&gt;Select show console (default is hide)&lt;br /&gt;&lt;/ol&gt;&lt;p&gt;Now will the console show up the first time you run an applet. You can keep it open for debugging etc.&lt;/p&gt;&lt;p&gt;If you close the console window must you restart your browser to make it pop-up again.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-3087313858228205079?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/3087313858228205079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=3087313858228205079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/3087313858228205079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/3087313858228205079'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2010/10/java-console-for-linux.html' title='Java Console for Linux'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-5810283772076365397</id><published>2010-02-24T11:07:00.000-08:00</published><updated>2010-02-24T11:07:05.209-08:00</updated><title type='text'>GZipOutputStream: Remember to finish() what you start!</title><content type='html'>Had an interesting experience the other day. I was creating a stream of compressed data using &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/GZIPOutputStream.html"&gt;GZipOutputStream&lt;/a&gt; and ended up with lots of missing data.&lt;br /&gt;&lt;br /&gt;It turns out that data will (may?) not be properly written to the output stream if you neglect to call &lt;b&gt;&lt;code&gt;finish()&lt;/code&gt;&lt;/b&gt; when you're done pumping data in. Strangely enough, neither &lt;tt&gt;flush()&lt;/tt&gt; nor even &lt;tt&gt;close()&lt;/tt&gt; are sufficient to accomplish this; it's either &lt;tt&gt;finish()&lt;/tt&gt; or you risk having corrupt, incomplete data in your output.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-5810283772076365397?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/5810283772076365397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=5810283772076365397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5810283772076365397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5810283772076365397'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2010/02/gzipoutputstream-remember-to-finish.html' title='GZipOutputStream: Remember to finish() what you start!'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-5601616808926385621</id><published>2009-11-01T03:09:00.000-08:00</published><updated>2009-11-01T03:09:37.058-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='gdk'/><category scheme='http://www.blogger.com/atom/ns#' term='button'/><title type='text'>Eclipse button clicks in Ubuntu 9.10 (Karmic)</title><content type='html'>Since upgrading to Ubuntu 9.10, I found that some buttons in Eclipse can't be mouse clicked any more. It's usually possible to click them using the space bar, but...&lt;br /&gt;&lt;br /&gt;Many thanks to &lt;a href="https://launchpad.net/~osmoma"&gt;moma&lt;/a&gt; for posting &lt;a href="https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/460269"&gt;a solution&lt;/a&gt; on &lt;a href="https://launchpad.net/ubuntu"&gt;Launchpad&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;Start eclipse with&lt;br /&gt;$ cd eclipse&lt;br /&gt;$ export GDK_NATIVE_WINDOWS=true&lt;br /&gt;$ ./eclipse&lt;br /&gt;&lt;br /&gt;Or use this one liner:&lt;br /&gt;$ GDK_NATIVE_WINDOWS=true $HOME/eclipse/eclipse&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-5601616808926385621?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/5601616808926385621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=5601616808926385621' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5601616808926385621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5601616808926385621'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/11/eclipse-button-clicks-in-ubuntu-910.html' title='Eclipse button clicks in Ubuntu 9.10 (Karmic)'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-541727040134043280</id><published>2009-09-26T14:12:00.000-07:00</published><updated>2009-10-11T12:39:02.254-07:00</updated><title type='text'>How to display a directory listing in Google App Engine</title><content type='html'>&lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; is really not meant to serve up a lot of static content; but sometimes you just want to!&lt;br /&gt;&lt;br /&gt;If you put a directory full of stuff into your web archive and point your browser at it, AppEngine will tell you there's nothing there. It's possible to change that, though.&lt;br /&gt;&lt;br /&gt;The following instructions are for the Java incarnation of AppEngine; I would imagine you can do something equivalent in the Python engine, but I don't know any details.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make sure your directory and its children are marked as "static" in &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;appengine-web.xml&lt;/span&gt; :&lt;/li&gt;style-span" style="font-family: 'Times New Roman'; font-weight: normal;"&gt;Map your directory to Jetty's default servlet within &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;web.xml&lt;/span&gt; :  &lt;pre&gt;&amp;lt;static-files&gt;&lt;br /&gt;      &amp;lt;include path="/*.css"/&gt;&lt;br /&gt;      &amp;lt;include path="/favicon.ico"/&gt;&lt;br /&gt;      &amp;lt;include path="/code/**"/&gt;&lt;br /&gt;   &amp;lt;/static-files&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Next, tell Jetty in &lt;tt&gt;web.xml&lt;/tt&gt; to accept directory requests:&lt;br /&gt;&lt;pre&gt;&amp;lt;context-param&gt;&lt;br /&gt;      &amp;lt;param-name&gt;org.mortbay.jetty.servlet.Default.dirAllowed&amp;lt;/param-name&gt;&lt;br /&gt;      &amp;lt;param-value&gt;true&amp;lt;/param-value&gt;&lt;br /&gt;&amp;lt;/context-param&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Finally, define Jetty's "default" servlet in &lt;tt&gt;web.xml&lt;/tt&gt; to accept directory requests:&lt;br /&gt;&lt;pre&gt;&amp;lt;servlet&gt;&lt;br /&gt;      &amp;lt;servlet-name&gt;default&amp;lt;/servlet-name&gt;&lt;br /&gt;      &amp;lt;servlet-class&gt;org.mortbay.jetty.servlet.DefaultServlet&amp;lt;/servlet-class&gt;&lt;br /&gt;      &amp;lt;init-param&gt;&lt;br /&gt;         &amp;lt;param-name&gt;acceptRanges&amp;lt;/param-name&gt;&amp;lt;param-value&gt;true&amp;lt;/param-value&gt;&lt;br /&gt;      &amp;lt;/init-param&gt;&lt;br /&gt;      &amp;lt;init-param&gt;&lt;br /&gt;         &amp;lt;param-name&gt;dirAllowed&amp;lt;/param-name&gt;&amp;lt;param-value&gt;true&amp;lt;/param-value&gt;&lt;br /&gt;      &amp;lt;/init-param&gt;&lt;br /&gt;      &amp;lt;load-on-startup&gt;0&lt;/load-on-startup&gt;&lt;br /&gt;   &amp;lt;/servlet&gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;servlet-mapping&gt;&lt;br /&gt;      &amp;lt;servlet-name&gt;default&amp;lt;/servlet-name&gt;&lt;br /&gt;      &amp;lt;url-pattern&gt;/code/*&amp;lt;/url-pattern&gt;&lt;br /&gt;   &amp;lt;/servlet-mapping&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &lt;servlet&gt;&lt;/servlet&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;... and that's more or less it!&lt;br /&gt;&lt;/div&gt;&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/7899729191481151759-541727040134043280?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/541727040134043280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=541727040134043280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/541727040134043280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/541727040134043280'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/09/how-to-display-directory-listing-in.html' title='How to display a directory listing in Google App Engine'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-5206113542688523459</id><published>2009-09-23T12:44:00.000-07:00</published><updated>2009-09-26T04:01:21.635-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='preferences'/><title type='text'>My Eclipse settings</title><content type='html'>Eclipse is a great Java IDE. There are just a few things I don't like about its default configuration. Fortunately, it's highly configurable.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Preferences&lt;ul&gt;&lt;li&gt;General&lt;ul&gt;&lt;li&gt;Ant&lt;ul&gt;&lt;li&gt;Editor&lt;ul&gt;&lt;li&gt;Formatter&lt;ul&gt;&lt;li&gt;Tab size: &lt;b&gt;3&lt;/b&gt;&lt;br /&gt;&lt;li&gt;Use tab character instead of spaces: &lt;b&gt;uncheck.&lt;/b&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Formatter --&gt;&lt;/ul&gt;&lt;!-- Editor --&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Ant --&gt;&lt;li&gt;Editors&lt;ul&gt;&lt;li&gt;Displaced tab width: &lt;b&gt;3&lt;/b&gt;&lt;br /&gt;&lt;li&gt;Insert spaces for tabs: &lt;b&gt;Check.&lt;/b&gt;&lt;br /&gt;&lt;li&gt;Show line numbers: &lt;b&gt;Check.&lt;/b&gt;&lt;br /&gt;&lt;li&gt;Text Editors&lt;ul&gt;&lt;li&gt;Spelling&lt;ul&gt;&lt;li&gt;Enable spell checking: &lt;b&gt;Uncheck.&lt;/b&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Spelling --&gt; &lt;/ul&gt;&lt;!-- Text Editors --&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Editors --&gt; &lt;/ul&gt;&lt;!-- General --&gt;&lt;br /&gt;&lt;li&gt;Java&lt;ul&gt;&lt;li&gt;Code Style&lt;ul&gt;&lt;li&gt;Qualify all generated field accesses with 'this.': &lt;b&gt;Check.&lt;/b&gt;&lt;br /&gt;&lt;li&gt;Formatter: new profile "carl"&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Indentation&lt;ul&gt;&lt;li&gt;General settings&lt;ul&gt;&lt;li&gt;Tab policy: &lt;b&gt;Spaces only&lt;/b&gt;&lt;br /&gt;&lt;li&gt;Indentation size: &lt;b&gt;3&lt;/b&gt;&lt;br /&gt;&lt;li&gt;Tab size: &lt;b&gt;3&lt;/b&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- General settings --&gt; &lt;/ul&gt;&lt;!-- Indentation --&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Formatter --&gt; &lt;/ul&gt;&lt;!-- Code Style --&gt;&lt;br /&gt;&lt;li&gt;Compiler&lt;ul&gt;&lt;li&gt;Errors/Warnings&lt;ul&gt;&lt;li&gt;Potential programming problems&lt;ul&gt;&lt;li&gt;Serializable class without serialVersionUID: &lt;b&gt;Ignore&lt;/b&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Potential --&gt; &lt;/ul&gt;&lt;!-- Errors --&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Compiler --&gt;&lt;li&gt;Editor&lt;ul&gt;&lt;li&gt;Folding&lt;ul&gt;&lt;li&gt;Initially fold&lt;ul&gt;&lt;li&gt;Imports: &lt;b&gt;uncheck.&lt;/b&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Initially fold --&gt; &lt;/ul&gt;&lt;!-- Folding --&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Editor --&gt; &lt;/ul&gt;&lt;!-- Java --&gt;&lt;br /&gt;&lt;/ul&gt;&lt;!-- Preferences --&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-5206113542688523459?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/5206113542688523459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=5206113542688523459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5206113542688523459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5206113542688523459'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/09/my-eclipse-settings.html' title='My Eclipse settings'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-1994043787497207223</id><published>2009-09-03T14:14:00.000-07:00</published><updated>2009-09-03T14:15:20.218-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='labels'/><title type='text'>Substring labels in Blogger</title><content type='html'>Have you ever tried giving your blog post multiple labels, one of which is a substring of the other?&lt;br /&gt;&lt;br /&gt;Example: &lt;tt&gt;spring security, spring&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;Once Google Blogs has latched on to the longer string, it will move heaven and earth to auto-complete the shorter one for you.&lt;br /&gt;&lt;br /&gt;One solution is to add a comma immediately after the short string. Auto-completion won't try to overrule you then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-1994043787497207223?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/1994043787497207223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=1994043787497207223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/1994043787497207223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/1994043787497207223'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/09/substring-labels-in-blogger.html' title='Substring labels in Blogger'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-1110566320736920352</id><published>2009-07-30T14:42:00.000-07:00</published><updated>2009-07-30T14:55:41.245-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quirks mode'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='tables'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Table height = Browser window height WITHOUT quirks mode!</title><content type='html'>In spite of all the CSS hype, I still occasionally like to use tables to lay out a page. I think there are some layout situations where a table lets you do things CSS layouts don't.&lt;br /&gt;&lt;br /&gt;For a long time, I've been despairing about the apparent impossibility of getting a page to fill the browser screen, or a known proportion of it, independently of the user's browser window size and without using JavaScript.&lt;br /&gt;&lt;br /&gt;It used to be that a table at 100% height would fill the screen vertically. However, this was a "feature" of the so-called "quirks mode." If you build a Web page with a "proper" DOCTYPE, you hint to the browser that you know how to build standards compliant Web pages, and in return it renders your page more or less rigidly according to the standard.&lt;br /&gt;&lt;br /&gt;This is very thoroughly explained by Gary White on &lt;a href="http://apptools.com/examples/tableheight.php"&gt;the AppTools site&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;The good news is, there's a standard compliant workaround. You can use CSS to set the height of the &amp;lt;html&amp;gt; and &amp;lt;body&amp;gt; elements of the page to 100%; their parent is the screen, so they will. Then you can use CSS to set the height of your table to 100%, and it will fill your screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-1110566320736920352?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/1110566320736920352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=1110566320736920352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/1110566320736920352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/1110566320736920352'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/07/table-height-browser-window-height.html' title='Table height = Browser window height WITHOUT quirks mode!'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-8665994726454882017</id><published>2009-07-22T09:12:00.000-07:00</published><updated>2009-07-22T09:16:17.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='static'/><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='j2ee'/><category scheme='http://www.blogger.com/atom/ns#' term='import'/><title type='text'>import static in a JSP</title><content type='html'>I have yet to try this, but according to &lt;a href="http://forums.java.net/jive/message.jspa?messageID=243179"&gt;this post on the GlassFish forum&lt;/a&gt;, the way to do an "import static" in a JSP is like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;%@ page import="static &lt;/code&gt;foo&lt;/code&gt;.*" %&amp;gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-8665994726454882017?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/8665994726454882017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=8665994726454882017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8665994726454882017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8665994726454882017'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/07/import-static-in-jsp.html' title='import static in a JSP'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-3178088374410778230</id><published>2009-07-22T08:48:00.000-07:00</published><updated>2009-07-22T09:08:03.920-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='j2ee'/><category scheme='http://www.blogger.com/atom/ns#' term='servlets'/><title type='text'>Implementing an interface in a JSP</title><content type='html'>I've scoured the net, but apparently it's not possible to make a Java Server Page implement an interface. Not directly, anyway.&lt;br /&gt;&lt;br /&gt;What is possible is to extend a class. The directive is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;%@ page extends="&lt;/code&gt;package.class&lt;/code&gt;"%&amp;gt&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;One reference for JSP page directives is: &lt;a href="http://java.sun.com/products/jsp/tags/11/syntaxref11.fm7.html"&gt;http://java.sun.com/products/jsp/tags/11/syntaxref11.fm7.html&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;The class generated from a JSP usually extends &lt;code&gt;HttpServlet&lt;/code&gt;. If you really want to have your JSP implement an interface, you could do something like&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;public abstract class &lt;/code&gt;my.package.MyJSP&lt;code&gt; extends HttpServlet implements &lt;/code&gt;MyInterface&lt;code&gt; {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;... and then use "my.package.MyJSP" in a "page extends" directive as shown above.&lt;br /&gt;&lt;br /&gt;The caveat to this is that some Web containers will generate their own subclasses of HttpServlet, presumably for some kine of optimization, and using the "page extends" directive will sabotage this scheme. It should still work, it just won't include the fancy footwork your Web container intended to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-3178088374410778230?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/3178088374410778230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=3178088374410778230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/3178088374410778230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/3178088374410778230'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/07/implementing-interface-in-jsp.html' title='Implementing an interface in a JSP'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-6634607112312827489</id><published>2009-05-01T11:01:00.000-07:00</published><updated>2009-07-22T09:17:23.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='namespace'/><category scheme='http://www.blogger.com/atom/ns#' term='web framework'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Getting the 'wicket:id' attribute to validate</title><content type='html'>Wicket is great. The "&lt;tt&gt;wicket:id&lt;/tt&gt;" attribute is all that needs to be added to a tag to place it under program control.&lt;br /&gt;&lt;br /&gt;If you have a finicky validator (or any validator), it may object to the attribute, which isn't part of (X)HTML.&lt;br /&gt;&lt;br /&gt;The solution is to add a namespace declaration, like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;html xmlns:wicket="http://wicket.apache.org"&amp;gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-6634607112312827489?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/6634607112312827489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=6634607112312827489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/6634607112312827489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/6634607112312827489'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/05/getting-wicketid-attribute-to-validate.html' title='Getting the &apos;wicket:id&apos; attribute to validate'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-8957154963557411124</id><published>2009-05-01T10:51:00.000-07:00</published><updated>2009-05-01T11:00:49.800-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Mixing Java and Scala in an Eclipse Project</title><content type='html'>If you start a project off as a Scala project, then it's OK to mix in some Java source. Everything will be compiled as appropriate, and library references will work out too.&lt;br /&gt;&lt;br /&gt;But for some projects, such as the "Dynamic Web Project," that's not an option. You must convert it to a Scala project after it's created as a Java project.&lt;br /&gt;&lt;br /&gt;Fiddling with the contents of &lt;tt&gt;.project&lt;/tt&gt; manually didn't get me anywhere.&lt;br /&gt;&lt;br /&gt;The correct procedure, as found on &lt;a href="http://www.nabble.com/-scala-tools--Problem-using-Scala-Eclipse-Plugin-with-Wicket-Maven-Project-td22585196.html"&gt;Nabble&lt;/a&gt;, is:&lt;blockquote&gt;&lt;br /&gt;As a general rule you should convert Java projects to Scala projects&lt;br /&gt;by using the "Add Scala Nature" package explorer context menu action&lt;br /&gt;unless you know what you're doing.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-8957154963557411124?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/8957154963557411124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=8957154963557411124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8957154963557411124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8957154963557411124'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/05/mixing-java-and-scala-in-eclipse.html' title='Mixing Java and Scala in an Eclipse Project'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-4423392901166722205</id><published>2009-04-18T10:04:00.000-07:00</published><updated>2009-04-18T10:08:17.637-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><title type='text'>Simulating a manual window close</title><content type='html'>&lt;code&gt;w.getToolkit().getSystemEventQueue().postEvent(new WindowEvent(w, WindowEvent.WINDOW_CLOSING));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;obtained (with thanks) from: &lt;a href="http://forums.java.net/jive/thread.jspa?threadID=35565"&gt;http://forums.java.net/jive/thread.jspa?threadID=35565&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This will fire the &lt;code&gt;WindowClosing&lt;/code&gt; event, so you can execute any action you may have bound to that event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-4423392901166722205?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/4423392901166722205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=4423392901166722205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4423392901166722205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4423392901166722205'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/04/simulating-manual-window-close.html' title='Simulating a manual window close'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-8653908300170693126</id><published>2009-02-18T11:23:00.000-08:00</published><updated>2009-02-18T11:29:15.954-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>German Keyboard, VMWare, Ubuntu host</title><content type='html'>There are lots of things that can go wrong with this.&lt;br /&gt;&lt;br /&gt;The most helpful hints I could find were &lt;a href="http://kb.vmware.com/selfservice/viewContent.do?externalId=1007439&amp;sliceId=1"&gt;here&lt;/a&gt; and &lt;a href="http://www.vmware.com/support/ws45/doc/devices_linux_kb_ws.html#1013043"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Following this advice, I edited my &lt;code&gt;~/.vmware/config&lt;/code&gt; file to look like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;xkeymap.nokeycodeMap = true&lt;br /&gt;xkeymap.keysym.ISO_Level3_Shift = 0x138&lt;br /&gt;xkeymap.keysym.braceleft = 0x1a&lt;br /&gt;xkeymap.keysym.braceright = 0x1b&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I think the second line is the most important for my German keyboard, as it maps the AltGr key.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-8653908300170693126?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/8653908300170693126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=8653908300170693126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8653908300170693126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8653908300170693126'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/02/german-keyboard-vmware-ubuntu-host.html' title='German Keyboard, VMWare, Ubuntu host'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-7627708605890461537</id><published>2009-01-02T02:18:00.001-08:00</published><updated>2009-07-22T09:11:14.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='port'/><category scheme='http://www.blogger.com/atom/ns#' term='tightvnc'/><category scheme='http://www.blogger.com/atom/ns#' term='gotcha'/><title type='text'>TightVNC Port Number Gotcha</title><content type='html'>TightVNC is great if you want to remote-control someone else's PC without resorting to MS' Remote Desktop solution.&lt;br /&gt;&lt;br /&gt;Something that cost me about an hour's worth of frustration, though, is their way of specifying an alternative to the standard port (5900):&lt;br /&gt;&lt;br /&gt;You either&lt;ol&gt;&lt;br /&gt;&lt;li&gt;specify an alternate screen number (a small integer, e.g. 5 means screen 5 means port 5905); or&lt;/li&gt;&lt;br /&gt;&lt;li&gt;explicitly specify an alternate port, e.g. 5905 .&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Alternative 1 is selected with a colon between the host address and the screen number, e.g.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;66.66.66.66&lt;b&gt;:&lt;/b&gt;5&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To specify an alternate port, you need to insert &lt;strong&gt;two&lt;/strong&gt; colons:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;66.66.66.66&lt;b&gt;::&lt;/b&gt;5905&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Because colons are just tiny freckles on the screen, especially in proportional fonts, this is easy to overlook in the documentation. Many other utilities (and URLs) use single colons before a port number, so habit has us do the wrong thing by default.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-7627708605890461537?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/7627708605890461537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=7627708605890461537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/7627708605890461537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/7627708605890461537'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2009/01/tightvnc-port-number-gotcha.html' title='TightVNC Port Number Gotcha'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-4713938313928907128</id><published>2008-12-20T06:33:00.000-08:00</published><updated>2008-12-20T06:37:07.824-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='command'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='completion'/><title type='text'>Autocompletion in the Windows command processor</title><content type='html'>Registry key:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor&lt;/code&gt; (for all users)&lt;br /&gt;or&lt;br /&gt;&lt;code&gt;HKEY_CURRENT_USER\Software\Microsoft\Command Processor&lt;/code&gt; (for the current user)&lt;br /&gt;&lt;br /&gt;Set &lt;br /&gt;&lt;code&gt;CompletionChar&lt;/code&gt; to &lt;code&gt;9&lt;/code&gt; to have TAB complete file names,&lt;br /&gt;&lt;code&gt;PathCompletionChar&lt;/code&gt; to &lt;code&gt;9&lt;/code&gt; to have TAB complete folder names.&lt;br /&gt;&lt;br /&gt;Nuff said.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-4713938313928907128?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/4713938313928907128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=4713938313928907128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4713938313928907128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4713938313928907128'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/12/autocompletion-in-windows-command.html' title='Autocompletion in the Windows command processor'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-4355806937911247252</id><published>2008-12-14T23:03:00.000-08:00</published><updated>2008-12-14T23:45:40.388-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='format'/><category scheme='http://www.blogger.com/atom/ns#' term='gotcha'/><category scheme='http://www.blogger.com/atom/ns#' term='toc'/><category scheme='http://www.blogger.com/atom/ns#' term='hhc'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML Help'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>HTML Help Gotcha on toc.hhc</title><content type='html'>If you're trying to create MS HTML Help files (.CHM) programmatically, you may need to generate your own TOC.&lt;br /&gt;&lt;br /&gt;The documentation available from Microsoft does its best to keep you in the dark: They tell you how to generate it in Help Workshop using their point-and-click GUI. It's serviceable but not much fun to use. No wonder there's such a huge cottage industry of MS Help front ends!&lt;br /&gt;&lt;br /&gt;Paul Wise bravely documents what he could re-engineer about &lt;a href="http://www.nongnu.org/chmspec/latest/index.html"&gt;the innards of the .CHM file&lt;/a&gt; but only devotes a rather short section to the &lt;a href="http://www.nongnu.org/chmspec/latest/Sitemap.html"&gt;Sitemap format&lt;/a&gt; of the TOC, which I quote here:&lt;blockquote&gt;&lt;br /&gt;These formats are based on HTML and use the following doctype:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;&amp;lt;HEAD&gt;&lt;/code&gt; tag contains a &lt;code&gt;&amp;lt;meta&gt;&lt;/code&gt; tag providing information on the program that generated the files and a comment indicating the version of the file. e.g.:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;meta name="GENERATOR"content="Microsoft&amp;reg; HTML Help Workshop 4.1"&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;!-- Sitemap 1.0 --&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;&amp;lt;BODY&gt;&lt;/code&gt; tag contains an &lt;code&gt;&amp;lt;OBJECT&gt;&lt;/code&gt; tag that stores properties of the file in &lt;code&gt;&amp;lt;param&gt;&lt;/code&gt; tags, followed by a &lt;code&gt;&amp;lt;UL&gt;&lt;/code&gt; tag, whose &lt;code&gt;&amp;lt;LI&gt;&lt;/code&gt; tags have &lt;code&gt;&amp;lt;OBJECT&gt;&lt;/code&gt; tags that store the properties of the Contents/Index items in &lt;code&gt;&amp;lt;param&gt;&lt;/code&gt; tags. e.g.:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;BODY&gt;&lt;br /&gt;&amp;lt;OBJECT type="text/site properties"&gt;&lt;br /&gt;    &amp;lt;param name="Property Name" value="Property Value"&gt;&lt;br /&gt;    …&lt;br /&gt;&amp;lt;/OBJECT&gt;&lt;br /&gt;&amp;lt;UL&gt;&lt;br /&gt;    &amp;lt;LI&gt; &amp;lt;OBJECT type="text/sitemap"&gt;&lt;br /&gt;        &amp;lt;param name="Property Name" value="Property Value"&gt;&lt;br /&gt;        …&lt;br /&gt;        &amp;lt;/OBJECT&gt;&lt;br /&gt;    …&lt;br /&gt;&amp;lt;/UL&gt;&lt;br /&gt;&amp;lt;/BODY&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Note that the Property Names and Property Values and tags are not case-sensitive, but HHW will always write all three in the default capitilization, when appropriate.&lt;br /&gt;&lt;br /&gt;Note that the tags are mostly in uppercase and the &lt;code&gt;&amp;lt;LI&gt;&lt;/code&gt; tag is not closed; this is in compliance with the doctype.&lt;/blockquote&gt;&lt;br /&gt;I spent some days generating the TOC from a different structure. To help with eyeball debugging, my HTML was nicely indented. I started a new line for each tag - not entirely unreasonable. Without the indentation, here's an example of what I created:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;HTML&gt;&lt;br /&gt;&amp;lt;BODY&gt;&lt;br /&gt;&amp;lt;UL&gt;&lt;br /&gt;&amp;lt;LI&gt;&lt;br /&gt;&amp;lt;OBJECT type="text/sitemap"&gt;&lt;br /&gt;&amp;lt;param name="Name" value="Heading 1"&gt;&lt;br /&gt;&amp;lt;param name="Local" value="h1.htm"&gt;&lt;br /&gt;&amp;lt;/OBJECT&gt;&lt;br /&gt;&amp;lt;/LI&gt;&lt;br /&gt;&amp;lt;/UL&gt;&lt;br /&gt;&amp;lt;/BODY&gt;&lt;br /&gt;&amp;lt;/HTML&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Try as I might, HHW (the Workshop) would not display such a TOC, and HHC (the Compiler) would not produce a working .CHM from it. I spent a &lt;em&gt;long&lt;/em&gt; time figuring out what's needed to make it work, as in the following:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;HTML&gt;&lt;br /&gt;&amp;lt;BODY&gt;&lt;br /&gt;&amp;lt;UL&gt;&lt;br /&gt;&amp;lt;LI&gt;&amp;lt;OBJECT type="text/sitemap"&gt;&lt;br /&gt;&amp;lt;param name="Name" value="Heading 1"&gt;&lt;br /&gt;&amp;lt;param name="Local" value="h1.htm"&gt;&lt;br /&gt;&amp;lt;/OBJECT&gt;&lt;br /&gt;&amp;lt;/LI&gt;&lt;br /&gt;&amp;lt;/UL&gt;&lt;br /&gt;&amp;lt;/BODY&gt;&lt;br /&gt;&amp;lt;/HTML&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;This appears to be one of the best kept secrets of the HTML Help generating industry:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If you don't put &lt;code&gt;&amp;lt;LI&gt;&lt;/code&gt; on the same line as &lt;code&gt;&amp;lt;OBJECT&gt;&lt;/code&gt;, the TOC parser will fail!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So the accepted format is essentially an HTML Unordered List of Objects with details in Params, give or take a horrible bug in the scanner/parser.&lt;br /&gt;&lt;br /&gt;On the bright side, in my experience the following bits are &lt;em&gt;not&lt;/em&gt; essential:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;As Paul states, tags and even attribute names are accepted in upper or lower case.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The stuff in the &lt;code&gt;&amp;lt;HEAD&gt;&lt;/code&gt; isn't needed and can be dispensed with.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The &lt;code&gt;text/site properties&lt;/code&gt; OBJECT is only needed if you want to fiddle with the options&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tags may be consistently closed (XML fashion), including those that HTML is inconsistent about, such as &lt;code&gt;&amp;lt;meta&gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;param&lt;/code&gt;. Similarly, it's OK to have closing &lt;code&gt;&amp;lt;/LI&gt;&lt;/code&gt;'s.&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/7899729191481151759-4355806937911247252?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/4355806937911247252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=4355806937911247252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4355806937911247252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4355806937911247252'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/12/html-help-gotcha-on-tochhc.html' title='HTML Help Gotcha on toc.hhc'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-1608327039765721681</id><published>2008-12-12T07:28:00.000-08:00</published><updated>2008-12-12T07:43:53.088-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='help'/><category scheme='http://www.blogger.com/atom/ns#' term='workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='ms'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='dll'/><title type='text'>Running HTML Help Workshop under Wine</title><content type='html'>Help Workshop is a Microsoft product that creates somewhat compressed help files (.CHM) for use in/with MS programs. The Workshop "main" is a GUI application but there's also a standalone compiler.&lt;br /&gt;&lt;br /&gt;Installed and run under Wine in a modern Linux (Ubuntu 8.04), hhw.exe and hhc.exe kept telling me:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;HHC5010: Error: Cannot open "C:\windows\temp\TFS483e.tmp". Compilation stopped.&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;I found a simple fix at &lt;a href="http://babel.isa.uma.es/mrpt/index.php/Compiling_CHM_help_files_in_Linux_with_HHC_and_Wine"&gt;The &lt;span style="text-decoration: underline;"&gt;MRPT Project&lt;/span&gt;&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;You are advised to open "Wine Configuration," set up new configs for hhw.exe and/or hhc.exe . For either or both, in the Libraries tab, add a new override for "&lt;code&gt;itss&lt;/code&gt;," then edit it to select "native."&lt;br /&gt;&lt;br /&gt;My Wine installation already had an &lt;code&gt;itss.dll&lt;/code&gt; in &lt;code&gt;.wine/drive_c/windows/system32&lt;/code&gt;, but it was a tiny thing a little over 4 KB in size. I found a "real" itss.dll on the 'net of about 134 KB and plunked that over the installed one.&lt;br /&gt;&lt;br /&gt;Both hhw and hhc work for me now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-1608327039765721681?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/1608327039765721681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=1608327039765721681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/1608327039765721681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/1608327039765721681'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/12/running-html-help-workshop-under-wine.html' title='Running HTML Help Workshop under Wine'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-5860968586229063238</id><published>2008-11-16T05:28:00.000-08:00</published><updated>2008-11-16T05:51:03.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='permission'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Tomcat permissions</title><content type='html'>As packaged with Ubuntu 8.04, Tomcat is set up pretty tight on security. The configured permissions are quite minimal, so many things you'd want to do in your servlets or JSPs needs to be explicitly permitted.&lt;br /&gt;&lt;br /&gt;This isn't necessarily surprising; but it can be a pain.&lt;br /&gt;&lt;br /&gt;First, some helpful links: The &lt;a href="http://tomcat.apache.org/tomcat-5.5-doc/security-manager-howto.html"&gt;Security Manager HOW-TO&lt;/a&gt; in Apache's Tomcat documentation explains the basics. For specifics on the format of permission entries, see Sun's documentation on &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/security/PolicyFiles.html"&gt;Default Policy Implementation and Policy File Syntax&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Notes:&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Tomcat's policy settings are (on my Ubuntu box) in &lt;code&gt;/usr/share/tomcat5.5/conf/catalina.policy&lt;/code&gt;. But &lt;b&gt;heed the warning in the file's header:&lt;/b&gt; If your system is Debian-esque (and that includes Ubuntu) then that file is auto-generated from a set of files in &lt;code&gt;conf/policy.d&lt;/code&gt;, and those are the ones you want to be editing. Permissions you want to add for your web apps will likely best fit in &lt;code&gt;50user.policy&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The policy files are concatenated and the settings initialized when Tomcat starts. Hence, you need to restart Tomcat in order for permission changes to have an effect.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The &lt;code&gt;codeBase&lt;/code&gt; string is a URL, so it always takes forward slashes. File names for &lt;code&gt;FilePermission&lt;/code&gt; may be operating system dependent, so you should use &lt;code&gt;${file.separator}&lt;/code&gt; instead there.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;As explained in the Sun doc, an asterisk (&lt;code&gt;*&lt;/code&gt;) in a path for &lt;code&gt;FilePermission&lt;/code&gt; (roughly) means "everything in this directory", while a dash (&lt;code&gt;-&lt;/code&gt;) means "everything in this directory and recursively in all subdirectories". Likewise, the beginning of a host address for &lt;code&gt;SocketPermission&lt;/code&gt; may be wildcarded with an asterisk. In the extreme case, the entire host address may be an asterisk and so will apply to "any host".&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;If you're having trouble getting permissions to take effect, you can try narrowing down the problem by making either the codeBase universal (surprisingly, the "codeBase" descriptor is optional, so it's quite legal to have a stanza that starts with "&lt;code&gt;permit {&lt;/code&gt;" or the permission all-encompassing: that would be "&lt;code&gt;java.security.AllPermission&lt;/code&gt;". Once you get stuff working with this gaping security hole, you will want to go back and try to tighten it up again.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-5860968586229063238?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/5860968586229063238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=5860968586229063238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5860968586229063238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/5860968586229063238'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/11/tomcat-permissions.html' title='Tomcat permissions'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-6635456903988180831</id><published>2008-11-15T09:48:00.000-08:00</published><updated>2008-11-15T09:57:24.594-08:00</updated><title type='text'>Document is null</title><content type='html'>I tried to read an XML configuration file into a DOM, like so:&lt;code&gt;&lt;pre&gt;&lt;br /&gt; InputStream configInputStream = this.getClass().getClassLoader().getResourceAsStream(CONF_FILE_NAME);&lt;br /&gt; log("configInputStream = " + configInputStream);&lt;br /&gt; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();&lt;br /&gt; DocumentBuilder db = dbf.newDocumentBuilder();&lt;br /&gt; Document doc = db.parse(configInputStream);&lt;br /&gt; log("Found and read configuration: " + doc);&lt;br /&gt; configInputStream.close();&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;...and the log said:&lt;br /&gt;&lt;code&gt;INFO: ToonGrator: Found and read configuration: [#document: null]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I guess the square brackets and the extra text should have tipped me off, but I sure thought&lt;br /&gt;I had read in a &lt;code&gt;null&lt;/code&gt; document!&lt;br /&gt;&lt;br /&gt;It isn't really. It turns out that the root (or document) node always contains no text, so&lt;br /&gt;whatever its &lt;code&gt;toString()&lt;/code&gt; returns will say "null". Oh well, back to work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-6635456903988180831?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/6635456903988180831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=6635456903988180831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/6635456903988180831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/6635456903988180831'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/11/document-is-null.html' title='Document is null'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-4138219298281091788</id><published>2008-11-12T03:53:00.000-08:00</published><updated>2008-11-12T04:47:31.284-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='permission'/><category scheme='http://www.blogger.com/atom/ns#' term='internet explorer'/><category scheme='http://www.blogger.com/atom/ns#' term='ie'/><category scheme='http://www.blogger.com/atom/ns#' term='xmldom'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Writing files from JavaScript</title><content type='html'>In Internet Explorer, you can use the &lt;code&gt;ActiveXObject&lt;/code&gt; "&lt;code&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa468547.aspx"&gt;microsoft.xmldom&lt;/a&gt;&lt;/code&gt;" to load an XML file into a DOM that can be inspected and manipulated from JavaScript. So far so good. But what if you want to write an XML file to the local file system? &lt;code&gt;XmlDom&lt;/code&gt; has a &lt;code&gt;save()&lt;/code&gt; method and the argument lets you specify a local file path. But in IE6 and later, the attempt will always fail.&lt;br /&gt;&lt;br /&gt;The 'net is full of forum posts with frantic pleas for help with titles like "&lt;i&gt;XML DOM save - File Permission denied&lt;/i&gt;". In almost all cases, the answers fell into the following categories:&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;"Tough luck, that's the way it is" / "the cookie crumbles."&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;True enough, but not helpful.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;"You need to have write permission on the folder you're writing to!"&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;True enough, but I'll bet everyone with half a brain checked that before posting. Even if that was the problem, you'd run up against the previous one.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;"I have the same problem. Please email me the answer!"&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Me too!&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;"You can't do that from HTML, you need a &lt;a href="http://en.wikipedia.org/wiki/HTML_Application"&gt;HTA&lt;/a&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;True enough, but if the requester could get a user to download and execute an application he wouldn't have this problem in the first place.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;"In ASP on the server you do this..."&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;That doesn't help with saving files on the client's file system.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;It was a long time before I came across a post that mentioned &lt;a href="http://msdn.microsoft.com/en-us/library/6kxy1a51(VS.85).aspx"&gt;FileSystemObject&lt;/a&gt;. It turns out that while &lt;code&gt;xmldom.save()&lt;/code&gt; is never allowed to write to the local file system (apparently no amount of tweaking any permissions will change that), &lt;code&gt;FileSystemObject&lt;/code&gt; can create, read, write and even delete files, subject to permissions given in IE's &lt;em&gt;Internet Options&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;It's no big deal to pull the XML from the DOM as a &lt;code&gt;String&lt;/code&gt; and to save it using a &lt;code&gt;TextStream&lt;/code&gt; object created by &lt;code&gt;FileSystemObject.CreateTextFile()&lt;/code&gt;. Here's a code sample of mine that does it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;      function save2()&lt;br /&gt;      {&lt;br /&gt;       var xmlDoc = new ActiveXObject("microsoft.xmldom");&lt;br /&gt;       xmlDoc.load(path + "stuff.xml");&lt;br /&gt;       alert("stuff.xml loaded");&lt;br /&gt;       fso = new ActiveXObject("Scripting.FileSystemObject");&lt;br /&gt;       f2 = fso.CreateTextFile(path + "stuff2.xml", true);&lt;br /&gt;       f2.write(xmlDoc.xml);&lt;br /&gt;       f2.Close();&lt;br /&gt;       alert("stuff2.xml saved");&lt;br /&gt;      }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I surmise that more readers of those forums knew the "right" answer but chose not to tell because they suspected malicious intent on part of the requesters. When you can write to the user's file system you can do many evil things.&lt;br /&gt;&lt;br /&gt;My take on this is: Any user surfing the Web with IE and permissions set to "trusting" is asking for trouble anyway; and the more professional malware authors already know how to exploit this. Microsoft's choice to never allow &lt;code&gt;XmlDom&lt;/code&gt; to save looks silly in view of the fact that there's a perfectly workable back door.&lt;br /&gt;&lt;br /&gt;My own use of this feature is legitimate, of course: I'm working with a JavaScript application that wants to store some user settings on the user's machine. More information than will fit into a cookie, and there's no server to persist the information on. Also, it's a closed environment, even to the user, with no Internet connection, so it can safely run with full permissions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-4138219298281091788?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/4138219298281091788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=4138219298281091788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4138219298281091788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/4138219298281091788'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/11/writing-files-from-javascript.html' title='Writing files from JavaScript'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-8054385706961067686</id><published>2008-09-03T03:06:00.000-07:00</published><updated>2008-09-03T03:22:37.749-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='namespace'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>Namespaces in XSLT</title><content type='html'>XSLT tutorials and references usually pretend that namespaces don't exist. However, when trying to process an XML document (an XHTML document in this case) that declared a namespace, none of my element node references matched!&lt;br /&gt;&lt;br /&gt;XSLT (rightly) distinguishes between element names with no namespace qualifier (which are processed as belonging in the "no namespace" namespace) and names with an explicit qualifier, which of course are treated as belonging to that namespace.&lt;br /&gt;&lt;br /&gt;The solution is to&lt;ul&gt;&lt;br /&gt;&lt;li&gt;declare a prefix for the source document's namespace(s) in the XSLT document node, like (e.g.)&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;xsl:stylesheet &lt;br /&gt;   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&lt;br /&gt;   xmlns:xhtml="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use these prefixes in your patterns, like (e.g.)&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  &amp;lt;xsl:template match="xhtml:p"&gt;&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;My thanks to &lt;a href="http://www.jenitennison.com/"&gt;Jeni Tennison&lt;/a&gt; for explaining it very clearly in &lt;a href="http://sources.redhat.com/ml/xsl-list/2001-12/msg00526.html"&gt;this post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-8054385706961067686?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/8054385706961067686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=8054385706961067686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8054385706961067686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/8054385706961067686'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/09/namespaces-in-xslt.html' title='Namespaces in XSLT'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-7216901426143259945</id><published>2008-09-02T09:11:00.000-07:00</published><updated>2008-09-02T09:25:19.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet connection'/><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='catalog'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Parsing XML with an Internet connection</title><content type='html'>I'm trying to use XSLT (&lt;a href="http://xml.apache.org/xalan-j/"&gt;XALAN-J&lt;/a&gt; in my case) to extract and re-format some information from some XML files. These files refer to some external entities such as the XHTML definition at &lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&lt;/a&gt;. The SAX parser, even with validation turned off, insists on going out on the Web to fetch that DTD and its brethren.&lt;br /&gt;&lt;br /&gt;I'm at my workplace, and access to the Web is through a proxy. There are Java system properties I could set to give my application Web access, but I'd have to include my proxy user ID and password, and the external access might still slow my application down.&lt;br /&gt;&lt;br /&gt;I tore my hair out for some time and Googling took a long time, this time, to bring me toward a solution.&lt;br /&gt;&lt;br /&gt;The solution, in a nutshell, works like this:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Manually download all required files to a local directory that will later be included with the app;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Provide a catalog redirecting references from their customary URIs to local ones;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Include the Apache Commons Resolver library;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Provide a &lt;tt&gt;CatalogResolver.properties&lt;/tt&gt; file to tell the Resolver where to find the catalog;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;attach a &lt;tt&gt;new CatalogResolver()&lt;/tt&gt; to the XML reader.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This is helpfully pointed out and very well explained &lt;a href="http://www.xml.com/pub/a/2004/03/03/catalogs.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-7216901426143259945?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/7216901426143259945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=7216901426143259945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/7216901426143259945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/7216901426143259945'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/09/parsing-xml-with-internet-connection.html' title='Parsing XML with an Internet connection'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-2770351074285358725</id><published>2008-08-24T01:16:00.000-07:00</published><updated>2008-08-24T01:35:50.182-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ati'/><category scheme='http://www.blogger.com/atom/ns#' term='driver'/><title type='text'>Windows 2000 driver for ATI Rage 128 PRO</title><content type='html'>My mother's PC broke down quite suddenly about a week ago. PC would boot but the screen said "NO SIGNAL". Guessing the video card to be at fault, I packed up an old AGP card and some other stuff and drove down to see what I could do.&lt;br /&gt;&lt;br /&gt;Bingo! Replaced the card and got Windows visible on the screen again. But it was displaying in 800x600 and 16 colors. Windows 2000 wouldn't recognize the card so it defaulted to "VGA compatible."&lt;br /&gt;&lt;br /&gt;Thus began my hunt for a driver. The sticker on the card says "ATI RAGE 128 PRO 32MB". Well, ATI is a major player in the video card business, so it shouldn't be a problem, should it?&lt;br /&gt;&lt;br /&gt;"www.ati.com@ redirects to &lt;a href="http://ati.amd.com/"&gt;ati.amd.com&lt;/a&gt; . Seems ATI wasn't big enough to avoid being swallowed by AMD. OK, so far so good.&lt;br /&gt;&lt;br /&gt;There's a "find your driver" page with a nested menu that leads to "legacy drivers" leads to a driver allegedly good for Windows 2000. A half hour download on my mom's 56K line.&lt;br /&gt;&lt;br /&gt;What's this? &lt;b&gt;"You need DirectX 8 to run this installer?"&lt;/b&gt; I cursed a bit at this craziness and proceeded. Eventually got to the installer and... &lt;b&gt;"This driver is not compatible with the card(s) in your computer."&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I spent 4 hours with Google and downloading drivers from other sites. Many sites, such as &lt;a href="http://drivers.softpedia.com"&gt;softpedia.com&lt;/a&gt;, give you menus and descriptions and make your mouth all watery... only to send you back to ATI/AMD's page.&lt;br /&gt;&lt;br /&gt;Finally found a "reference driver" at &lt;a href="http://www.treiber-world.de/download-treiber-Grafikkarte-ATI-Rage-128-Pro-Serie-Referenz-Treiber-16509.html"&gt;www.treiber-world.de&lt;/a&gt; that worked. I thank the good folks there, and hope my reference to them doesn't get them in trouble with AMD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-2770351074285358725?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/2770351074285358725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=2770351074285358725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/2770351074285358725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/2770351074285358725'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/08/windows-2000-driver-for-ati-rage-128.html' title='Windows 2000 driver for ATI Rage 128 PRO'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-2237397390949951066</id><published>2008-08-18T03:16:00.000-07:00</published><updated>2008-08-18T03:39:58.449-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='date arithmetic'/><title type='text'>Date Arithmetic</title><content type='html'>In 1996 I wrote a log file management utility on a UNISYS mainframe. It's written in SSG, an obscure script language that has no built-in date arithmetic. It worked mostly OK with my own home-cobbled date arithmetic routines, but every now and then I get complaints about it blowing up due to date-related problems. Time for correct and robust date arithmetic!&lt;br /&gt;&lt;br /&gt;I came across &lt;a href="http://alcor.concordia.ca/%7Egpkatch/gdate-algorithm.html"&gt;these algorithms&lt;/a&gt; by &lt;a href="http://alcor.concordia.ca/%7Egpkatch/"&gt;Gary Katch&lt;/a&gt;. They are short, fast and easily portable. All that's required is integer arithmetic in about 32 bits.&lt;br /&gt;&lt;br /&gt;There's no copyright notice on Gary's page, so assuming his consent I'll excerpt the bare bones here, just in case his page gets lost on the 'net:&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;h3&gt;Calculate day number from date&lt;/h3&gt;&lt;br /&gt;Given integer y, m, d, calculate day number g as:&lt;br /&gt;&lt;blockquote&gt;&lt;pre style="color:black;"&gt;&lt;br /&gt;function g(y,m,d)&lt;br /&gt;m = (m + 9) % 12&lt;br /&gt;y = y - m/10&lt;br /&gt;return 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + d - 1 )&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Calculate date from day number&lt;/h3&gt;&lt;br /&gt;Given day number g, calculate year, month, and day:&lt;br /&gt;&lt;blockquote&gt;&lt;pre style="color:black;"&gt;&lt;br /&gt;function d(g)&lt;br /&gt;y = (10000*g + 14780)/3652425&lt;br /&gt;ddd = g - (365*y + y/4 - y/100 + y/400)&lt;br /&gt;if (ddd &amp;lt; 0) then&lt;br /&gt;y = y - 1&lt;br /&gt;ddd = g - (365*y + y/4 - y/100 + y/400)&lt;br /&gt;endif&lt;br /&gt;mi = (100*ddd + 52)/3060&lt;br /&gt;mm = (mi + 2)%12 + 1&lt;br /&gt;y = y + (mi + 2)/12&lt;br /&gt;dd = ddd - (mi*306 + 5)/10 + 1&lt;br /&gt;return y, mm, dd&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;In these routines, "%" means modulo, and all division is integer (and thus truncated). I've found them to work well and can recommend them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-2237397390949951066?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/2237397390949951066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=2237397390949951066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/2237397390949951066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/2237397390949951066'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/08/date-arithmetic.html' title='Date Arithmetic'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7899729191481151759.post-3977706062416683443</id><published>2008-08-15T08:27:00.000-07:00</published><updated>2008-08-15T09:09:36.868-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teamspeak'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='alsa'/><title type='text'>Teamspeak under Linux</title><content type='html'>I play &lt;a href="http://www.worldofwarcraft.com"&gt;World of Warcraft&lt;/a&gt; on a machine running Kubuntu 8.04 . &lt;a href="http://www.goteamspeak.com"&gt;TeamSpeak&lt;/a&gt; is practically required for in-game voice communication.&lt;br /&gt;&lt;br /&gt;Sadly, TeamSpeak doesn't play nicely with sound systems under Linux - it blocks an entire sound device.&lt;br /&gt;&lt;br /&gt;Some solid information and advice on how to deal with the problem, the best I've found yet, is found on the &lt;a href="http://www.linux-gamers.net/modules/wiwimod/index.php?page=HOWTO+Sound"&gt;Linux Gamers&lt;/a&gt; site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7899729191481151759-3977706062416683443?l=wondersofcomputing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wondersofcomputing.blogspot.com/feeds/3977706062416683443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7899729191481151759&amp;postID=3977706062416683443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/3977706062416683443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7899729191481151759/posts/default/3977706062416683443'/><link rel='alternate' type='text/html' href='http://wondersofcomputing.blogspot.com/2008/08/teamspeak-under-linux.html' title='Teamspeak under Linux'/><author><name>Carl</name><uri>http://www.blogger.com/profile/12472048557599823717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_bw0W_e8N6QA/SKlKCyDU2tI/AAAAAAAAAA4/UtLHwknBex0/S220/Carl.jpg'/></author><thr:total>0</thr:total></entry></feed>
