<?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-10026400</id><updated>2012-02-07T21:34:09.869Z</updated><category term='sakai'/><title type='text'>blog buckett</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default?start-index=101&amp;max-results=100'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>155</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10026400.post-2678049570544876337</id><published>2011-12-31T10:32:00.001Z</published><updated>2011-12-31T10:32:05.319Z</updated><title type='text'>General Logging in MySQL</title><content type='html'>&lt;br /&gt;
&lt;br /&gt;
I was looking to investigate some connection problems we were having to a MySQL database and wanted to be sure that the client was connecting to correct machine. MySQL 5.1 doesn't provide this information on it's own, but it is contained in the general log. However the log contains all statements executed against MySQL so will have a performance impact on a production machine. The general log can be enabled/disabled while MySQL is still running which means you can enable the logging, capture the events your interested in and then disable it again. Todo this connect to MySQL as a user who can set GLOBALS (typically root) and run:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;mysql&amp;gt; SET GLOBAL general_log_file='/var/log/mysql.log';
Query OK, 0 rows affected (0.00 sec)

mysql&amp;gt; SET GLOBAL general_log = 1;
Query OK, 0 rows affected (0.00 sec)
&lt;/pre&gt;&lt;br /&gt;
Then the file /var/log/mysql.log should start filling up with statements. Once your done disable the general log:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;mysql&amp;gt; SET GLOBAL general_log = 0;
Query OK, 0 rows affected (0.01 sec)
&lt;/pre&gt;&lt;br /&gt;
In my case I was looking for connection messages so a simple grep pulled out the lines I was interested in:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;grep Connect /var/log/mysql.log | less
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2678049570544876337?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2678049570544876337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2678049570544876337' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2678049570544876337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2678049570544876337'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2011/12/general-logging-in-mysql.html' title='General Logging in MySQL'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3797317954772234160</id><published>2010-06-01T13:25:00.004Z</published><updated>2010-06-01T14:09:36.420Z</updated><title type='text'>Using a maven SNAPSHOT plugin from repository.apache.org</title><content type='html'>&lt;p&gt;
I was working on a project and hitting a &lt;a href="http://jira.codehaus.org/browse/MECLIPSE-605"&gt;bug&lt;/a&gt; in the &lt;a href="http://maven.apache.org/plugins/maven-eclipse-plugin/"&gt;maven eclipse plugin&lt;/a&gt; which was causing the JRE to be placed incorrectly in the Eclipse .classpath. If it was just a single project I'd have gone and edited the resulting file manually but it affected a few, so I thought I'd try and grab a newer copy of the maven eclipse plugin. I did this by first adding a profile to my maven setttings.xml file ($HOME/.m2/settings.xml on UNIX).
&lt;/p&gt;
&lt;div&gt;
&lt;code&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;settings xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd&amp;quot;&amp;gt;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;profiles&amp;gt;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- This is the additional bit you need --&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;profile&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;apache-plugin-snapshots&amp;lt;/id&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;pluginRepositories&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;pluginRepository&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;apache-snapshots&amp;lt;/id&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;Apache Snapshot Repository&amp;lt;/name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;https://repository.apache.org/content/groups/snapshots-group/&amp;lt;/url&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;releases&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/releases&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;snapshots&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/snapshots&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/pluginRepository&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/pluginRepositories&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/profile&amp;gt;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/profiles&amp;gt;&lt;br&gt;
&lt;br&gt;
&amp;lt;/settings&amp;gt;&lt;br&gt;
&lt;br&gt;
&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;
and then run the mvn eclipse command:
&lt;/p&gt;
&lt;code&gt;
mvn -Papache-plugin-snapshots org.apache.maven.plugins:maven-eclipse-plugin:2.9-SNAPSHOT:eclipse
&lt;/code&gt;
&lt;p&gt;
which downloaded the newer plugin and then ran it against the project I had checked out.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3797317954772234160?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3797317954772234160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3797317954772234160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3797317954772234160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3797317954772234160'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2010/06/using-maven-snapshot-plugin-from.html' title='Using a maven SNAPSHOT plugin from repository.apache.org'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3979162700472645354</id><published>2009-03-23T13:40:00.002Z</published><updated>2009-03-23T13:55:57.793Z</updated><title type='text'>Java host caching (sun.net.inetaddr.ttl/networkaddress.cache.ttl) on OS X</title><content type='html'>On my Mac OS X box I was trying to get some round robin DNS working from Java (1.5) but I was the host was always resolving to the same IP. I'd set &lt;code&gt;sun.net.inetaddr.ttl=0&lt;/code&gt;, but that didn't seem to help. It seems out of the box a Mac will &lt;a href="http://inertramblings.com/2004/05/11/mac-os-x-clearing-dns-cache/"&gt;cache lookups&lt;/a&gt;, but you can clean out the cache with the command &lt;code&gt;dscacheutil -flushcache&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3979162700472645354?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3979162700472645354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3979162700472645354' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3979162700472645354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3979162700472645354'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2009/03/java-host-caching-sunnetinetaddrttlnetw.html' title='Java host caching (sun.net.inetaddr.ttl/networkaddress.cache.ttl) on OS X'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-7940308881215770504</id><published>2009-02-02T10:55:00.002Z</published><updated>2009-02-02T11:15:39.504Z</updated><title type='text'>gitweb - 500 - HEAD ref not found for project</title><content type='html'>&lt;p&gt;
We have some git repositories here at Oxford and a gitweb interface to view them. For some of our projects I was seeing:
&lt;/p&gt;
&lt;code&gt;500 - HEAD ref not found for project&lt;/code&gt;
&lt;p&gt;It turns out this was because the &lt;code&gt;HEAD&lt;/code&gt; file ( {git-directoy}/HEAD ) was pointing to &lt;code&gt;ref: refs/heads/master&lt;/code&gt; and these projects didn't have a master branch. Changing the HEAD file to point to the correct branch fixed gitweb.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-7940308881215770504?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/7940308881215770504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=7940308881215770504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7940308881215770504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7940308881215770504'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2009/02/gitweb-500-head-ref-not-found-for.html' title='gitweb - 500 - HEAD ref not found for project'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-7381356133442416827</id><published>2009-01-22T16:24:00.003Z</published><updated>2009-01-22T16:52:46.705Z</updated><title type='text'>Trimpath error "context._MODIFIERS is undefined"</title><content type='html'>&lt;p&gt;
I was doing a little JavaScript templating with &lt;a href="http://code.google.com/p/trimpath/wiki/JavaScriptTemplates"&gt;Trimpath&lt;/a&gt; today and at one point I was getting a nice error in my console of:
&lt;/p&gt;
&lt;code&gt;
context._MODIFIERS is undefined
&lt;/code&gt;
&lt;p&gt;
Looking through the trimpath code it turned out this was because I was passing in a string rather than an object as my context for the generation of the template. So I was effectively doing:
&lt;/p&gt;
&lt;code&gt;
TrimPath.processDOMTemplate("someNodeId", "some string");
&lt;/code&gt;
&lt;p&gt;
rather than:
&lt;/p&gt;
&lt;code&gt;
TrimPath.processDOMTemplate("someNodeId", {key: "value", otherKey: "value"});
&lt;/code&gt;
&lt;p&gt;
In my case I was getting the error because I forgot to eval some JSON before passing it to trimpath.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-7381356133442416827?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/7381356133442416827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=7381356133442416827' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7381356133442416827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7381356133442416827'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2009/01/trimpath-error-contextmodifiers-is.html' title='Trimpath error &quot;context._MODIFIERS is undefined&quot;'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-8867907956866630178</id><published>2008-12-24T11:52:00.002Z</published><updated>2008-12-24T12:00:17.363Z</updated><title type='text'>Pooling in Sakai LDAP</title><content type='html'>Here at Oxford we connect to a LDAP server to get details about users for our &lt;a href="https://beta.weblearn.ox.ac.uk/portal/"&gt;Sakai service.&lt;/a&gt; Previously we had reports of some pages taking a long time to load when lots of users details where requested from the LDAP. One obvious change we could make was to switch to use pooling on our connections to the LDAP server. To check that this was improving the performance I wrote a little test case which attempts to get details about 100 users individually from the LDAP.
&lt;ul&gt;&lt;li&gt;Without pooling - 100 users in 10 sec = 10 users/sec.&lt;/li&gt;&lt;li&gt;With pooling - 100 users in 5 secs = 20 users/sec.&lt;/li&gt;&lt;/ul&gt;This is a nice doubling of performance, although I was still expecting to see better performance generally and while the test is running the local load on the machine isn't very high so I suspect any further performance improvements will have to come on the server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-8867907956866630178?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/8867907956866630178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=8867907956866630178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8867907956866630178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8867907956866630178'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/12/pooling-in-sakai-ldap.html' title='Pooling in Sakai LDAP'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4631720653688525913</id><published>2008-12-23T15:05:00.002Z</published><updated>2008-12-23T15:09:34.219Z</updated><title type='text'>Tomcat UNIX aliases</title><content type='html'>To make managing development instances of tomcat a little easier I have a few bash aliases (you can add these lines to your ~/.bash_profile):
&lt;pre&gt;
alias tchome='export CATALINA_HOME=`pwd`; echo CATALINA_HOME=$CATALINA_HOME'
alias tctail='tail -f ${CATALINA_HOME}/logs/catalina.out'
alias tcless='less ${CATALINA_HOME}/logs/catalina.out'
alias tcshow='echo ${CATALINA_HOME}'
alias tc='${CATALINA_HOME}/bin/catalina.sh'
&lt;/pre&gt;
so my typical workflow is &lt;code&gt;cd {tomcat-directory}&lt;/code&gt;, &lt;code&gt;tchome&lt;/code&gt; and then I move back around the filesystem and use &lt;code&gt;tc start&lt;/code&gt; and &lt;code&gt;tctail&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4631720653688525913?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4631720653688525913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4631720653688525913' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4631720653688525913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4631720653688525913'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/12/tomcat-unix-aliases.html' title='Tomcat UNIX aliases'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-6747601935498558425</id><published>2008-09-29T20:52:00.002Z</published><updated>2008-09-29T20:58:23.454Z</updated><title type='text'>Keep on rolling...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FltME488_qM/SOFAn0ajnII/AAAAAAAAABk/Ct0TyX778GM/s1600-h/DSC00286.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_FltME488_qM/SOFAn0ajnII/AAAAAAAAABk/Ct0TyX778GM/s200/DSC00286.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5251549693319814274" /&gt;&lt;/a&gt;
Well after a quite a few weeks of waiting my new set of wheels turned up. A Brompton S6L in apple green. The gears needs a little adjusting but otherwise it's a great ride.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-6747601935498558425?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/6747601935498558425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=6747601935498558425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/6747601935498558425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/6747601935498558425'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/09/keep-on-rolling.html' title='Keep on rolling...'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FltME488_qM/SOFAn0ajnII/AAAAAAAAABk/Ct0TyX778GM/s72-c/DSC00286.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-102461376805816853</id><published>2008-09-24T21:06:00.008Z</published><updated>2008-09-26T16:45:28.196Z</updated><title type='text'>Error: sec_error_bad_signature with Firefox 3</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FltME488_qM/SN0RmzWHsfI/AAAAAAAAABc/OHJ2ksBDz98/s1600-h/Picture+13.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_FltME488_qM/SN0RmzWHsfI/AAAAAAAAABc/OHJ2ksBDz98/s320/Picture+13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5250372098899554802" /&gt;&lt;/a&gt;
&lt;p&gt;

Recently when most of our team upgraded their browsers to Firefox 3 we noticed then when we tried to visit on of our internal websites over a secure connection we would get presented with an error page saying "sec_error_bad_signature". Most of the &lt;a href="http://technicalmumblings.wordpress.com/2008/06/13/firefox-3-handling-of-unverified-ssl-certificates/"&gt;existing comments&lt;/a&gt; on the web seem to be saying that they are seeing this error when visiting a site with an untrusted certificate. However in our case it was a correctly signed certificate obtained through the &lt;a href="http://www.ja.net/services/scs/"&gt;JANET Server Certificate Service&lt;/a&gt;.
&lt;/p&gt;
&lt;br clear="all"/&gt;
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FltME488_qM/SNqzfJWEdJI/AAAAAAAAABU/_xH2GzsZ8UY/s1600-h/Picture+15.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_FltME488_qM/SNqzfJWEdJI/AAAAAAAAABU/_xH2GzsZ8UY/s200/Picture+15.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5249705663319536786" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FltME488_qM/SNqy9ie8vfI/AAAAAAAAABM/Mhigg0vS73c/s1600-h/Picture+14.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_FltME488_qM/SNqy9ie8vfI/AAAAAAAAABM/Mhigg0vS73c/s200/Picture+14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5249705085952114162" /&gt;&lt;/a&gt;
The server is just a Ubuntu Linux server with a standard installation of Apache Tomcat 5.5 and another very similar setup was working correctly. But after close inspection it became clear that the server had a public key using the &lt;a href="http://en.wikipedia.org/wiki/Digital_Signature_Algorithm"&gt;DSA&lt;/a&gt; algorithm but the machine that was working correctly was using the &lt;a href="http://en.wikipedia.org/wiki/RSA"&gt;RSA&lt;/a&gt; algorithm. The certificate work was done with the Java keytool command and I think I probably didn't specify the &lt;code&gt;-keyalg RSA&lt;/code&gt; argument. After recreating with RSA the certificate and installing it everything was working correctly. The screenshots are taken with Safari (which worked fine with DSA) and shows the two different certificates.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-102461376805816853?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/102461376805816853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=102461376805816853' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/102461376805816853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/102461376805816853'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/09/error-secerrorbadsignature-with-firefox.html' title='Error: sec_error_bad_signature with Firefox 3'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FltME488_qM/SN0RmzWHsfI/AAAAAAAAABc/OHJ2ksBDz98/s72-c/Picture+13.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-837322630119699003</id><published>2008-08-16T08:45:00.002Z</published><updated>2008-08-16T09:06:30.199Z</updated><title type='text'>Jack Buckett</title><content type='html'>Well it's happened again and our second son &lt;a href="http://flickr.com/photos/buckett/sets/72157606610427214/"&gt;Jack Buckett&lt;/a&gt; was born on Wednesday the 6th of August at 8:31 weighing 4.09kgs. We are all home and doing well now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-837322630119699003?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/837322630119699003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=837322630119699003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/837322630119699003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/837322630119699003'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/08/jack-buckett.html' title='Jack Buckett'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-5835460362346711569</id><published>2008-07-15T09:04:00.005Z</published><updated>2008-07-15T09:15:42.861Z</updated><title type='text'>RSF Error</title><content type='html'>&lt;p&gt;
I've just been doing a little web development with &lt;a href="http://www2.caret.cam.ac.uk/rsfwiki/"&gt;RSF&lt;/a&gt; and it seemed that sometimes when accessing the RSF webapp I would get an error:
&lt;/p&gt;
&lt;code&gt;
[An error occurred handling this RSF request]&lt;br/&gt;
[Context has not been started properly]&lt;br/&gt;
&lt;/code&gt;
&lt;p&gt;
with a stack trace starting with:
&lt;/p&gt;
&lt;code&gt;
WARN: Error initialising SakaiRSF servlet:  (2008-07-15 10:07:43,909 http-9080-Processor21_PonderUtilCore)&lt;br/&gt;
java.lang.IllegalStateException: Error acquiring web application context - servlet context not configured correctly&lt;br/&gt;
 at uk.ac.cam.caret.sakai.rsf.servlet.ReasonableSakaiServlet.init(ReasonableSakaiServlet.java:41)&lt;br/&gt;
 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139)&lt;br/&gt;
 at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:791)&lt;br/&gt;
&lt;/code&gt;
&lt;p&gt;
It seems that this occurs if you access the RSF webapp while it is still starting up. The only way to fix it is to reload the webapp again and give it a little more time.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-5835460362346711569?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/5835460362346711569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=5835460362346711569' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5835460362346711569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5835460362346711569'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/07/rsf-error.html' title='RSF Error'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-5850883050005997352</id><published>2008-04-15T10:20:00.005Z</published><updated>2008-04-15T10:44:17.616Z</updated><title type='text'>Removing Eclipse team provider information</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_FltME488_qM/SASF1kRf3tI/AAAAAAAAAAU/k6HneCIkor0/s1600-h/team-empty.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;" src="http://bp3.blogger.com/_FltME488_qM/SASF1kRf3tI/AAAAAAAAAAU/k6HneCIkor0/s400/team-empty.png" alt="" id="BLOGGER_PHOTO_ID_5189419825954283218" border="0" padding="2px" /&gt;&lt;/a&gt;At the moment there are two competing plugins for Eclipse that can provide SVN integration, Subversive and Subclipse. At various times I have tried each of them and they both have their plus points however if I have a project checked out with one plugin and the Eclipse installation I am using doesn't have that plugin installed I don't get any options under the team menu to share the project.
&lt;p&gt;
Rather than getting the old plugin back running and "un-sharing" the project you can just delete a file from the workspace metadata to allow you to re-share the project.
&lt;br/&gt;
&lt;code&gt;workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/{projectname}/.index.properties&lt;/code&gt;
&lt;br/&gt;
This seems to work for me under Eclipse 3.3.2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-5850883050005997352?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/5850883050005997352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=5850883050005997352' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5850883050005997352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5850883050005997352'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/04/removing-eclipse-team-provider.html' title='Removing Eclipse team provider information'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_FltME488_qM/SASF1kRf3tI/AAAAAAAAAAU/k6HneCIkor0/s72-c/team-empty.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2878298674876814656</id><published>2008-03-19T09:28:00.002Z</published><updated>2008-03-19T09:33:13.523Z</updated><title type='text'>tailor for svn to hg</title><content type='html'>Well after attempting to convert the portal part of the sakai subversion repository to mercurial I have discovered that tailor (the tool I used) doesn't understand svn tags and branches (or doesn't convert them to mercurial tags and branches). So although is seems to have converted the portal ok. I now have a huge checkout:
&lt;p&gt;
&lt;pre&gt;
buckett@oucs-matthewb:~/tmp/portal $ du -sh *
228M    branches
4.0K    project.log
739M    tags
23M     trunk
&lt;/pre&gt;
&lt;p&gt;
So I think tailor would well for converting a branch (eg 2.5-x) or trunk but not for keeping details about when those branches were made from trunk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2878298674876814656?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2878298674876814656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2878298674876814656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2878298674876814656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2878298674876814656'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/03/tailor-for-svn-to-hg.html' title='tailor for svn to hg'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3976082067484245111</id><published>2008-03-17T17:49:00.003Z</published><updated>2008-03-17T18:11:56.305Z</updated><title type='text'>Converting Subversion repository to Mercurial with tailor (Ubuntu 7.10)</title><content type='html'>I'm looking at managing our local builds in a better way than a set of patches against a point on the Sakai tree. Currently I am looking at placing a copy of the sakai &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt; repository into a &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;mercurial&lt;/a&gt; one. Mercurial doesn't seem to have good subversion support out of the box (unlike git) but the suggested route seems to be to use a genral purpose tool called &lt;a href="http://progetti.arstecnica.it/tailor/"&gt;tailor&lt;/a&gt;. Subversion, mercurial and tailor are packaged for Ubuntu (7.10) so after installing them I attempted a quick conversion of part of the Sakai repository.
&lt;p&gt;
To do this I generated a tailor configuration file with a command similar to:&lt;br/&gt;
&lt;code&gt;
tailor --verbose --source-kind svn --repository https://source.sakaiproject.org/svn/ --module portal --target-kind hg  &amp;gt; sakai.tailor
&lt;/code&gt;&lt;br/&gt;
and then attempted to run the conversion with:&lt;br/&gt;
&lt;code&gt;
tailor -c sakai.tailor
&lt;/code&gt;&lt;br/&gt;
which failed with a nice python stack trace:&lt;br/&gt;
&lt;code&gt;
  File "/var/lib/python-support/python2.4/vcpx/repository/hg.py", line 438, in _prepareWorkingDirectory&lt;br/&gt;
    message = 'Tailor preparing to convert repo by adding .hgignore')&lt;br/&gt;
  File "/var/lib/python-support/python2.4/vcpx/repository/hg.py", line 339, in _hgCommand
    allopts = self._defaultOpts(cmd)&lt;br/&gt;
  File "/var/lib/python-support/python2.4/vcpx/repository/hg.py", line 333, in _defaultOpts
    findcmd = commands.find&lt;br/&gt;
AttributeError: 'module' object has no attribute 'find'&lt;br/&gt;
&lt;/code&gt;&lt;br/&gt;
after a little puzzling I found a bug report about this &lt;a href="http://progetti.arstecnica.it/tailor/ticket/138"&gt;"not compatible with mercurial 0.9.4"&lt;/a&gt;, which contained a small patch to fix the issue. Applying this patch to my local machine allowed tailor to run fine. It seems that Ubuntu 8.04 (which will be released in a month) contains a later version of tailor so people shouldn't see this issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3976082067484245111?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3976082067484245111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3976082067484245111' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3976082067484245111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3976082067484245111'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/03/converting-subversion-repository-to.html' title='Converting Subversion repository to Mercurial with tailor (Ubuntu 7.10)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-25316136434218754</id><published>2008-02-25T11:54:00.003Z</published><updated>2008-02-25T16:40:11.245Z</updated><title type='text'>Following Sakai developments</title><content type='html'>&lt;p&gt;
Some of my current work involves developing the Sakai portal and collaborating with others in this space. To keep abreast of what is happening I follow the SVN commit messages and have a filter setup in the Sakai bug tracking system (JIRA).
&lt;/p&gt;
&lt;p&gt;
I filter the SVN commit messages (as I get notified of every single Sakai commit) so that I only see the ones that relate to the /portal part of the repository. My filter (GMail) for this is &lt;code&gt;to:(source@collab.sakaiproject.org) (portal/trunk OR portal/branchces)&lt;/code&gt;. In JIRA I have a filter which emails me any tickets that have changed in the last 24 hours and have it run once a day. The trick for this is to have the &lt;em&gt;Updated From&lt;/em&gt; field set to &lt;em&gt;-1d&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
This all allows me to know about stuff that is changing without being overwhelmed with email.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-25316136434218754?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/25316136434218754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=25316136434218754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/25316136434218754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/25316136434218754'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/02/following-sakai-developments.html' title='Following Sakai developments'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115747480776193138</id><published>2008-01-07T12:43:00.000Z</published><updated>2008-01-07T14:09:16.157Z</updated><title type='text'>Disabled input buttons in Sakai</title><content type='html'>&lt;p&gt;
In HTML you can disable the ability for an input button to be clicked typically you just add the disabled attribute to a button with some value. Eg:
&lt;/p&gt;
&lt;code&gt;
&amp;lt;input value="Click" disabled="true" type="button"&amp;gt;
&lt;/code&gt;
&lt;p&gt;
Now in Sakai if you do this for an active button (default one for a form) then under Firefox the button loses some of it's 3D look but remains blue (default default button colour). IE always renders a disabled button grey (allowed in W3C spec). To get a consistent look across the browsers and make it clearer to a Firefix user that the button is disabled you have to have the disabled attribute equal disabled:
&lt;/p&gt;
&lt;code&gt;
&amp;lt;input class="active" value="Click" disabled="disabled" type="button"&amp;gt;
&lt;/code&gt;
&lt;p&gt;
the button is made grey by the following CSS (from /reference/library/src/webapp/skin/default/tool.css)
&lt;/p&gt;
&lt;code&gt;
.act .active[disabled="disabled"] {
   color:grey
}
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115747480776193138?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115747480776193138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115747480776193138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115747480776193138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115747480776193138'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2008/01/disabled-input-buttons-in-sakai.html' title='Disabled input buttons in Sakai'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-7866605254733041459</id><published>2007-12-06T17:48:00.000Z</published><updated>2007-12-06T17:51:30.783Z</updated><title type='text'>Nicer URLs?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_FltME488_qM/R1g2Jc8o1kI/AAAAAAAAAAM/OdKfti89hv4/s1600-h/nice-urls.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_FltME488_qM/R1g2Jc8o1kI/AAAAAAAAAAM/OdKfti89hv4/s400/nice-urls.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5140918510660671042" /&gt;&lt;/a&gt;
After quite a bit of head bashing nicer URLs in Sakai are coming along, here the site has nice name (/working_lu) and the page has a nice name (siteinfo). It's still at the very early stages but its getting there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-7866605254733041459?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/7866605254733041459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=7866605254733041459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7866605254733041459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7866605254733041459'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/12/nicer-urls.html' title='Nicer URLs?'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_FltME488_qM/R1g2Jc8o1kI/AAAAAAAAAAM/OdKfti89hv4/s72-c/nice-urls.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-9009601959043346182</id><published>2007-11-28T08:51:00.000Z</published><updated>2007-11-28T09:00:24.731Z</updated><title type='text'>SVN Tip for Sakai</title><content type='html'>When your working on a checkout of Sakai and editing files across multiple projects it can be handy to see what you have changed, &lt;code&gt;svn status&lt;/code&gt; is normally the way todo this but due to the number of external definitions in Sakai it produces allot of output which can't easily be suppressed. Piping this through &lt;code&gt;egrep&lt;/code&gt; and &lt;code&gt;tr&lt;/code&gt; can clean things up.

&lt;p&gt;
&lt;code&gt;svn status | egrep -v "^(Perform|X)" | tr -s "\n"&lt;/code&gt;
&lt;/p&gt;

Gives a nice concise output as though those externals didn't exist. Aliasing this to something like &lt;code&gt;svnst&lt;/code&gt; makes it easy to get back to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-9009601959043346182?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/9009601959043346182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=9009601959043346182' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/9009601959043346182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/9009601959043346182'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/11/svn-tip-for-sakai.html' title='SVN Tip for Sakai'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-7196686449312825077</id><published>2007-11-21T09:56:00.001Z</published><updated>2009-03-11T09:23:18.805Z</updated><title type='text'>NoMachine Client in Fullscreen</title><content type='html'>I have recently discovered the machine that is &lt;a href="http://www.nomachine.com/"&gt;NoMachine&lt;/a&gt; and am using it to connect to my work computer from outside the office. So far it seems to work really well. The only thing is that I like to run it in fullscreen mode and was struggling to find out how to return to my local desktop. Eventually I found this post &lt;a href="http://ubuntuforums.org/showpost.php?p=1187554&amp;postcount=11"&gt;about NX&lt;/a&gt; which provided all the solutions.

In summary the options are:
&lt;dl&gt;
&lt;dt&gt;Clicking on the top right pixel&lt;/dt&gt;
&lt;dd&gt;Minimises the NX Client and returns you to your client desktop.&lt;/dd&gt;
&lt;dt&gt;CTRL-ALT-M&lt;/dt&gt;
&lt;dd&gt;Same as above&lt;/dd&gt;
&lt;dt&gt;CTRL-ALT-T&lt;/dt&gt;
&lt;dd&gt;Brings up a popup asking if I want to terminate the session or just disconnect from it.&lt;/dd&gt;
&lt;/dl&gt;

Now if only they had a client of Mac OSX which supported fullscreen mode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-7196686449312825077?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/7196686449312825077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=7196686449312825077' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7196686449312825077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7196686449312825077'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/11/nomachine-client-in-fullscreen.html' title='NoMachine Client in Fullscreen'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-8840599644872550879</id><published>2007-09-24T16:33:00.000Z</published><updated>2007-10-01T16:26:20.034Z</updated><title type='text'>Sakai Sessions and UsageSession</title><content type='html'>Having just been looking at these for a little while I thought I'd document them a little. The basic setup is that the Sakai Session is your session with the application and is very similar to a HttpSession. Your Session is setup for each request by the Sakai RequestFilter. The UsageSession on the other hand is your logged usage of the application amd is mainly there so that you can enumerate all the active UsageSessions. The UsageSession is actually store in the Session and is mainly used for presence.
&lt;p&gt;
However just to confuse things a little the UsageSessionService (manages UsageSessions) has some very important methods, login() and logout(). These setup and destroy your Session and UsageSession at the same time. Login tools in Sakai should call UsageSession.login() to setup the Sakai session with the authenticated user details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-8840599644872550879?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/8840599644872550879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=8840599644872550879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8840599644872550879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8840599644872550879'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/09/sakai-sessions-and-usagesession.html' title='Sakai Sessions and UsageSession'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-877363942314288168</id><published>2007-09-23T07:17:00.000Z</published><updated>2007-09-23T07:20:28.730Z</updated><title type='text'>Formatting with Styles</title><content type='html'>There is a very clear post from darcusblog about how having a &lt;a href="http://netapps.muohio.edu/blogs/darcusb/darcusb/archives/2007/09/19/styles-and-symphony"&gt;good UI can encourage people to use styles&lt;/a&gt; in their document. Unsurprisingly the company with the good UI is Apple, but it shows that a good UI can guide users into good practices.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-877363942314288168?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/877363942314288168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=877363942314288168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/877363942314288168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/877363942314288168'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/09/formatting-with-styles.html' title='Formatting with Styles'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-5838324432071375269</id><published>2007-07-23T09:41:00.000Z</published><updated>2007-07-23T10:04:12.672Z</updated><title type='text'>More Kerberos Puzzlers</title><content type='html'>Ok so when trying to kerberos enable another machine for ssh connections things were almost working (getting offered kerberos for authentication by sshd) but connections were always failing with the following error message in the logs:
&lt;pre&gt;
Jul 17 12:33:46 machine sshd[5020]: debug1: An invalid name was supplied\nHostn
ame cannot be canonicalized\n
&lt;/pre&gt;
Now after looking through pages of google it seemed to be that there was something wrong with the hostname but looking on other machines they had very similar setups and were working correctly. The reason for this message was that I think that kerberos was using the hostname for kerberos and couldn't find an entry for the hostname in DNS. The reason it couldn't find a hostname was the there wasn't a search entry in &lt;i&gt;/etc/resolv.conf&lt;/i&gt; specifying the domain to look in, adding &lt;code&gt;search oucs.ox.ac.uk&lt;/code&gt; to &lt;i&gt;/etc/resolv.conf&lt;/i&gt; fixed the problem and everything worked fine.
&lt;p&gt;
Hopefully this post might help someone else from scratching hole in their head. But it would have been much easier to debug if the invalid hostname was logged in the message.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-5838324432071375269?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/5838324432071375269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=5838324432071375269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5838324432071375269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5838324432071375269'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/07/more-kerberos-puzzlers.html' title='More Kerberos Puzzlers'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4446568983766640150</id><published>2007-07-18T10:12:00.000Z</published><updated>2007-07-18T10:21:41.423Z</updated><title type='text'>svn_load_dirs.pl and Ubuntu</title><content type='html'>I need to do some vendor drops with Subversion and the documentation seems to point to svn_load_dirs.pl as being the best place to start. So I install subversion and subversion-tools onto my Ubuntu system only to find that I don't seem to have a svn_load_dirs.pl installed. After a little bit of digging it seems that svn_load_dirs.pl was removed from the Debian package (which the Ubuntu one is based) due to &lt;a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=394395"&gt;licensing concerns&lt;/a&gt; although this isn't very clear as the changelog doesn't explain that this was one of the affected files. So it looks like I need to get myself a copy of the source distribution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4446568983766640150?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4446568983766640150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4446568983766640150' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4446568983766640150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4446568983766640150'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/07/svnloaddirspl-and-ubuntu.html' title='svn_load_dirs.pl and Ubuntu'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-1798918672938799271</id><published>2007-06-14T09:54:00.000Z</published><updated>2007-06-14T10:00:11.138Z</updated><title type='text'>Ethiopian Food in Amsterdam</title><content type='html'>Had some really nice food in Amsterdam last night, after a drink we ended up at an &lt;a href="http://maps.google.co.uk/maps/ms?ie=UTF8&amp;hl=en&amp;msa=0&amp;t=h&amp;om=1&amp;msid=110436526007040349954.00000113299027f6db8d9&amp;ll=52.370348,4.910859&amp;spn=0.000727,0.001802&amp;z=19"&gt;Ethiopian Restaurant&lt;/a&gt; suggested by Adam. I had some &lt;a href="http://en.wikipedia.org/wiki/Gored_gored"&gt;Gored Gored&lt;/a&gt; but we all ended up sharing as it came on a &lt;a href="http://www.flickr.com/photos/buckett/546959155/"&gt;big plate&lt;/a&gt;. Good company and good food.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-1798918672938799271?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/1798918672938799271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=1798918672938799271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1798918672938799271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1798918672938799271'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/ethiopian-food-in-amsterdam.html' title='Ethiopian Food in Amsterdam'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4486099888830526363</id><published>2007-06-14T09:04:00.000Z</published><updated>2007-06-14T10:02:05.963Z</updated><title type='text'>Loading Resources in Sakai Components</title><content type='html'>I meant to blog about this a while ago but it has recently come up again and so I though I should write my ideas down. Ok so the problem is that you have a Sakai component which is created by the component manager and it wants to load something from inside the component, in my case it was an iBatis configuration file specified through a spring configuration file. So in my spring config I have something like:
&lt;pre&gt;  
&amp;lt;property name="configLocation"&amp;gt;
 classpath:/sql-maps-config.xml
&amp;lt;/property&amp;gt
&lt;/pre&gt;
Now the problem is that this property is loaded through a PropertyEditor which sets the property to a &lt;a href="http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/core/io/ClassPathResource.html"&gt;ClassPathResource&lt;/a&gt;. In Spring the classloading policy is that resources should be loaded through the thread's classloader. When the component manager is starting up and so when my component is create this is caused by the fact that a web application has asked for it so the thread classloader points to the webapp and the resource in your component won't be found.
&lt;p&gt;
The solution to this is to have a way to load resources using the standard JVM &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String)"&gt;Class.getResourceAsStream()&lt;/a&gt; which will use the classloader used to load the current class. So I created an class:
&lt;/p&gt;&lt;pre&gt;
package org.sakaiproject.util;

import org.springframework.core.io.ClassPathResource;

/**
* Resource implementation for class path resources.
* Loads out of the same classpath as this class was loaded through.
*
* Supports resolution as &lt;code&gt;java.io.File&lt;/code&gt; if the class path
* resource resides in the file system, but not for resources in a JAR.
* Always supports resolution as URL.
*
* @author buckett
*/
public class LocalClassPathResource extends ClassPathResource {

 public LocalClassPathResource(String path) {
  super(path, LocalClassPathResource.class.getClassLoader());
 }
}
&lt;/pre&gt;
&lt;p&gt;
and put this in my component. I also then change the configuration in my components.xml to use the resource directly:
&lt;pre&gt;
&amp;lt;property name="configLocation"&amp;gt;
&amp;lt;bean class="org.sakaiproject.util.LocalClassPathResource"&amp;gt;
 &amp;lt;constructor-arg type="java.lang.String"&amp;gt;
  &amp;lt;value&amp;gt;/sql-maps-config.xml&amp;lt;/value&amp;gt;
 &amp;lt;/constructor-arg&amp;gt;
&amp;lt;/bean&amp;gt;
&amp;lt;/property&amp;gt
&lt;/pre&gt;
Now the configuration file gets loaded without any problems. Hopefully future Sakai developments in the component manager will mean this hack isn't needed later on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4486099888830526363?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4486099888830526363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4486099888830526363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4486099888830526363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4486099888830526363'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/loading-resources-in-sakai-components.html' title='Loading Resources in Sakai Components'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-65901011013082808</id><published>2007-06-12T12:42:00.000Z</published><updated>2007-06-12T13:19:30.136Z</updated><title type='text'>Safari 3 Beta and FCKEditor</title><content type='html'>Just saw in the news that Apple has release a &lt;a href="http://www.apple.com/safari/download/"&gt;Safari 3 Beta&lt;/a&gt; but include a Windows build, now this probably isn't going to take on IE and Firefox but does allow developers on Windows so have a better idea about how websites will render on it. Now it also allow people to see that &lt;a href="http://www.fckeditor.net/nightly/browsers_test.html"&gt;FCKEditor nightly&lt;/a&gt; is working reasonably well in Safari.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-65901011013082808?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/65901011013082808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=65901011013082808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/65901011013082808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/65901011013082808'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/safari-3-beta-and-fckeditor.html' title='Safari 3 Beta and FCKEditor'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2612719307714321368</id><published>2007-06-09T10:23:00.000Z</published><updated>2007-06-09T10:26:01.469Z</updated><title type='text'>Plane on Google Maps</title><content type='html'>Found a &lt;a href="http://maps.google.co.uk/maps?f=q&amp;hl=en&amp;q=&amp;ie=UTF8&amp;ll=51.57722,-0.696956&amp;spn=0.001834,0.004174&amp;t=h&amp;z=18&amp;om=1"&gt;plane on Google Maps&lt;/a&gt; today. You can even read the writing on it showing it's an Air Canada plane.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2612719307714321368?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2612719307714321368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2612719307714321368' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2612719307714321368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2612719307714321368'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/plane-on-google-maps.html' title='Plane on Google Maps'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-6368540722989991908</id><published>2007-06-08T13:37:00.000Z</published><updated>2007-06-08T13:43:51.221Z</updated><title type='text'>Sakai Maven Plugin Install</title><content type='html'>Always losing the command to install the Sakai Maven Plugin, Dr Chuck has some &lt;a href="http://www.dr-chuck.com/csev-blog/000146.html"&gt;instructions&lt;/a&gt; but they rely on already having configured your maven repository. The one stop command is:
&lt;p&gt;
&lt;code&gt;
maven plugin:download -DgroupId=sakaiproject -DartifactId=sakai -Dversion=2.2 -Dmaven.repo.remote=http://source.sakaiproject.org/maven
&lt;/code&gt;
&lt;p&gt;
This only works with maven 1. If nothing else maybe this will give Chucks second post a little more Google karma and push it up in search results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-6368540722989991908?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/6368540722989991908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=6368540722989991908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/6368540722989991908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/6368540722989991908'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/sakai-maven-plugin-install.html' title='Sakai Maven Plugin Install'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4985813168952337389</id><published>2007-06-07T08:24:00.000Z</published><updated>2007-06-07T08:38:30.033Z</updated><title type='text'>Custom Logging in Sakai</title><content type='html'>If you are debugging something in Sakai and want to setup a &lt;a href="http://confluence.sakaiproject.org/confluence/display/DOC/Install+Guide+-+Troubleshoot+%282.4%29#InstallGuide-Troubleshoot(2.4)-6.2.1.FindingtheTomcatlogs"&gt;custom log configuration&lt;/a&gt; you can just edit your sakai.properties. Here's an example of from a sakai.properties file:
&lt;pre&gt;
log.config.count=2
log.config.1 = DEBUG.org.sakaiproject.portal.charon.handlers.HierarchyHandler
log.config.2 = DEBUG.org.sakaiproject.portal.charon.handlers.SiteHandler
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4985813168952337389?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4985813168952337389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4985813168952337389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4985813168952337389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4985813168952337389'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/custom-logging-in-sakai.html' title='Custom Logging in Sakai'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-1449293889734543310</id><published>2007-06-06T12:03:00.000Z</published><updated>2007-06-06T12:17:59.337Z</updated><title type='text'>Don't forget Resource normally same as Entity</title><content type='html'>It seems originally &lt;code&gt;org.sakaiproject.entity.api.Entity&lt;/code&gt; interface was called Resource and although most things seem to have been updated there are still some references across the codebase to Resources. An example is the &lt;code&gt;org.sakaiproject.event.api.Event#getResource()&lt;/code&gt; method which actually returns a Entity reference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-1449293889734543310?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/1449293889734543310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=1449293889734543310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1449293889734543310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1449293889734543310'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/dont-forget-resource-normally-same-as.html' title='Don&apos;t forget Resource normally same as Entity'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2572120699632820654</id><published>2007-06-05T15:03:00.000Z</published><updated>2007-06-05T15:32:14.033Z</updated><title type='text'>Sakai Portal Handlers</title><content type='html'>Sakai has a reworked portal in 2.4 called the &lt;a href="http://confluence.sakaiproject.org/confluence/display/%7Eianeboston/Charon+Skinnable+Portal"&gt;Charon Skinnable Portal&lt;/a&gt; and this portal has the concept of handlers which can be used to handle different requests. Most of this code is in portal/portal-impl. The &lt;code&gt;PortalHandler&lt;/code&gt; interface has a useful base class called &lt;code&gt;BasePortalHandler&lt;/code&gt; and then some of the usable implementations are:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PageHandler&lt;/code&gt; - Just displays a page which will load the tool  in an iframe without anything else by default.  URL: /portal/page/placementId&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WorksiteHandler&lt;/code&gt; - Just displays a site with the list of tools but no inter site navigation, supports supplying a additional page reference. URL: /portal/worksite/siteId&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GalleryHandler&lt;/code&gt; - Display the site as well as the inter site navigation but still no logo or login box, supports supplying an additional page reference. URL: /portal/gallery/siteId&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SiteHandler&lt;/code&gt; - Display a normal Sakai screen with site and inter site navigation, including login/logout links.
&lt;/li&gt;
&lt;/ul&gt;
 All the handlers are setup in &lt;code&gt;SkinnableCharonPortal.init()&lt;/code&gt; which calls through to the portal service. The list of handlers if configurable at runtime through the portal service. Just posting this as a note for future reference really.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2572120699632820654?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2572120699632820654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2572120699632820654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2572120699632820654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2572120699632820654'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/sakai-portal-handlers.html' title='Sakai Portal Handlers'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3059843459584438271</id><published>2007-06-05T08:42:00.000Z</published><updated>2007-06-05T08:51:55.674Z</updated><title type='text'>Bash History Expansion</title><content type='html'>I've alway been quite fond of &lt;a href="http://www.gnu.org/software/bash/manual/bashref.html#SEC117"&gt;bash history expansion&lt;/a&gt; and in particular &lt;code&gt;!!&lt;/code&gt; (previous command) and &lt;code&gt;!$&lt;/code&gt; (last argument of previous command) but today I discovered a new trick, the &lt;code&gt;:h&lt;/code&gt; modifier. This takes a word and removes file file name, here I am using it in action.
&lt;pre&gt;
buckett@oucs-matthewb:~ $ sudo vi /opt/tivoli/tsm/client/ba/bin/incl.excl.SAVE 
buckett@oucs-matthewb:~ $ cd !$:h
cd /opt/tivoli/tsm/client/ba/bin
buckett@oucs-matthewb:/opt/tivoli/tsm/client/ba/bin $ mv incl.excl.SAVE incl.excl
mv: cannot move `incl.excl.SAVE' to `incl.excl': Permission denied
buckett@oucs-matthewb:/opt/tivoli/tsm/client/ba/bin $ sudo !!
sudo mv incl.excl.SAVE incl.excl
&lt;/pre&gt;
Now I just have to remember it for more than a few days for it to seep into my normal usage of the shell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3059843459584438271?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3059843459584438271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3059843459584438271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3059843459584438271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3059843459584438271'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/06/bash-history-expansion.html' title='Bash History Expansion'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4864708572718063247</id><published>2007-05-29T08:53:00.000Z</published><updated>2007-05-29T08:58:40.200Z</updated><title type='text'>Sakai Startup Logs</title><content type='html'>Often after I've started up Sakai I'll tail(1) the logs so I can see how the startup is going, however by default Sakai spits out quite a few informational messages and it is easy to miss the important stuff so now I tend to watch the logs with the following command:
&lt;pre&gt;
tail -f logs/catalina.out | grep -v INFO
&lt;/pre&gt;
which doesn't display all the INFO messages but still shows me anything serious, and all the internal tomcat messages about how the startup is progressing. I know I could change the logging (log4j) but this is a simple trick which still allows me to look back at the info messages to check things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4864708572718063247?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4864708572718063247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4864708572718063247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4864708572718063247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4864708572718063247'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/05/sakai-startup-logs.html' title='Sakai Startup Logs'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-7508280763922354859</id><published>2007-05-25T13:00:00.000Z</published><updated>2007-05-25T14:26:08.034Z</updated><title type='text'>Installing Grouper Quickstart</title><content type='html'>Here are a few of my notes on the &lt;a href="http://middleware.internet2.edu/dir/groups/grouper/"&gt;Internet2 Grouper project&lt;/a&gt;. I'm just attempting to get the quickstart up and running to get more of a feel for the application. First of all I grabbed a copy of Grouper 1.2.0RC2 quickstart and started following the instructions. After unpacking the archive and unpacking a clean copy of tomcat I copied across the &lt;code&gt;tomcat-users.xml&lt;/code&gt; as I didn't have any existing users I wanted to keep.
&lt;p&gt;
After a quick scan of the &lt;code&gt;grouper-ui/build.properties&lt;/code&gt; file I attempted to build the UI with &lt;code&gt;ant ui&lt;/code&gt; and selected option 6 (war) however this fell over with an ugly ant error. Looking at the &lt;code&gt;build.xml&lt;/code&gt; it seemed to be failing on the &amp;lt;propertyfile&amp;gt; task. A quick google and it seems this is an optional task, from previous experience I knew that the nice Ubuntu people split off the optional ant tasks into a seperate packages and sure enough that was missing on my system. An &lt;code&gt;apt-get&lt;/code&gt; later and I had the ant build successfully running.
&lt;p&gt;
I copies the newly created WAR into Tomcat and started it up. 14 seconds later I could access the Grouper UI. After a delay I realised that all I had was a redirect to populateIndex.do and a blank page. Then I remembered a mention at the start of the document saying I needed an HSQL database to be running. As it turns out this is actually reasonably easy, just ant db at the toplevel of the quickstart. Then a trip back to the webserver and yey, a working grouper installation. Now time for a little play.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-7508280763922354859?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/7508280763922354859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=7508280763922354859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7508280763922354859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/7508280763922354859'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/05/installing-grouper-quickstart.html' title='Installing Grouper Quickstart'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2798968821568671433</id><published>2007-05-22T11:17:00.000Z</published><updated>2007-05-22T11:26:26.510Z</updated><title type='text'>Upgrading Sakai to 2.4</title><content type='html'>Ok, I've just upgraded our test sakai instance to the just released 2.4.0. Here are the notes of how I did it, this isn't a recommended pattern:
&lt;ul&gt;
&lt;li&gt;Get source checkout from svn of 2.4.0&lt;/li&gt;
&lt;li&gt;Set maven.repo.remote in master/build.properties&lt;/li&gt;
&lt;li&gt;Check build works with maven bld&lt;/li&gt;
&lt;li&gt;Get patches used on 2.3.1 release&lt;/li&gt;
&lt;li&gt;Apply patches to login-tool and providers and fix rejections&lt;/li&gt;
&lt;li&gt;maven cln bld&lt;/li&gt;
&lt;li&gt;maven sakai:deploy-zip&lt;/li&gt;
&lt;li&gt;Copy sakai.tar.gz to server&lt;/li&gt;
&lt;li&gt;Stop existing tomcat and move out of the way&lt;/li&gt;
&lt;li&gt;Expand a clean tomcat 5.5.23&lt;/li&gt;
&lt;li&gt;Copy across conf/server.xml&lt;/li&gt;
&lt;li&gt;Copy across sakai folder from 2.3.1&lt;/li&gt;
&lt;li&gt;Copy across mysql connector from 2.3.1&lt;/li&gt;
&lt;li&gt;Upgrade the schema&lt;/li&gt;
&lt;li&gt;Copy across /portal redirection&lt;/li&gt;
&lt;li&gt;Start up tomcat&lt;/li&gt;
&lt;/ul&gt;
Of course it didn't go this well, and it took just over a couple of hours to get it all working. We need to patch login-tool for WebAuth authentication and the providers to configure the LDAP provider of user account information, but otherwise it is a fairly standard sakai install.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2798968821568671433?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2798968821568671433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2798968821568671433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2798968821568671433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2798968821568671433'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/05/upgrading-sakai-to-24.html' title='Upgrading Sakai to 2.4'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3123496312955981822</id><published>2007-05-21T12:51:00.000Z</published><updated>2007-05-21T13:00:25.023Z</updated><title type='text'>Sakai maven 1 &amp; 2 problems</title><content type='html'>I had a checkout of sakai trunk and had a look at using maven 2 to build and deploy it. After a little experimentation I changed back to maven 1. Then I did an svn update and rebuilt with maven 1 and after deploy I started to see errors at the tomcat startup, after allot of checking I finally realised that I had the maven 1 and maven 2 artifacts deloyed into the same tomcat instance as as they have different versions by default they both existed in parallel, which means I had both sakai-site-api-dev.jar (from maven 1) and sakai-site-api-M2.jar (from maven 2).
&lt;p&gt;
Maybe the version of maven 2 artifacts should be dev by default, rather than M2, to match maven 1?
What I'm not yet sure of is why you would ever want more than copy of a particular JAR in a classloader, so maybe the version shouldn't be used in the filename when the deployment is made. Although in production it is useful to have the versions for working out what versions of a file you have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3123496312955981822?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3123496312955981822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3123496312955981822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3123496312955981822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3123496312955981822'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/05/sakai-maven-1-2-problems.html' title='Sakai maven 1 &amp; 2 problems'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-1889681410942078502</id><published>2007-04-26T11:01:00.001Z</published><updated>2007-05-21T12:51:37.093Z</updated><title type='text'>Google Apps at Oxford</title><content type='html'>Here in OUCS we recently had a presentation by Barry Cornelius about Google Apps. Barry had setup Google Apps to use the Oxford Single Signon solution WebAuth to allow members of Oxford University to login to Google Apps on a domain, in his example he used his own domain but it could easily be something like docs.ox.ac.uk. This meant that anyone with an Oxford Account could use Google Apps without having to create another account.
&lt;p&gt;
Now when you signup for Google Apps you are asked to provide a domain onto which these apps will run and Google then allows you to provide branding of that domain. Google has the option to provide lots of applications (Word Processing, Spreadsheets, Calendaring, etc) and here I am talking about providing about everything &lt;em&gt;except&lt;/em&gt; GMail which is a much more complicated issue.
&lt;p&gt;
My personal thinking is that OUCS should provide this service to its users and view it in a similar way to how it will provide a Shibboleth service. We provide the authentication, but the actual application is run and managed by someone else and the users should be aware of that. The possible problem with running Google Apps on an Oxford domain (docs.ox.ac.uk) is that it looks like an Oxford endorsed service and that if you have issues with it you should visit the Oxford helpdesk. However if Oxford could use the domain oxford.google.co.uk (or similar) then I believe it is much clearer that the service is provided by Google and Oxford is just providing the integration with SSO.
&lt;p&gt;
For a little effort we have the ability to make users lives easier in that they only need to sign on to WebAuth and they automatically get access to Google Apps. As Google already provides this service free to individuals there is nothing to stop any member of Oxford University just visiting Google and signing up for an account.
&lt;p&gt;
This also shows members of the University how SSO makes lives easier and how OUCS is looking to embrace new tools. But I think that we need to be clear that OUCS isn't endorsing the use of Google Apps and isn't supporting it (Google is). And why stop at Google Apps, if other companies provide similar authentication integration service why not integrate with them?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-1889681410942078502?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/1889681410942078502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=1889681410942078502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1889681410942078502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1889681410942078502'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/04/google-apps-at-oxford.html' title='Google Apps at Oxford'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-1815297634951114843</id><published>2007-03-30T09:08:00.000Z</published><updated>2007-03-30T09:37:51.036Z</updated><title type='text'>Sakai LDAP Provider</title><content type='html'>&lt;p&gt;
Ok so I was attempting to connect Sakai up to our LDAP server to get user details and after a successful user login was seeing an error in the logs:
&lt;/p&gt;&lt;pre&gt;
WARN: getUser() from LDAP directory exceptionnull (2007-03-29 17:32:34,597 http-
8443-Processor25_edu.amc.sakai.user.JLDAPDirectoryProvider)
&lt;/pre&gt;
&lt;p&gt;Not the most helpful error so I edited the source so that it logged the stack trace as well:
&lt;/p&gt;
&lt;pre&gt;
java.lang.NullPointerException
       at com.novell.ldap.asn1.ASN1OctetString.&amp;lt;init&amp;gt;(Unknown Source)
       at com.novell.ldap.rfc2251.RfcLDAPString.&amp;lt;init&amp;gt;(Unknown Source)
       at com.novell.ldap.rfc2251.RfcAttributeDescription.&amp;lt;init&amp;gt;(Unknown Source
)
       at com.novell.ldap.rfc2251.RfcAttributeDescriptionList.&amp;lt;init&amp;gt;(Unknown So
urce)
       at com.novell.ldap.LDAPSearchRequest.&amp;lt;init&amp;gt;(Unknown Source)
       at com.novell.ldap.LDAPConnection.search(Unknown Source)
       at com.novell.ldap.LDAPConnection.search(Unknown Source)
       at edu.amc.sakai.user.JLDAPDirectoryProvider.getEntryFromDirectory(JLDAP
DirectoryProvider.java:360)
       at edu.amc.sakai.user.JLDAPDirectoryProvider.getUser(JLDAPDirectoryProvi
der.java:247)
&lt;/pre&gt;
&lt;p&gt;
Now we are getting a null pointer exception thrown from inside the novell LDAP library (not a good sign or very helpful). After a little bit of digging around I found the call line:
&lt;/p&gt;
&lt;pre&gt;
conn.search(getBasePath(), LDAPConnection.SCOPE_SUB, searchFilter, attribs, false, cons);
&lt;/pre&gt;
&lt;p&gt;
and it turns out (half an hour later) that one of the elements in the &lt;code&gt;attribs&lt;/code&gt; array was set to null. This was caused by having a sakai configuration where I had removed the attribute mapping for the group memberships as I wasn't using it but it turns out that the provider was still attempting to retreive this value from the configuration and then using it. It really shouldn't be this hard to fix &lt;em&gt;simple&lt;/em&gt; configuration problems.
&lt;/p&gt;
&lt;p&gt;
I believe that this LDAP provider has had some work done on it for 2.4 and I'll check to see if this bug still exists in 2.4 and if it does send in a patch.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-1815297634951114843?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/1815297634951114843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=1815297634951114843' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1815297634951114843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1815297634951114843'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/03/sakai-ldap-provider.html' title='Sakai LDAP Provider'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3658161170889075010</id><published>2007-03-29T14:27:00.000Z</published><updated>2007-03-29T14:35:48.519Z</updated><title type='text'>Are we there yet?</title><content type='html'>&lt;pre&gt;
buckett@oucs-matthewb:~/sakai/sakai-2.3.1/checkout $ maven cln bld 
 __  __
|  \/  |__ _Apache__ ___
| |\/| / _` \ V / -_) ' \  ~ intelligent projects ~
|_|  |_\__,_|\_/\___|_||_|  v. 1.0.2

[...snipped...]

BUILD SUCCESSFUL
Total time: 11 minutes 2 seconds
Finished at: Thu Mar 29 15:24:07 BST 2007
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3658161170889075010?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3658161170889075010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3658161170889075010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3658161170889075010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3658161170889075010'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/03/are-we-there-yet.html' title='Are we there yet?'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2176986270515262189</id><published>2007-03-28T12:44:00.000Z</published><updated>2007-03-28T13:16:15.206Z</updated><title type='text'>Miscellaneous failure No principal in keytab matches desired name</title><content type='html'>&lt;p&gt;
I was getting this error in the server logs when trying to ssh into a kerberos enabled box and although my ssh client was getting a principal for the machine &lt;tt&gt;host/machine.ox.ac.uk@OX.AC.UK&lt;/tt&gt; I wasn't getting logged in. Now looking on the net it seemed that it was likely that I didn't have the matching principal in the keytab file. But a &lt;tt&gt;klist -k /etc/krb5.keytab&lt;/tt&gt; showed all the correct keys. The next thing I checked was that the DNS records matched &lt;tt&gt;host machine.ox.ac.uk&lt;/tt&gt; and &lt;tt&gt;host 192.0.2.0&lt;/tt&gt;. After running round in circles I checked &lt;tt&gt;/etc/hosts&lt;/tt&gt; to find the line &lt;tt&gt;192.0.2.0 machine&lt;/tt&gt; and because my machine used the hosts file before DNS it was looking for the principal &lt;tt&gt;host/machine@OX.AC.UK&lt;/tt&gt; which of course didn't exist.
&lt;/p&gt;&lt;p&gt;
This whole saga would have been much easier to debug if the error message had just included the principal that wasn't present in the keytab file. The machine was a server Ubuntu 6.10 install. Strangely it seems that my desktop Ubuntu machine has the machine name only associated with 127.0.0.1 and not the external IP, although this machine uses DHCP to get its IP.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2176986270515262189?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2176986270515262189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2176986270515262189' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2176986270515262189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2176986270515262189'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/03/miscellaneous-failure-no-principal-in.html' title='Miscellaneous failure No principal in keytab matches desired name'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4409341450417310491</id><published>2007-03-27T11:59:00.000Z</published><updated>2007-03-27T12:06:24.259Z</updated><title type='text'>pam_env, /etc/environment and expansion</title><content type='html'>Rather than setting environment variables for a system in shell startup files (/etc/profile) you can use pam_env to set them (both ssh and login by default use pam_env). By default on Ubuntu this appears to be where the path is set, now to add something extra to the path I wanted to define a new value (JAVA_HOME) and then include $JAVA_HOME/bin in the path. To start with I edited /etc/environment but it seems that expansion doesn't occur in this file. However you can edit /etc/security/pam_env.conf to set the PATH and expansion does happen here. This is what I ended up adding to /etc/security/pam_env.conf :
&lt;code&gt;
JAVA_HOME       DEFAULT="/opt/jdk1.5.0_11"
PATH            DEFAULT="/usr/local/sbin:/usr/local/bin:/usr/sbin:\
/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games:${JAVA_HOME}/bin"
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4409341450417310491?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4409341450417310491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4409341450417310491' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4409341450417310491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4409341450417310491'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/03/pamenv-etcenvironment-and-expansion.html' title='pam_env, /etc/environment and expansion'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-8593095846485214878</id><published>2007-02-27T13:28:00.000Z</published><updated>2007-02-27T13:32:01.086Z</updated><title type='text'>Firebug and Net View</title><content type='html'>It seems that &lt;a href="http://www.getfirebug.com/"&gt;Firebug&lt;/a&gt; has a nice little &lt;a href="http://code.google.com/p/fbug/issues/detail?id=13"&gt;bug&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;.&lt;/span&gt; This caught me out when using it to monitor if some of our files were getting cached. Basically it seems that firebug doesn't notice when some files come from the cache and reports them as being downloaded again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-8593095846485214878?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/8593095846485214878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=8593095846485214878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8593095846485214878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8593095846485214878'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/02/firebug-and-net-view.html' title='Firebug and Net View'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4883700100952531463</id><published>2007-01-29T09:58:00.000Z</published><updated>2007-01-29T10:14:03.453Z</updated><title type='text'>Microsoft, Patnets and BlueJ (Java IDE)</title><content type='html'>Through &lt;a href="http://planeteclipse.org/planet/"&gt;Planet Eclipse&lt;/a&gt; I found a post detailing how Microsoft first &lt;a href="http://www.bluej.org/vs/vs-bj.html"&gt;stole&lt;/a&gt; and then &lt;a href="http://www.bluej.org/mrt/?p=21"&gt;patented&lt;/a&gt; an idea from a Educational Java IDE called &lt;a href="http://www.bluej.org/"&gt;BlueJ&lt;/a&gt; developed by &lt;a href="http://www.deakin.edu.au/"&gt;Deakin University&lt;/a&gt; and the &lt;a href="http://www.cs.kent.ac.uk/"&gt;University of Kent&lt;/a&gt;. Although this may have been done unintentionally I hope this blows up into a bit of a PR disaster for them as their behavior in this matter doesn't seem very good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4883700100952531463?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4883700100952531463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4883700100952531463' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4883700100952531463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4883700100952531463'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/01/microsoft-patnets-and-bluej-java-ide.html' title='Microsoft, Patnets and BlueJ (Java IDE)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-1506591704364835758</id><published>2007-01-12T11:59:00.000Z</published><updated>2007-01-12T12:12:09.119Z</updated><title type='text'>ProxyUserDirectoryProvider</title><content type='html'>&lt;p&gt;
As part of the work I have been doing with Sakai and Bodington I needed to allow Sakai to access the user details that are stored in Bodington. The normal way to do this would be to write a UserDirectoryProvider (UDP) that sits in the components folder. The problem is that I didn't want to put the whole of Bodington into the components classloader and tomcat was going to load Bodington anyway as a webapp. The solution was to create a proxy that could be injected with the real Bodington UDP when Bodington started up. This needed to be an API that extended the standard UDP:
&lt;/p&gt;
&lt;code&gt;
public interface ProxyUserDirectoryProvider extends UserDirectoryProvider {&lt;br/&gt;
 UserDirectoryProvider getUdp();&lt;br/&gt;
 void setUdp(UserDirectoryProvider udp);&lt;br/&gt;
}&lt;br/&gt;
&lt;/code&gt;
&lt;p&gt;
This ProxyUserDirectoryProvider could then be requested from the component manager at Bodington startup and setUdp() called with the full implementation of the Bodington UDP. The proxy I created is currently sitting in &lt;a href="https://svn.oucs.ox.ac.uk/projects/vle/sakai/user-proxy/trunk/"&gt;https://svn.oucs.ox.ac.uk/projects/vle/sakai/user-proxy/trunk/&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-1506591704364835758?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/1506591704364835758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=1506591704364835758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1506591704364835758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1506591704364835758'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2007/01/proxyuserdirectoryprovider.html' title='ProxyUserDirectoryProvider'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-6399454118924675534</id><published>2006-12-13T14:40:00.000Z</published><updated>2007-04-02T09:17:34.172Z</updated><title type='text'>element.getAttribute("class")</title><content type='html'>Why are even the simple things sometimes hard? Attempting to get a element attribute. Here is a table of what the various browsers return when trying to get the class attribute having already found an element:
&lt;pre&gt;
var element = document.getElementById("theSpan");
&lt;/pre&gt;
in a document containing the HTML:
&lt;pre&gt;
&amp;lt;span id="theSpan" class="something"&amp;gt;
&lt;/pre&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;th&gt;element. getAttribute( "class" );&lt;/th&gt;
&lt;th&gt;element. getAttribute( "CLASS" );&lt;/th&gt;
&lt;th&gt;element. getAttribute( "className" );&lt;/th&gt;
&lt;th&gt;element. attributes[ "class" ];&lt;/th&gt;
&lt;th&gt;element. className;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox 2.0&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;[object Attr]&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opera 9.0&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;[object Attr]&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari 1.3.2&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;undefined&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IE 5.5 (Mac)&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;IE 7.0&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;td&gt;[object]&lt;/td&gt;
&lt;td&gt;something&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;strong&gt;Updated:&lt;/strong&gt; Thanks to anonymous for pointing out that you can just use &lt;code&gt;element.className&lt;/code&gt; to get the class name used and it seems to work correctly across all browsers I tested.
&lt;/p&gt;
&lt;p&gt;
&lt;strike&gt;
It seems that there is no simple way to get the class attribute across browsers. The solution seems to be to get the class attribute and if it undefined try the className attribute. Most other attributes should work fine, it is just that IE doesn't like the class attribute that throws the spanner in the works.&lt;/strike&gt; Here is the &lt;a href="http://users.ox.ac.uk/%7Ebuckett/ways.html"&gt;quick testing page&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-6399454118924675534?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/6399454118924675534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=6399454118924675534' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/6399454118924675534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/6399454118924675534'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/12/elementgetattributeclass.html' title='element.getAttribute(&quot;class&quot;)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4658625164746281325</id><published>2006-12-12T14:18:00.000Z</published><updated>2006-12-12T16:03:24.454Z</updated><title type='text'>Label Based Feeds</title><content type='html'>When I was at the Sakai conference I was asked if I wanted my blog added to &lt;a href="http://planetsakai.org/"&gt;Sakai Planet&lt;/a&gt;, the thing is that I blog about more than just Sakai and so only the posts for Sakai should end up in the planet. After a little googling I discovered you can have &lt;a href="http://phydeaux3.blogspot.com/2006/09/feeds-for-labels-in-beta-blogger.html"&gt;feeds for labels&lt;/a&gt; and it seems that my &lt;a href="http://thicksliced.blogspot.com/feeds/posts/default/-/sakai"&gt;sakai feed&lt;/a&gt; works. I wonder why Google don't make this the default RSS feed when viewing all the posts for a tag?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4658625164746281325?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4658625164746281325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4658625164746281325' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4658625164746281325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4658625164746281325'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/12/label-based-feeds.html' title='Label Based Feeds'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-54786727557304605</id><published>2006-11-28T14:10:00.000Z</published><updated>2006-11-28T14:27:06.801Z</updated><title type='text'>Marketing through last.fm</title><content type='html'>I have had an &lt;a href="http://www.last.fm/user/buckett/"&gt;account&lt;/a&gt; on last.fm for a while now. I send most of music listening to it. A few days ago I got a friend invite from &lt;a href="http://www.last.fm/user/TheHijacker/"&gt;TheHijacker&lt;/a&gt;. Looking at the profile it seems this is the profile for a previous member of &lt;a href="http://www.last.fm/music/Dodgy"&gt;Dodgy&lt;/a&gt; called &lt;a href="http://www.last.fm/music/Nigel+Clark"&gt;Nigel Clark&lt;/a&gt; who decided to send me a friend invite because I was one of the top listeners to Dodgy in a last week (25 listens). I also a day later got a private message from him saying I should visit his website. I believe he it trying to promote his new album &lt;a href="http://www.amazon.co.uk/o/ASIN/B000JU7IQK/"&gt;21st Century Man&lt;/a&gt;.

To be honest I don't mind this sort of promotion much, as it is obvious that I will quite happily listen to Dodgy and so will probably like his new album. This sort of promotion also isn't at the moment automated and so he obviously feels it is worth his time sending me the message. However I signed up with last.fm because it allows me to find other music rather than have it pushed on me. Although I'm guessing that Nigel Clark hasn't yet reached a big enough critical mass opn last.fm to be recommended to me as other people aren't yet listening to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-54786727557304605?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/54786727557304605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=54786727557304605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/54786727557304605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/54786727557304605'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/11/marketing-through-lastfm.html' title='Marketing through last.fm'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3158325560405391118</id><published>2006-11-03T11:01:00.000Z</published><updated>2006-12-12T14:05:29.055Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sakai'/><title type='text'>Sakai Site.equals()</title><content type='html'>Took a little while to figure this one out but in Sakai the &lt;code&gt;org.sakaiproject.site.api.Site equals()&lt;/code&gt; method will return true when passed a string if it matches the ID of the site. The reason they do this is so that they can save a list of site IDs and then have a collection of sites and call 
&lt;code&gt;siteList.removeAll(stringList);&lt;/code&gt;. This can be seen is action in the CharonPortal where is is used to hide sites that the user isn't interested in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3158325560405391118?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3158325560405391118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3158325560405391118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3158325560405391118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3158325560405391118'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/11/sakai-siteequals.html' title='Sakai Site.equals()'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-8684097103366500233</id><published>2006-11-01T08:00:00.000Z</published><updated>2006-11-01T08:06:04.643Z</updated><title type='text'>Starting Rhythmbox in the Notification Area</title><content type='html'>I normally have &lt;a href="http://www.gnome.org/projects/rhythmbox/"&gt;Rhythmbox&lt;/a&gt; running on my desktop to provide me with music. However normally when you start up Rhythmbox it displays its window, now as I added Rhythmbox to the list of programs to automatically startup when I login I wanted it in the notification area (tray). The trick for doing this is to start Rhythmbox with the command:
&lt;code&gt;
  rhythmbox-client --hide
&lt;/code&gt;
Now if only &lt;a href="http://gaim.sourceforge.net/"&gt;gaim&lt;/a&gt; would have some way todo the same thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-8684097103366500233?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/8684097103366500233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=8684097103366500233' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8684097103366500233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/8684097103366500233'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/11/starting-rhythmbox-in-notification-area.html' title='Starting Rhythmbox in the Notification Area'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2186295187832569875</id><published>2006-10-27T09:07:00.000Z</published><updated>2006-10-27T09:24:23.720Z</updated><title type='text'>Terta &amp; Bodington "Review"</title><content type='html'>&lt;a href="http://mfeldstein.com/"&gt;Michael Feldstein&lt;/a&gt; has written a couple of very &lt;a href="http://mfeldstein.com/index.php/weblog/permalink/bodington_review_part_i/"&gt;good&lt;/a&gt; &lt;a href="http://mfeldstein.com/index.php/weblog/permalink/bodington_review_part_ii/"&gt;posts&lt;/a&gt; about the Bodington VLE following the &lt;a href="http://bodington.org/tetra.php"&gt;Tetra annoucement&lt;/a&gt;. His posts aren't a "review" of Bodington but more of an exploration of how Bodington does access control which is often over simplified in other tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2186295187832569875?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2186295187832569875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2186295187832569875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2186295187832569875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2186295187832569875'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/10/terta-bodington-review.html' title='Terta &amp; Bodington &quot;Review&quot;'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-3230286866026371887</id><published>2006-10-27T08:34:00.000Z</published><updated>2006-10-27T08:34:31.605Z</updated><title type='text'></title><content type='html'>Here at Oxford we use WebAuth for web based Single Sign On (SSO) and
when looking at tools we like to see how easily they can be WebAuth
enabled. Thankfully Sakai makes it all pretty easy. Sakai has the
ability to support two authentication methods at the same time so we
can have a login route for both Oxford users (WebAuth) and for internal
Sakai users.&lt;br&gt;
&lt;br&gt;
Previously we have used the Apache WebAuth module but this time I
decided to attempt to use the Java WebAuth Filter developed as part of
the &lt;a href="http://spie.oucs.ox.ac.uk/"&gt;SIPE&lt;/a&gt; project here at Oxford. One note is that the Standford WebAuth &lt;a href="http://webauth.stanford.edu/download.html#java"&gt;download&lt;/a&gt;
pages have a newer version of the Java WebAuth filter than the SIPE
pages. The Java WebAuth implementation only works with Java 1.5. &lt;br&gt;
&lt;br&gt;
The first thing is to configure Kerberos on the machine so that it
points to the correct servers, on my Linux box at Oxford this means
having a configuration file called /etc/krb5.conf containing:&lt;br&gt;

&lt;br&gt;

&lt;code&gt;[libdefaults]&lt;br&gt;

default_realm = OX.AC.UK&lt;br&gt;

&lt;br&gt;

[realms]&lt;br&gt;

OX.AC.UK = {&lt;br&gt;

kdc = kdc0.ox.ac.uk&lt;br&gt;

kdc = kdc2.ox.ac.uk&lt;br&gt;

kdc = kdc1.ox.ac.uk&lt;br&gt;

admin_server = kdc-admin.ox.ac.uk&lt;br&gt;

}&lt;br&gt;

&lt;br&gt;

[domain_realm]&lt;br&gt;

.ox.ac.uk = OX.AC.UK&lt;br&gt;

ox.ac.uk = OX.AC.UK&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

I also needed the kerberos tools too, on Ubuntu these come as part of
the krb5-user package (&lt;code&gt;sudo apt-get install krb5-user&lt;/code&gt;). Once my machine
was running with Kerboros I needed to visit the systems development
team and get a kerberos principal, this involved saying hello to the
nice people upstairs and then typing a password for my new principal
(buckett/itss). This principal then had rights over my webauth
principal (webauth/oucs-matthewb.oucs.ox.ac.uk) so that I could key a
keytab for my webauth principal. I get a keytab with the commands:&lt;br&gt;

&lt;br&gt;

&lt;code&gt;buckett@oucs-matthewb:~ $ kadmin -p buckett/itss&lt;br&gt;

Authenticating as principal buckett/itss with password.&lt;br&gt;

Password for buckett/itss@OX.AC.UK:&lt;br&gt;

kadmin: ktadd -k /home/buckett/.webauth.keytab
webauth/oucs-matthewb.oucs.ox.ac.uk&lt;br&gt;

Entry for principal webauth/oucs-matthewb.oucs.ox.ac.uk with kvno 4,
encryption type Triple DES cbc mode with HMAC/sha1 added to keytab
WRFILE:/home/buckett/.webauth.keytab.&lt;br&gt;

Entry for principal webauth/oucs-matthewb.oucs.ox.ac.uk with kvno 4,
encryption type DES cbc mode with CRC-32 added to keytab
WRFILE:/home/buckett/.webauth.keytab.&lt;br&gt;

&lt;/code&gt;&lt;br&gt;

This gives me a keytab file that allows the WebAuth filter to
authenticate with the Kerberos server without having to ask me for a
password every time I start it up. I also need to create a keyring file.&lt;br&gt;

&lt;br&gt;

&lt;code&gt;touch /home/buckett/.webauth.keyring&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

and set the permissions on both of the files to be as restrictive as
possible (&lt;code&gt;chmod 400 ~/.webauth.*&lt;/code&gt;).&lt;br&gt;

&lt;br&gt;

The the sakai login tool needs to be changed to include the WebAuth
filter.&lt;br&gt;

This means dropping all the JARs from the WebAuth distribution (&lt;code&gt;bcprov-jdk15-132.jar,
commons-httpclient-3.0.jar, commons-logging-api-1.0.4.jar,
commons-codec-1.3.jar, commons-logging-1.0.4.jar, webauth-java-1.2.jar&lt;/code&gt;)
into the WEB-INF/lib folder.&lt;br&gt;

The web.xml then needs some extra sections added (in bold).&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&amp;nbsp; &amp;lt;description&amp;gt;Sakai 2 sample tools:
login&amp;lt;/description&amp;gt;&lt;br&gt;

&lt;br&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp; &amp;lt;!-- Webauth Filter Start --&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp; &amp;lt;filter&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;filter-name&amp;gt;Webauth
Filter&amp;lt;/filter-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;
&amp;lt;filter-class&amp;gt;uk.ac.ox.webauth.Filter&amp;lt;/filter-class&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthDebug&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthServicePrincipal&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;webauth/oucs-matthewb.oucs.ox.ac.uk&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthKeytab&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;/home/buckett/.webauth.keytab&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthWebKdcPrincipal&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;service/webkdc@OX.AC.UK&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthWebKdcURL&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;https://webauth.ox.ac.uk:8443/webkdc-service/&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthLoginURL&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;https://webauth.ox.ac.uk/login&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthKeyring&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;/home/buckett/.webauth.keyring&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;AutoAddKeys&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;AutoRemoveKeys&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;WebAuthExtraRedirect&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;lt;/filter&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;lt;!-- Webauth filter end --&amp;gt;&lt;/span&gt;&lt;br&gt;

&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;filter&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;filter-name&amp;gt;sakai.request&amp;lt;/filter-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;filter-class&amp;gt;org.sakaiproject.util.RequestFilter&amp;lt;/filter-class&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;/filter&amp;gt;&lt;br&gt;

&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;filter&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;filter-name&amp;gt;sakai.request.container&amp;lt;/filter-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;filter-class&amp;gt;org.sakaiproject.util.RequestFilter&amp;lt;/filter-class&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;init-param&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;tool.placement&amp;lt;/param-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/init-param&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;init-param&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;remote.user&amp;lt;/param-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/init-param&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;/filter&amp;gt;&lt;br&gt;

&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;filter-mapping&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;filter-name&amp;gt;sakai.request&amp;lt;/filter-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;servlet-name&amp;gt;sakai.login&amp;lt;/servlet-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;/filter-mapping&amp;gt;&lt;br&gt;

&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;filter-mapping&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;filter-name&amp;gt;sakai.request.container&amp;lt;/filter-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;servlet-name&amp;gt;sakai.login.container&amp;lt;/servlet-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;/filter-mapping&amp;gt;&lt;br&gt;

&amp;nbsp;&lt;br&gt;

&lt;br&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;!-- Webauth Filter Mapping Start --&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;filter-mapping&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;filter-name&amp;gt;Webauth Filter&amp;lt;/filter-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;sakai.login.container&amp;lt;/servlet-name&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/filter-mapping&amp;gt;&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;
&lt;span style="font-weight: bold;"&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;!-- Webauth Filter Mapping End --&amp;gt;&lt;/span&gt;&lt;br&gt;

&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;servlet&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;servlet-name&amp;gt;sakai.login&amp;lt;/servlet-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;servlet-class&amp;gt;org.sakaiproject.login.tool.LoginTool&amp;lt;/servlet-class&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;init-param&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-name&amp;gt;container&amp;lt;/param-name&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;param-value&amp;gt;/sakai-login-tool/container&amp;lt;/param-value&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/init-param&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br&gt;

&amp;nbsp;&amp;nbsp; &amp;lt;/servlet&amp;gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

You will probably need to change the WebAuth filter configuration to
point to the correct keyring/keytab files for you local installation.&lt;br&gt;

&lt;br&gt;

The just edit your sakai.properties, making sure these are set.&lt;br&gt;

&lt;br&gt;

&lt;code&gt;# LOGIN/LOGOUT&lt;br&gt;

&lt;br&gt;

# to include the user id and password for login on the gateway site&lt;br&gt;

top.login=false&lt;br&gt;

&lt;br&gt;

# to let the container handle login or not (set to true for
single-signon type setups, false for just internal login)&lt;br&gt;

container.login=true&lt;br&gt;

&lt;br&gt;

xlogin.enabled=true&lt;br&gt;

xlogin.text=Guests&lt;br&gt;

&lt;br&gt;

&lt;/code&gt;Now if you startup Sakai it should provide you with two login
buttons in the top right of the portal. One that uses WebAuth and one
that uses the internal Sakai authentication.
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-3230286866026371887?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/3230286866026371887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=3230286866026371887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3230286866026371887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/3230286866026371887'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/10/here-at-oxford-we-use-webauth-for-web.html' title=''/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-5974964919161666793</id><published>2006-10-25T14:54:00.000Z</published><updated>2006-10-25T17:00:00.174Z</updated><title type='text'>Sakai and Log4J</title><content type='html'>In my digging around with Sakai I came across the fact that the Sakai logging JARs are deployed to tomcat/common, the extra JARs are deployed there are sakai-util-log-dev.jar and log4j-1.2.8.jar. Placing these files in the common classloader means that they are available to both the deployed applications as well as the servlet container (Tomcat) itself.

Now often log4j along with commons-logging JARs are placed into the common classloader so that Tomcat (5.5) will use log4j for its own internal logging. If other log4j JARs don't exist in any of the other classloaders all logging will go through the same log4j class and configuration. Applications are still free to provide their own log4j implmenetation along with configuration which should be insulated from the container log4j. This is because the common classloader is checked last (after the webapp and shared ones). 

Sakai would only need to deploy its logging code to common if it wanted to control the logging of the container as well as it's own logging. Some Sakai log messages may end up in the container logs if any of the Sakai tools log against the servlet context (getServletContext().log(String)). I don't think there is any harm to Sakai by placing the JARs in shared as all that happens is you can't control the container logging. 

To get Sakai logging working correctly there would also need to have commons-logging in the common classloader, so I'm not convinced that this setup works to control the container logging. As a side note Tomcat ships with a commons-logging-api but this doesn't provide the full logging framework, just enough to get going. 

Helpful web documents include:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://minaret.biz/tips/tomcatLogging.html"&gt;Logging for Apache Tomcat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html"&gt;Tomcat 5.5 Classloading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://article.gmane.org/gmane.comp.cms.sakai.devel/3567/"&gt;New Sakai Logging&lt;/a&gt;&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/10026400-5974964919161666793?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/5974964919161666793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=5974964919161666793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5974964919161666793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5974964919161666793'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/10/sakai-and-log4j.html' title='Sakai and Log4J'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2127321341626074654</id><published>2006-10-20T13:12:00.000Z</published><updated>2006-12-12T14:18:19.840Z</updated><title type='text'>Sakai Classloaders</title><content type='html'>I am beginning todo a little bit of work with Sakai and was trying to deal with uploaded files from a web form when inside a tool. Now Sakai uses commons-filupload to handle uploaded files and parses them automatically and adds the results back to the request as attributes. I was then trying to access this attribute in my tool with a line:
&lt;code&gt;
FileItem fileItem = (FileItem)request.getAttribute("file");
&lt;/code&gt;
This supprisingly was giving me a ClassCastException complaining that it was unable to cast a DefaultFileItem to a FileItem despite the fact that DefaultFileItem implements the FileItem interface.

After a little head scratching Alexis suggested classloader issues we found the problem. Sakai has the parsing of the uploaded files in one classloader(the portal, getting commons-fileupload from shared) which then hands control off to the tool in another classloader (the tool, done by dispatching the request across servlet contexts). The problem was that both classloaders had a copy of the commons-fileupload jar and so when the FileItem class what loaded it wasn't in the same classloader as the DefaultFileItem and so couldn't be cast. Removing the copy of commons-fileupload from the tool fixed the problem.

This issue would have been a little easier to debug if when the ClassCastException occured they provided the ID of the classloader that the two classes had come from in the exception message.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2127321341626074654?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2127321341626074654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2127321341626074654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2127321341626074654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2127321341626074654'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/10/sakai-classloaders.html' title='Sakai Classloaders'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-1112455376515809078</id><published>2006-10-20T13:08:00.000Z</published><updated>2006-10-20T13:11:58.576Z</updated><title type='text'>Globalsign and Java (again)</title><content type='html'>It seems that I keep having to contact servers with Globalsign certificates and have Java throw a wobbily (java.security.cert.CertPathValidatorException). There are a whole load of globalsign certificates under &lt;a href="http://secure.globalsign.net/cacert/"&gt;http://secure.globalsign.net/cacert/&lt;/a&gt; and this time I needed the Server.cacert one. Now my JDK has two extra Globalsign root certificates installed...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-1112455376515809078?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/1112455376515809078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=1112455376515809078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1112455376515809078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/1112455376515809078'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/10/globalsign-and-java-again.html' title='Globalsign and Java (again)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-277874672339416747</id><published>2006-10-05T21:45:00.000Z</published><updated>2006-10-05T21:51:45.191Z</updated><title type='text'>Plusnet LLU Disconnection</title><content type='html'>Well it seems that Plusnet have finally sorted out the disconnects on the LLU platform as I have been connected for almost 16 hours without a disconnect. The whole issue has been badly dealt with but hey. In side news my exchange has been ADSL2+ enabled as my router now syncs at:

Bandwidth (Up/Down) [kbps/kbps]: 619 / 17,509

In speedtests I don't get anywhere near 17mbs but this is probably due to still having 802.11b (11mb) wireless clients. I should really attach a PC directly to the router and see how it does.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-277874672339416747?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/277874672339416747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=277874672339416747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/277874672339416747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/277874672339416747'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/10/plusnet-llu-disconnection.html' title='Plusnet LLU Disconnection'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-4374023795777298944</id><published>2006-09-02T20:53:00.000Z</published><updated>2006-09-02T20:55:46.543Z</updated><title type='text'>Plusnet Disconnects Continue</title><content type='html'>Well I am still getting disconnected every so often from Plusnet, this has now been going on for more than a week and becomming beyond a joke. For example today I have already been disconnected 18 times. Maybe its time to look for a new ISP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-4374023795777298944?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/4374023795777298944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=4374023795777298944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4374023795777298944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/4374023795777298944'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/09/plusnet-disconnects-continue.html' title='Plusnet Disconnects Continue'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-5562361258357618084</id><published>2006-09-01T15:16:00.000Z</published><updated>2006-09-01T15:22:37.694Z</updated><title type='text'>Plusnet LLU (Tiscalli)</title><content type='html'>I currently have my ADSL providied by &lt;a href="http://plus.net"&gt;plusnet &lt;/a&gt;and they currently have a problem with thier LLU provider (Tiscalli) in that &lt;a href="http://usertools.plus.net/status/archive/1157114491.htm"&gt;authentication is failing&lt;/a&gt;, one useful bit of information in this posting is the test username for LLU lines (testing@dslconnect.co.uk) as the standard BT username (bt_test@startup_domain) doesn't work. In other plusnet news my LLU unbundled line is currently getting random disconnection every few hours which is very annoying when having Skype calls. Generally I am very unimpressed with the LLU line, but am not sure I want the hassle of trying to switch back to a BT one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-5562361258357618084?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/5562361258357618084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=5562361258357618084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5562361258357618084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/5562361258357618084'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/09/plusnet-llu-tiscalli.html' title='Plusnet LLU (Tiscalli)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-2828736866151178908</id><published>2006-08-31T07:48:00.000Z</published><updated>2006-08-31T07:52:02.124Z</updated><title type='text'>Blogger Beta</title><content type='html'>When I logged into Blogger this morning they offered me the option of migrating to the new Blogger Beta and so I accepted. So far everything seems ok although my old template (Rounders 4) was very slighly broken (image didn't fill the header) so I have switched to a new minimalist theme. Everything else should be pretty much the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-2828736866151178908?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/2828736866151178908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=2828736866151178908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2828736866151178908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/2828736866151178908'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/08/blogger-beta.html' title='Blogger Beta'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115625628063431574</id><published>2006-08-22T14:08:00.000Z</published><updated>2006-08-22T14:18:00.636Z</updated><title type='text'>jmap and heap dumps on 1.4.2</title><content type='html'>At work we have what might be a memory leak on our production server (it is running the Sun JDK 1.4.2 Update 12 on a Linux server), now it seemed that we might be able to use &lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html"&gt;jmap&lt;/a&gt; which has been backported to 1.4.2 to get a heap dump. When I tried this on my desktop I kept getting the error:
&lt;code&gt;
buckett@oucs-matthewb:~ $ jmap
Exception in thread "main" java.lang.NoClassDefFoundError: sun/jvm/hotspot/tools/JMap
&lt;/code&gt;
Now initially I though that I had a problem with JAVA_HOMEs and PATHs. But it turns out that Sun only backported jmap for Solaris (Windows is no luckier), but continue to ship everyone the binary just tempt them.

The other option is &lt;code&gt;-Xrunhprof&lt;/code&gt; but as we didn't start the JVM orginally with this option there doesn't seem to be a way to get a heap dump without restarting the service. &lt;code&gt;gcore&lt;/code&gt; could give us a 1.5Gb core file for the process but there doesn't seem to be a nice way to process this under 1.4. Maybe it is time to switch to 1.5?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115625628063431574?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115625628063431574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115625628063431574' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115625628063431574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115625628063431574'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/08/jmap-and-heap-dumps-on-142.html' title='jmap and heap dumps on 1.4.2'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115623803439556703</id><published>2006-08-22T08:58:00.000Z</published><updated>2006-08-22T09:36:23.973Z</updated><title type='text'>xserver-xorg-core upgrade broken</title><content type='html'>This morning I installed a new version of xserver-xorg-core on my Ubuntu desktop and so did my colleage Alexis, he then restarted his computer only to find that X11 (the Windowing System) would not start and was giving an error of:
&lt;code&gt;
(EE) No devices detected.

Fatal server error:
no screens found
&lt;/code&gt;

There is a bug report in the Ubuntu bug database about this: &lt;a href="https://launchpad.net/distros/ubuntu/+source/xorg-server/+bug/57153"&gt;https://launchpad.net/distros/ubuntu/+source/xorg-server/+bug/57153&lt;/a&gt;

The easiest way to fix this is to download the previous version of the package and install it. The packages are in &lt;a href="http://gb.archive.ubuntu.com/ubuntu/pool/main/x/xorg-server/"&gt;http://gb.archive.ubuntu.com/ubuntu/pool/main/x/xorg-server/&lt;/a&gt; and I have a tinyurl to the i386 binary &lt;a href="http://tinyurl.com/hshot"&gt;http://tinyurl.com/hshot&lt;/a&gt;, version 1.0.2-0ubuntu10.1 as 1.0.2-0ubuntu10.3 is broken. Here is how to downgrade, the stuff I type is in bold:

&lt;code&gt;
Ubuntu 6.06.1 LTS oucs-matthewb tty1

oucs-matthewb login: &lt;span style="font-weight:bold;"&gt;buckett&lt;/span&gt;
Password:
Last login: Tue Aug 22 10:00:09 2006 on pts/0
Linux oucs-matthewb 2.6.15-26-686 #1 SMP PREEMPT Thu Aug 3 03:13:28 UTC 2006 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
No mail.
1 failure since last login.
Last was Tue 22 Aug 2006 10:01:12 BST on pts/0.
buckett@oucs-matthewb:~ $ &lt;span style="font-weight:bold;"&gt;cd /tmp&lt;/span&gt;
buckett@oucs-matthewb:/tmp $ &lt;span style="font-weight:bold;"&gt;wget http://tinyurl.com/hshot&lt;/span&gt;
--10:01:34--  http://tinyurl.com/hshot
          =&gt; `hshot'
Resolving tinyurl.com... 85.255.210.131, 195.66.135.131
Connecting to tinyurl.com|85.255.210.131|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://gb.archive.ubuntu.com/ubuntu/pool/main/x/xorg-server/xserver-xorg-core_1.0.2-0ubuntu10.1_i386.deb [following]
--10:01:34--  http://gb.archive.ubuntu.com/ubuntu/pool/main/x/xorg-server/xserver-xorg-core_1.0.2-0ubuntu10.1_i386.deb
          =&gt; `xserver-xorg-core_1.0.2-0ubuntu10.1_i386.deb'
Resolving gb.archive.ubuntu.com... 82.211.81.182
Connecting to gb.archive.ubuntu.com|82.211.81.182|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3,529,260 (3.4M) [application/x-debian-package]

100%[====================================&gt;] 3,529,260      9.78M/s

10:01:34 (9.78 MB/s) - `xserver-xorg-core_1.0.2-0ubuntu10.1_i386.deb' saved [3529260/3529260]

buckett@oucs-matthewb:/tmp $ &lt;span style="font-weight:bold;"&gt;sudo dpkg -i xserver-xorg-core_1.0.2-0ubuntu10.1_i386.deb&lt;/span&gt;
dpkg - warning: downgrading xserver-xorg-core from 1.0.2-0ubuntu10.3 to 1.0.2-0ubuntu10.1.
(Reading database ... 107659 files and directories currently installed.)
Preparing to replace xserver-xorg-core 1:1.0.2-0ubuntu10.3 (using xserver-xorg-core_1.0.2-0ubuntu10.1_i386.deb) ...
Unpacking replacement xserver-xorg-core ...
Setting up xserver-xorg-core (1.0.2-0ubuntu10.1) ...
&lt;/code&gt;

Maybe this might help someone, you will continue to be prompted to upgrade to the broken version but hopefuly Ubuntu will soon produce a fixed version and you should be able to skip the broken version. The way to check what version you are uprgading to is to use the Update Manager (in Administration menu).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115623803439556703?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115623803439556703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115623803439556703' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115623803439556703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115623803439556703'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/08/xserver-xorg-core-upgrade-broken.html' title='xserver-xorg-core upgrade broken'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115497799901453680</id><published>2006-08-07T19:06:00.000Z</published><updated>2006-08-07T19:13:19.026Z</updated><title type='text'>Speedtouch and NAT Loopback</title><content type='html'>My Speedtouch 780WL has an option called NAT Loopback that allows you to access the external IP address from inside your home network. This is useful because if you run a server inside your network you can use the same IP address (and so hostname) to address the server both at home and when you are outside. To enabled NAT Loopback login to the command line (through telnet) and enter:
&lt;code&gt;
ip config natloopback=enabled
saveall
&lt;/code&gt;
Then it should all work (maybe after a reboot). The only gotcha is that it doesn't seem to loopback ICMP packets so you won't be able to ping the external IP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115497799901453680?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115497799901453680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115497799901453680' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115497799901453680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115497799901453680'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/08/speedtouch-and-nat-loopback.html' title='Speedtouch and NAT Loopback'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115470265478772092</id><published>2006-08-04T14:34:00.000Z</published><updated>2006-08-04T14:44:14.796Z</updated><title type='text'>Permissions in a Tree</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7870/756/1600/mycourse.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/7870/756/400/mycourse.png" alt="" border="0" /&gt;&lt;/a&gt;
One of our users of WebLearn here at Oxford pointed out one of the current problems we have with the permission based model Bodington uses. If for example you have a course that contains a couple of pigeon holes (drop boxes). To allow students to use the pigeon holes you need to grant them upload rights. Now rather than granting the students upload rights to each pigeon hole it would be useful if you could just grant the permission once.
The obvious solution is to have the pigeon holes inherit permissions from the containing course and then grant the permissions on the course. This way you only have to manage the permissions in one place which reduces the administration and chances of mistakes being make.
The problem is that upload permissions in the course allow students to upload content to the course container which you probably don't want. This is what happens when you reuse permission in different tools for slightly different things.
The ways around this are either to have a special permission for pigeon hole submission which doesn't mean anything in the course container or the have the idea of roles and a student role means diffrent things in different locations. As for which solution we will move towards I'm not sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115470265478772092?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115470265478772092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115470265478772092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115470265478772092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115470265478772092'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/08/permissions-in-tree.html' title='Permissions in a Tree'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115442865366128752</id><published>2006-08-01T10:34:00.000Z</published><updated>2006-08-01T10:37:33.663Z</updated><title type='text'>Gem of CSS</title><content type='html'>I found this little gem of a CSS definition the other day:

&lt;span style="font-family: courier new;"&gt;.red{
    color:red;
}&lt;/span&gt;

which just made me shudder. At least the formatting is good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115442865366128752?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115442865366128752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115442865366128752' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115442865366128752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115442865366128752'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/08/gem-of-css.html' title='Gem of CSS'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115442757518418525</id><published>2006-08-01T10:19:00.000Z</published><updated>2006-08-01T10:21:34.510Z</updated><title type='text'>Reloading log4j.properties</title><content type='html'>&lt;a href="http://www.bright-green.com/blog/2003_10_28/how_to_re_read_log4jproperties.html"&gt;Bright-Green.com: How To Re-read log4j.properties&lt;/a&gt; is a nice short post on how to re-read a log4j properties file. On our java project we were calling  &lt;code&gt;PropertyConfigurator.configure(filename);&lt;/code&gt; but never calling &lt;code&gt;LogManager.resetConfiguration();&lt;/code&gt; which meant if you removed a logging property from the configuration and reloaded it it carried on logging. It is a shame that the &lt;a href="http://logging.apache.org/log4j/docs/api/"&gt;log4j APIs&lt;/a&gt; are so badly documented. &lt;a href="http://logging.apache.org/log4j/docs/api/org/apache/log4j/LogManager.html"&gt;LogManager&lt;/a&gt; being an example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115442757518418525?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115442757518418525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115442757518418525' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115442757518418525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115442757518418525'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/08/reloading-log4jproperties.html' title='Reloading log4j.properties'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115438397688473849</id><published>2006-07-31T22:05:00.000Z</published><updated>2006-07-31T22:13:27.960Z</updated><title type='text'>Busy Weekend</title><content type='html'>Had a busy weekend, on Saturday we went to &lt;a href="http://gemmaandjames.co.uk/"&gt;Gemma and James's Wedding&lt;/a&gt; which was magical and then visited old neighbours Beth, Daniel and Benji on the way home. Along the way we took a &lt;a href="http://flickr.com/photos/buckett/archives/date-posted/2006/07/31/detail/"&gt;few photos&lt;/a&gt;. I need another weekend now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115438397688473849?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115438397688473849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115438397688473849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115438397688473849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115438397688473849'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/07/busy-weekend.html' title='Busy Weekend'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115438339991074438</id><published>2006-07-31T21:52:00.000Z</published><updated>2006-07-31T22:03:19.920Z</updated><title type='text'>Enabling Ping on Speedtouch WL780</title><content type='html'>&lt;span class="on" 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;By default you can't ping the speedtouch WL780 from the internet, I'm not paranoid about security so I wanted to enable it. Todo this telnet to the router and login. The execute the command:

&lt;span style="font-family: courier new;"&gt;service system ifadd name=PING_RESPONDER group=wan &lt;/span&gt;

This should enabled ICMP from the internet which then means you can use a service such as &lt;a href="http://www.l8nc.com/"&gt;l8nc&lt;/a&gt; to monitor your internet connection. I currently have l8nc &lt;a href="http://www.l8nc.com/graph.php?jid=97eb2a342e46024a5ed695723720f4fe"&gt;graphing my connection&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115438339991074438?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115438339991074438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115438339991074438' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115438339991074438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115438339991074438'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/07/enabling-ping-on-speedtouch-wl780.html' title='Enabling Ping on Speedtouch WL780'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115403817519130194</id><published>2006-07-27T21:35:00.000Z</published><updated>2006-07-27T22:09:35.703Z</updated><title type='text'>MaxDSL and Poor Router</title><content type='html'>Recently we had been getting allot of disconnects on our ADSL line with the router (Safecom SWAMRU-54108) failing to reconnect and requiring a reboot or even being powered off for a short while. After trying to fix it unsuccessfully and with it being out of warranty I decided to get a new router. I opted for a &lt;a href="http://www.speedtouch.co.uk/780.asp"&gt;SpeedTouch 780WL&lt;/a&gt;  from &lt;a href="http://www.dslsource.co.uk/"&gt;DSL Source &lt;/a&gt;which is an ADSL router, wireless access point  and voice over IP gateway all in one. They are currently selling it for 75 pounds with free delivery and it arrived the next day. After a very easy configuration it was connecting at 8,157kbs down and 636kbs up and has been rock stable for the past few days. This is much better than the old router which was only managing to sync at about 3,600kbs down. I don't know if my old router had developed a fault recently or was just a bad design. However the old router was very poor in comparison to the new router, it didn't have any polish and things never worked quite as they should.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115403817519130194?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115403817519130194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115403817519130194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115403817519130194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115403817519130194'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/07/maxdsl-and-poor-router.html' title='MaxDSL and Poor Router'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115272971021464217</id><published>2006-07-12T18:26:00.000Z</published><updated>2006-07-12T18:41:50.436Z</updated><title type='text'>Nintendo DS Lite (White)</title><content type='html'>I ended up trading in my PS2 for a white Nintendo DS Lite. Although there isn't the breadth of games there are some great ones:

&lt;ul&gt;&lt;li&gt;MarioKart DS - Having played MarioKart 64 as a student I felt right at home and this has to be one of the best games for the DS. Friend Code: 257771 280248&lt;/li&gt;&lt;li&gt;New Super Mario Bros. - Never played the orginal so this is all a little new, but very enjoyable.&lt;/li&gt;&lt;li&gt;Advanced Wars Dual Strike - A great turn based strategy game, although the characters are a little annoying the gameplay is excelent and well balanced.&lt;/li&gt;&lt;li&gt;Tony Hawk's American Sk8land - Having enjoyed Tony Hawks on the PS2 I picked this one up, although it is probably the worst game I own, although still good. Friend Code: 068792 703458&lt;/li&gt;&lt;li&gt;Metroid Prime Hunters - A great 1st person shooter which makes very good use of the touchscreen. I'm not very good at it but it is still very enjoyable. Friend Code: 2534 7629 8211&lt;/li&gt;&lt;/ul&gt;I'm really impressed with the DS lite, it looks good, is nice and small, has some great games and the battery life is excellent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115272971021464217?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115272971021464217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115272971021464217' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115272971021464217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115272971021464217'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/07/nintendo-ds-lite-white.html' title='Nintendo DS Lite (White)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115131888624751998</id><published>2006-06-26T09:58:00.000Z</published><updated>2006-06-26T13:09:24.696Z</updated><title type='text'>Spring MVC Forms</title><content type='html'>Some notes about Spring MVC and forms. In simple situations when the HTML forms maps well onto the domain model validation can be performed directly on the domain  model and the domain model can be used as the command class. This reduces the ammount of code that needs to be written and also means that validators can be used across multiple controllers. The problem is that this only works so long as the form maps well to the existing model.

In more complicated situations you will need a seperate command class to handle the processing of the form submission and will then want to validate that so that you can easily map errors in validation back to the form fields. If you map the command class onto the domain model and then validate, discovering which errors relate to which parts of the form becomes tricky. The problem is that then you may end up having duplicate validation code for multiple controllers.

When mapping a text input box &amp;lt;input type="text" name="number"&amp;gt; you have several options as to how the mapping is performed.

&lt;ul&gt;&lt;li&gt;Don't attempt any parsing of the field when mapping the field to the command class and leave it as at String. This then means that your controller has to perform the conversion to an integer and generate the apropriate error message. This complicates your controller with code that could be performed better elsewhere.&lt;/li&gt;&lt;li&gt;Have it mapped to a primative int. This means that no matter what the input in the form as long as the conversion and validation succeeds you will always get a number back from the command object even is there wasn't one present in the form, and this is the problem, you can't tell when the user left the field empty.
&lt;/li&gt;&lt;li&gt;Have it mapped to an Integer. This has the advantage that you can now tell if the user left the field blank as you will get back null. You can only do this though if you change to use a custom property editor as the default is to attempt to parse the empty string which fails and raises an error. I do this in my controller:
&lt;code&gt;
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)
{
&amp;nbsp;&amp;nbsp;// Map numbers to Integer but allow them to be empty.
&amp;nbsp;&amp;nbsp;binder.registerCustomEditor(Integer.class, null, new CustomNumberEditor(Integer.class, true));
}
&lt;/code&gt;
&lt;/li&gt;
If you use property editors to perform your conversion from strings to integers then you will probably also want to change the error messages that are generated when a problem occurs. Have a look at &lt;a href="http://static.springframework.org/spring/docs/1.2.x/api/org/springframework/validation/DefaultMessageCodesResolver.html"&gt;DefaultMessageCodesResolver&lt;/a&gt;
for the messages to map. As a starting point I have a property:
&lt;code&gt;
typeMismatch.java.lang.Integer=Cannot convert to a number.
&lt;/code&gt;
which is displayed when the data binder can't convert a string to a number.
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115131888624751998?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115131888624751998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115131888624751998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115131888624751998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115131888624751998'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/spring-mvc-forms.html' title='Spring MVC Forms'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115131578986523694</id><published>2006-06-26T08:47:00.000Z</published><updated>2006-06-26T09:56:29.883Z</updated><title type='text'>Locking Issues in Bodington</title><content type='html'>Currently most of the locking that is performed in Bodington is done using synchronized blocks in the Java code. Examples of this can be found in org.bodington.server.resources.ResoureTree and org.bodington.server.resources.UploadedFileManager. This works reasonably well except when you want to scale your application across multiple JVMs as the locking only applies to one JVM. The two ways around this are either to use explicit locks in the database or to code optimistic locks in your application. As deploying Bodington across multiple JVMs isn't important at the moment we are continuing to develop using the existing pattern of synchronized blocks.

This is important to me because in my quota implementation I need to lock sections of the tree while I calculate the current quota usage. While I am calculating the usage I don't want that section of the tree to change. As long as the locking is ok the quota calculations should stay in sync with the usage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115131578986523694?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115131578986523694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115131578986523694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115131578986523694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115131578986523694'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/locking-issues-in-bodington.html' title='Locking Issues in Bodington'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115079279215337232</id><published>2006-06-19T11:06:00.000Z</published><updated>2006-06-20T08:39:52.210Z</updated><title type='text'>Uploaded File Quotas</title><content type='html'>The implementation of uploaded file quotas is progressing reasonably well in WebLearn. They are now at a state where they seem to work reasonably well and I think the locking should prevent errors occurring when two people are uploading files at the same time. Implementing quotas on uploaded files was reasonably easy as there is one API through which all uploaded files are created/deleted. Next I have to implement quotas for resources which will be much harder as at the moment there isn't a standard API for creating resources although ResourceTree is a starting point.

The user importer is now in a reasonable state for next years students and I am just waiting for there to be a larger dataset and then will finish off the testing/debugging. Hopefully there shouldn't be too many bugs in it as most of the logic for group creation was taken from a previous imported and that was working reasonably well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115079279215337232?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115079279215337232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115079279215337232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115079279215337232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115079279215337232'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/uploaded-file-quotas.html' title='Uploaded File Quotas'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115070834066352110</id><published>2006-06-19T09:12:00.000Z</published><updated>2006-06-19T09:12:20.733Z</updated><title type='text'>The Observer | Business | Telecoms pray for time when the Skype finally falls in</title><content type='html'>&lt;a href="http://observer.guardian.co.uk/business/story/0,,1794639,00.html"&gt;The Observer | Business | Telecoms pray for time when the Skype finally falls in&lt;/a&gt; talks about how the telecoms companies are worried about Skype and mentions Oxford University as an example of an institution that no longer bans Skype. The reason for this is that in order to use Skype at Oxford you have to configure it so that the peer-to-peer (P2P) part of the client can be filtered by the University firewall preventing "leaching" of bandwidth. We have a page documenting &lt;a href="http://www.oucs.ox.ac.uk/network/voip/skype.xml"&gt;Oxfords Skype setup&lt;/a&gt;. It seems that the news never has the full story.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115070834066352110?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115070834066352110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115070834066352110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115070834066352110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115070834066352110'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/observer-business-telecoms-pray-for.html' title='The Observer | Business | Telecoms pray for time when the Skype finally falls in'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115014649042896248</id><published>2006-06-12T20:55:00.000Z</published><updated>2006-06-12T21:08:10.443Z</updated><title type='text'>Phone Line Repair and MaxDSL Speed</title><content type='html'>Last wednesday evening our phone line went dead along with our ADSL service. So the next day we called &lt;a href="http://www.itplc.com/"&gt;our provider&lt;/a&gt; and asked them to test to line and after a little nagging they got on to BT and had the line tested on Friday, they say there is a fault on the line and an engineer needs to be called. They said an engineer would be out to us on Wednesday of the following week. I was not impressed.

Anyway it turns out that a BT engineer appears around lunch time on Sunday and after a while fixes the phone line. After he's left I reconnect the ADSL and find that it isn't working, thankfully he gave us his mobile and so we drop him a call. He says that it will probably need another engineer to look at it tomorrow as nobody who knows about the ADSL stuff is about on a Sunday. Monday morning I get up and discover that the ADSL is working, great.

However looking on the router it is syncing at   3584 Kbps/640 Kbps. As I mentioned in &lt;a href="http://thicksliced.blogspot.com/2006/05/plusnet-and-8mb-adsl-maxdsl.html"&gt;previous post&lt;/a&gt; I was getting allot more (it settle down to around 5500Kbs/448Kbs), so although I now have working internet access again I have lost 2Mbps in the process. I suspect that there  isn't anything I can do about this as the line works fine, just not as well as it used to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115014649042896248?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115014649042896248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115014649042896248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115014649042896248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115014649042896248'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/phone-line-repair-and-maxdsl-speed.html' title='Phone Line Repair and MaxDSL Speed'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115013109308959092</id><published>2006-06-12T16:47:00.000Z</published><updated>2006-06-12T16:51:33.110Z</updated><title type='text'>Building Tomcat 5.5 from SVN problem</title><content type='html'>I was attempting to build Tomcat 5.5 from SVN using the instructions from &lt;a href="http://tomcat.apache.org/tomcat-5.5-doc/building.html"&gt;tomcat pages&lt;/a&gt;, however I was getting an error of:

&lt;span style="font-family: courier new;"&gt;/home/buckett/src/tomcat/build.xml:49: The following error occurred while executing this line:
/home/buckett/src/tomcat/build/build.xml:791: The following error occurred while executing this line:
/home/buckett/src/tomcat/container/webapps/docs/build.xml:88: java.lang.ClassNotFoundException: org.apache.tools.ant.taskdefs.optional.TraXLiaison
&lt;/span&gt;
after a little head scratching I discovered that I had installed ant as an Ubuntu package and I was missing the ant-optional package which provided this extra functionality. After intalling this additional package everything went smoothly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115013109308959092?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115013109308959092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115013109308959092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115013109308959092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115013109308959092'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/building-tomcat-55-from-svn-problem.html' title='Building Tomcat 5.5 from SVN problem'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-115010756616088979</id><published>2006-06-12T09:10:00.000Z</published><updated>2006-06-12T10:22:48.113Z</updated><title type='text'>Bodington Database Objects and User Importer</title><content type='html'>I am currently working on some new user import code for Oxfords installation of Bodington (WebLearn) which takes a feed of about 35000 users and creates accounts and groups for them. Due to the large number of users involved and the small number of changes that are made each day it is important to try and keep the import running fast. At the moment the bottleneck seems to be the database which eats up most of the CPU during the import, a quick look at a process listing shows PostgreSQL using 80% or the CPU and Java using 10%. Looking at the statement logging it seemed that for each user it was always updating the user in the database even if nothing had changed. Update statements are expensive for a database compared to select statements so cutting down the number of updates seemed an obvious way to improve the performance.

Every object that is stored in the database by Bodington extends org.bodington.database.PersistentObject which provides the skeleton for database objects One feature of PersistentObject is that it keeps track of wether an object has unsaved changes or not. This is done through calling the setUnsaved() method which is done by most setters of the subclasseds. Eg:

&lt;span style="font-family:courier new;"&gt;public void setName(String name)
{
&amp;nbsp;&amp;nbsp;this.name = name;
&amp;nbsp;&amp;nbsp;setUnsaved();
}
&lt;/span&gt;

Now this means that even if the name is set to the same value the object is flagged as being unsaved. One option would have been to have add checking to the userimporter so that it only updateded the name of a user if it was different to the current value:

&lt;span style="font-family:courier new;"&gt;if (!user.getName().equals(newName))
&amp;nbsp;&amp;nbsp;user.setName(newName);
&lt;/span&gt;
However there is no reason why other sections of Bodington shouldn't make use of this checking and it is also a database issue so I moved this code into the setter and ended up with:

&lt;span style="font-family:courier new;"&gt;public void setName( String name )
{
&amp;nbsp;&amp;nbsp;if (name == null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new IllegalArgumentException("Name cannot be null");
&amp;nbsp;&amp;nbsp;if (name.equals(this.name)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;this.name = name;
&amp;nbsp;&amp;nbsp;setUnsaved();
}

&lt;/span&gt;The checking to see that if name == null is because the database has a NOT NULL constraint and this also prevents a NullPointerException from being thrown if setName(null) is called. I added this checking to org.bodington.server.realm.Users and org.bodington.server.realm.Aliases and a quick test of updating 1000 users gave the results:
&lt;ul&gt;&lt;li&gt;Always Saving: 1minute 3 seconds.&lt;/li&gt;&lt;li&gt;Saving Changes: 30 seconds.&lt;/li&gt;&lt;/ul&gt;which isn't a bad improvement in performance. One side note is that PersistentObject.save() always saves the object and I could have changed it so that it only saved changed objects but I'm not sure that all the setters of the subclasses call setUnsaved() so I am doing my checking in the importer.

The group mapping has come wholesale from some old user import code with a few changes and just needs a little tweaking and it should be nearly ready for some proper testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-115010756616088979?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/115010756616088979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=115010756616088979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115010756616088979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/115010756616088979'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/bodington-database-objects-and-user.html' title='Bodington Database Objects and User Importer'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114952693765902073</id><published>2006-06-05T16:56:00.000Z</published><updated>2006-06-05T17:02:17.680Z</updated><title type='text'>Glassfish and Invalid URL Pattern</title><content type='html'>I was attempting to deploy WebLearn to the &lt;a href="https://glassfish.dev.java.net/"&gt;Glassfish&lt;/a&gt; application server and was gettting the error "Invalid URL Pattern" for /site/* which is used in various places in our web.xml configuration file. It turns out Glassfish doesn't like extra whitespace in it's url-patterns and we had things like:
&lt;span style="font-family:courier new;"&gt;&amp;lt;url-pattern&amp;gt;&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;/site/*&lt;/span&gt;
&lt;span style="font-family:courier new;"&gt;&amp;lt;/url-pattern&amp;gt;&lt;/span&gt;
when they need to be:
&lt;span style="font-family:courier new;"&gt;&amp;lt;url-pattern&amp;gt;/site/*&amp;lt;/url-pattern&amp;gt;&lt;/span&gt;
I've got the web.xml fixed on WebLearn and will push it across to Bodington at shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114952693765902073?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114952693765902073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114952693765902073' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114952693765902073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114952693765902073'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/glassfish-and-invalid-url-pattern.html' title='Glassfish and Invalid URL Pattern'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114951757721247124</id><published>2006-06-05T14:18:00.000Z</published><updated>2006-06-05T14:39:11.586Z</updated><title type='text'>Ubuntu Dapper Drake Upgrade</title><content type='html'>With Ubuntu Dapper Drake being released on the 1st of June I decided to upgrade my work desktop machine today. I just edited my &lt;span style="font-family:courier new;"&gt;sources.list&lt;/span&gt; file and then  ran &lt;span style="font-family:courier new;"&gt;apt-get update; apt-get dist-upgrade.&lt;/span&gt; Most of the upgrade went fine, but here are a few things that other people may fin helpful were.

nVidia Monitor Detection

It seems that the new nVidia driver was autodetecting that my monitor could do 76Hz vertical refresh rate at 1280x1024. Not while it can display this it didn't seem to be able to adjust the screen enough and as a result I was unable to see the two left most columns of pixels. I attempted to fix the vertical refresh rate in my configuration file ( &lt;span style="font-family:courier new;"&gt;/etc/X11/xorg.conf&lt;/span&gt; ) by setting the line &lt;span style="font-family: courier new;"&gt;VerticalRefresh 50-60&lt;/span&gt; but every time I started X up it would continue to use 76Hz which was outside the range. After quite a bit of Googling I discovered that the nvidia driver attempts to autodetect the monitor settings by default and the way to turn it off is to add an option to the file:
&lt;span style="font-family: courier new;"&gt;
Section "Device"
&amp;nbsp;&amp;nbsp;Identifier      "NVIDIA Corporation NV18 [GeForce4 MX 440 AGP 8x]"
&amp;nbsp;&amp;nbsp;Driver          "nvidia"
&amp;nbsp;&amp;nbsp;Option          "UseEdidFreqs" "false"
EndSection
&lt;/span&gt;

Pinned Rhythmbox

Somehow rhythmbox was pinned in the Synaptic Package Manager, this didn't seem to be affecting apt-get which was upgrading it without any problems. The problem turned out to be that synaptic can have its own list of pinned applications which are stored in /usr/lib/synaptic/preferences. As this only entry in this file was the pinning of rhythmbox I deleted the file and everything worked fine.

Packaged Java

Ubuntu now packages the Sun JDK which can be install just like any other package. I had a problem though in that all my alternatives (/etc/alternatives) were pointing to the wrong versions. I found a good post on &lt;a href="http://ubuntu.wordpress.com/2006/02/12/galternatives-gui-alternatives/"&gt;galternatives&lt;/a&gt; that allows you to easily edit them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114951757721247124?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114951757721247124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114951757721247124' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114951757721247124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114951757721247124'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/ubuntu-dapper-drake-upgrade.html' title='Ubuntu Dapper Drake Upgrade'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114950087444719657</id><published>2006-06-05T09:33:00.000Z</published><updated>2006-06-06T08:33:05.713Z</updated><title type='text'>User Import and Bodington Developers Meeting</title><content type='html'>The user import code is coming along, last week I added parsing of colleges, courses and departments and some tests against small bits of data. The status handling has also been sorted out so rather than working with strings they are converted to an enumeration.

Most of last week was taken up by a Bodington developers meeting in Leeds. The meeting went over two days with the first day being for discussion of short term Bodington developments and the second day for the longer term Bodington vision.

Out of the first day we decided to release Bodington 2.8 shortly, most of the code is already in CVS for Bodington 2.8 so once a few extras have been added and some tested has been performed 2.8 should go out the door. Other things discussed included a catchup on what developments have been happening at the various sites that run Bodington and the JISC projects that are using it.

The second day we discussed longer term direction including Portals, SOA, SOAP, REST. At the end of the day I just want to build a better product.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114950087444719657?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114950087444719657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114950087444719657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114950087444719657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114950087444719657'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/user-import-and-bodington-developers.html' title='User Import and Bodington Developers Meeting'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114936491639651631</id><published>2006-06-03T19:52:00.000Z</published><updated>2006-06-03T20:01:56.413Z</updated><title type='text'>I owe PayPal money</title><content type='html'>I owe PayPal 56 pence as a result of a currency conversion charge from a long time ago I think. Today I recieved an email nagging me to correct my balance and decided to attempt todo something about it, so I login to my account and attempt to add funds but it refuses to allow it just returning me to the form highlighting the fields that I have filled in sucessfully. So I looked at the email that PayPal had sent me and noticed it ended with:

&lt;span style="font-family: courier new;"&gt;We appreciate your cooperation and invite you to reply to this email with any questions.&lt;/span&gt;

&lt;span style="font-family: courier new;"&gt;Yours sincerely,&lt;/span&gt;
&lt;span style="font-family: courier new;"&gt;PayPal &lt;/span&gt;

&lt;span style="font-family: courier new;"&gt;Please do not reply to this email. This mailbox is not monitored and you will not receive a response......&lt;/span&gt;

So I replied to the mail and we'll see how we get on. They do accept cheques to fix my balance but I signed up with PayPal to get away from cheques....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114936491639651631?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114936491639651631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114936491639651631' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114936491639651631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114936491639651631'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/06/i-owe-paypal-money.html' title='I owe PayPal money'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114898100188413957</id><published>2006-05-30T09:10:00.000Z</published><updated>2006-05-30T09:23:21.896Z</updated><title type='text'>Quotas in WebLearn and User Import</title><content type='html'>Last week I started working on supporting quotas in WebLearn. This involved adding support to BuildingSession to allow the getting and setting of the resource and file quota. So now for any resource you can check and set the quota. I also built some pages to allow users to view the quotas and for sysadmins to set them. Next I need to add support to resource creation so that it always checks there is enough quota before allowing he creation, but this is where it gets a little more messy as there isn't on API for resource creation.

I had to stop work on the quotas to start work on the new user import tool as we had the new user import files available. At the moment we get our user details from LDAP but due to a redesign in the data contained in LDAP we need to go direct to the source. The files we get will be processed once a day and any new users created and any new group memberships added. It would be nice if we supported the removal of group memberships this time but I think that will have to wait until the end. So far I have got basic parsing of the users going and need to work on the parsing of the colleges, departments and courses. Then I can start doing user creation and then the mapping of attributes to group memberships.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114898100188413957?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114898100188413957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114898100188413957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114898100188413957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114898100188413957'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/quotas-in-weblearn-and-user-import.html' title='Quotas in WebLearn and User Import'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114885587831749787</id><published>2006-05-28T22:27:00.000Z</published><updated>2006-05-28T22:37:58.330Z</updated><title type='text'>Trip to Wales</title><content type='html'>Had our first proper short holiday away with Wilf last weekend when we went for an extended weekend to Wales (&lt;a href="http://maps.google.co.uk/maps?f=q&amp;hl=en&amp;q=tenby&amp;ll=51.681709,-4.703093&amp;spn=0.022884,0.083256&amp;om=1"&gt;Tenby&lt;/a&gt;).  It was really just an escape from the South East for us and so we didn't have a bit list of things todo. Just visited castles, beaches and galleries. Took a few &lt;a href="http://flickr.com/photos/buckett/sets/72057594143047927/"&gt;photos&lt;/a&gt; and bought a print of a painting to brighten up our house. Traveling was fine with Wilf with the main travelling taking about 4 hours and him sleeping through most of it (waking for a feed half way through each time). As with everything else now things take so long, previously we would have crammed 4 outings into a day and now with Wilf we struggle to get 2, but I don't mind one bit. My brother commented "Your becoming old" when I described our holiday to him, but you can't really go windsurfing, climbing and kite flying with a 10 week old baby, I'll just have to wait a few years. Wilf didn't seem to mind being in a different place and I think we prevented him from throwing up on anyone else's furniture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114885587831749787?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114885587831749787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114885587831749787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114885587831749787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114885587831749787'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/trip-to-wales.html' title='Trip to Wales'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114838074642848438</id><published>2006-05-23T10:33:00.000Z</published><updated>2006-05-23T10:39:06.443Z</updated><title type='text'>MyWebLearn Bookmarking</title><content type='html'>&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; " src="http://photos1.blogger.com/blogger/7870/756/320/mwl_bookmark.png" border="0" alt="Screen capture of the MyWebLearn bookmarking functionality" /&gt;
Some more progress on the bookmarking functionality of MyWebLearn has been made which will allow users to bookmark any WebLearn page, adding it to their own space. This is very similar to &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; but is tightly integrated into the WebLearn interface the access controls.

Further work needs doing on the internal links inside Bodington to improve the way the links work and are displayed but the basics are there. The reason for developing this is that people often don't want to navigate the whole tree to find the resources that they regulaly use and often don't have a fixed PC so local bookmarks dont work. Hopefully this help solve some of those problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114838074642848438?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114838074642848438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114838074642848438' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114838074642848438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114838074642848438'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/myweblearn-bookmarking.html' title='MyWebLearn Bookmarking'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114764117755119124</id><published>2006-05-14T21:09:00.000Z</published><updated>2006-05-14T21:12:57.563Z</updated><title type='text'>Everyones Blogging</title><content type='html'>Well it seems even my other half &lt;a href="http://aprilcottage.blogspot.com/"&gt;Anna&lt;/a&gt; has started a blog although I think the subject matter is going to be slightly different to mine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114764117755119124?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114764117755119124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114764117755119124' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114764117755119124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114764117755119124'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/everyones-blogging.html' title='Everyones Blogging'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114752445719435133</id><published>2006-05-13T12:24:00.000Z</published><updated>2006-05-14T21:14:30.740Z</updated><title type='text'>Trends in VLE/LMS</title><content type='html'>&lt;a href="http://www.google.com/trends?q=sakai%2C+moodle%2C+webct%2C+blackboard%2C++lams&amp;ctab=2&amp;amp;geo=all&amp;date=all"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://www.google.com/trends/viz?q=sakai,+moodle,+webct,+blackboard,++lams&amp;date=all&amp;amp;geo=all&amp;graph=weekly_img&amp;amp;sa=N" alt="" border="0" /&gt;&lt;/a&gt;
Using Google Trends you can get an idea about how interested general Google users are in different VLE products.
A graph of &lt;a href="http://www.google.com/trends?q=sakai%2C+moodle%2C+webct%2C+blackboard%2C+lams&amp;ctab=0&amp;amp;geo=all&amp;amp;date=all"&gt;several popular VLEs&lt;/a&gt; shows that while Blackboard leads the race the product that is gaing ground in all of this is Moodle which is just about to overtake WebCT.
The sharp dips for all the products are due to everyone stopping work around Christmas and I believe spike each year is just as the new intake of students happens and maybe it is also at that time that people start looking at other products for their own institutions. Interestingly although Sakai has a reasonable ammount of news coverage (Moodle has no news) general users don't seem all that interested in it. Maybe this is due to the type of users/teachers that Moodle attracts compared to the people that are interested in Sakai. Sakai is aimed squarely at large instituinal deployment compared to small departmental systems that Moodle supports well.
Despite the annountment that &lt;a href="http://www.blackboard.com/webct"&gt;Blackboard and WebCT&lt;/a&gt; (12th October 2005) will merge there doesn't seem to be much change to the trends, does this show that the majority of people searching are users of the systems rather than administrators?
The VLE that I work (Bodingont) on doesn't really feature at all but maybe it will get better?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114752445719435133?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114752445719435133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114752445719435133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114752445719435133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114752445719435133'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/trends-in-vlelms.html' title='Trends in VLE/LMS'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114745174495272498</id><published>2006-05-12T16:32:00.000Z</published><updated>2006-05-12T16:35:44.970Z</updated><title type='text'>MyWebLearn Progress</title><content type='html'>I am currently working on a development here at Oxford called MyWebLearn which is looking to allow all users to have their own space in the VLE to create content. As WebLearn (Bodington) has very flexible access controls they can also control access to the resource they create. Currently I have written the signup process and the basics are working. The next task is to tidy up all the rough edges.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114745174495272498?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114745174495272498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114745174495272498'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/myweblearn-progress.html' title='MyWebLearn Progress'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114708531157758429</id><published>2006-05-08T10:32:00.000Z</published><updated>2006-05-08T10:48:31.590Z</updated><title type='text'>Spring and Bodington</title><content type='html'>Currently Bodington doesn't use the typical MVC model and each web request maps directly to a controlling template. This makes handling things like errors in forms and redirects difficult. To try and improve matters I have attempted to integrate the Spring MVC framework into Bodington. This is a quick summary of the current state of play.

&lt;ul&gt;&lt;li&gt;When a request comes in the normal request handling of loading the resource and permission checking takes place.&lt;/li&gt;&lt;li&gt;Extra URL handling has been added that means that any file beginning with bs_spring is handed off to the Spring servlet.&lt;/li&gt;&lt;li&gt;The Spring servlet has a Bodington specific mapper that looks for the resource in the request and then attempts for find a bean matching /facilityname/page.&lt;/li&gt;&lt;li&gt;Control then passes to the bean which is a normal Spring controller.&lt;/li&gt;&lt;li&gt;The controller then returns its model and view which are mapped to a JSP.&lt;/li&gt;&lt;/ul&gt;One problem is that the Spring code depends on a facility name, maybe it should depend on the resource directly? We also have alot of duplication of the facilityname all over the code, it's in the spring configuration for the bean names and it's in the view names that are returned by the controllers. Maybe we could use the package names to infer the facilityname? However this depends on having utility code that is called as you can't have the view resolved do the work as it only knows about the view string and the locale.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114708531157758429?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114708531157758429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114708531157758429'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/spring-and-bodington.html' title='Spring and Bodington'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114660890471157534</id><published>2006-05-02T21:47:00.000Z</published><updated>2006-05-02T22:28:24.730Z</updated><title type='text'>Plusnet and 8MB ADSL (MaxDSL)</title><content type='html'>I a couple of weeks ago I received an email from Plusnet saying that if I wanted to I could ask to be upgraded to 8MB ADSL as soon as possible. Looking forward to the extra upstream bandwidth I sent a note to Plusnet support confirming that I would like to be upgraded as soon as possible. I got a confirmation back saying it had been received and I would be contacted when the order was placed.

Well when I got home to my computer today I found that the internet connection was down so I logged into the ADSL router and was pleasantly suppressed to see the ADSL line sync at DownStream: 6112 Kbps, UpStream: 448 Kbps. This was a nice increase from 2Mbs and all done for free.

Looking at the logs I can see that the router has been attempting several speeds and according to Plusnet it could take up to 10 days to settle down. Speeds it has tried so far since about 17:00 today are:

* DownStream: 6400 Kbps, UpStream: 448 Kbps
* DownStream: 6560 Kbps, UpStream: 448 Kbps
* DownStream: 6560 Kbps, UpStream: 448 Kbps
* DownStream: 6496 Kbps, UpStream: 448 Kbps
* DownStream: 6560 Kbps, UpStream: 448 Kbps
* DownStream: 6784 Kbps, UpStream: 448 Kbps
* DownStream: 6656 Kbps, UpStream: 448 Kbps
* DownStream: 6560 Kbps, UpStream: 448 Kbps
* DownStream: 6112 Kbps, UpStream: 448 Kbps
* DownStream: 6208 Kbps, UpStream: 448 Kbps
* DownStream: 6016 Kbps, UpStream: 448 Kbps

While I have been composing this post it has tried the last two on this list. As this adjustment is going on I am seeing a little more packet loss on the line but I'm guessing this is normal. If your looking at this post today you can see a &lt;a href="http://www.l8nc.com/graph.php?jid=97eb2a342e46024a5ed695723720f4fe"&gt;graph of the disconnects&lt;/a&gt; I've been experiencing. This graph shows data from the current day will probably be useless shortly...

Although the line speed seems to have increased using Plusnets speed tester I am only getting the expected data rate for a 1Mbs line but this may be due to the fact that BT don't adjust the ATM line restrictions as quickly, but it should happen in the next few days. The only thing that would have been useful is if Plusnet would have sent the emails warning me that this would be happening as they said they would.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114660890471157534?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114660890471157534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114660890471157534'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/plusnet-and-8mb-adsl-maxdsl.html' title='Plusnet and 8MB ADSL (MaxDSL)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114657840816950308</id><published>2006-05-02T13:51:00.000Z</published><updated>2006-05-02T14:03:06.146Z</updated><title type='text'>Create Patch (Eclipse 3.2)</title><content type='html'>I have been using Eclipse 3.2M6 for a little while now and I finding it a nice evolution of the 3.1 product. One simple feature that I had been wishing for was the ability to create patches but select individual files which the patch should contain. In 3.1 you could only create a patch for a folder (and all the files under it) or just one file. This was never a big problem as I could just drop back to the command prompt and do it manually, but it just means I can spend more of my life in Eclipse. This first appeared in &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.2M3-200511021600/eclipse-news-M3.html"&gt;Milestone 3&lt;/a&gt; under the title of &lt;span style="font-style:italic;"&gt;Improved Patch Support&lt;/span&gt;.

I end up using patch support quite a bit as I work on both WebLearn and Bodington which are similar codebase but stored in separate CVS repositories so using patches is the best way to move changes across. Although looking in the new and noteworthy the ability to record refactoring should help to allow changes to easily be pushed across.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114657840816950308?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114657840816950308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114657840816950308'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/05/create-patch-eclipse-32.html' title='Create Patch (Eclipse 3.2)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114621957454015626</id><published>2006-04-28T10:08:00.000Z</published><updated>2006-04-28T10:19:34.563Z</updated><title type='text'>Bodington DB Layer and Empty Subclasses</title><content type='html'>The &lt;a href="http://bodington.org"&gt;Bodington VLE&lt;/a&gt; has its own DB layer that allows Java objects to be stored and loaded from the database without having to touch JDBC and SQL. If you have an object that can already be persisted in the database layer and want to subclass it without adding any instance fields (so you don't need an extra table) you can store both the orginal class and the subclass in the same table. The reason this can work is that for every object stored in the database the DB layer keeps track (through the objects table) which Java type it should map to. The SQL to allow this subclassed object to be stored is something like:

&lt;code&gt;
INSERT INTO classes (type, super_type, db_name, table_name, java_class)
 VALUES(109, 10, null, null, 'org.bodington.server.resources.NewSubclass')
&lt;/code&gt;

The &lt;em&gt;type&lt;/em&gt; being the new ID for this type. And the &lt;em&gt;super_type&lt;/em&gt; being the persisted class that you are subclassing. Using this we could have a new resource class for every type of resource and then we can use polymophism, rather than having switch statements and constants.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114621957454015626?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114621957454015626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114621957454015626'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/04/bodington-db-layer-and-empty.html' title='Bodington DB Layer and Empty Subclasses'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114615070779165156</id><published>2006-04-27T15:11:00.000Z</published><updated>2006-04-27T15:12:24.580Z</updated><title type='text'>GNER and Wifi</title><content type='html'>&lt;a href="http://www.gner.co.uk/gner/mobileoffice"&gt;GNER Wifi&lt;/a&gt; service is designed to provide a Wifi service on trains. On Monday I was travelling back from a meeting on the 16:05 from Leeds to London Kings Cross (in the quiet coach) and I opened up my iBook, straight away it detected the network and I associated with it. However no matter what I did it refused to give me a DHCP lease. So all I can report is don't rely on Wifi being available as it may be broken.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114615070779165156?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114615070779165156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114615070779165156'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/04/gner-and-wifi.html' title='GNER and Wifi'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114474891667785503</id><published>2006-04-11T09:48:00.000Z</published><updated>2006-04-11T10:37:27.216Z</updated><title type='text'>Save Parliament! Stop the Legislative and Regulatory Reform Bill</title><content type='html'>I hope the &lt;a href="http://www.saveparliament.org.uk/"&gt;Save Parliament&lt;/a&gt; campain gains a little more media attention again. If you're in the UK please spend 5 minutes reading the site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114474891667785503?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114474891667785503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114474891667785503'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/04/save-parliament-stop-legislative-and.html' title='Save Parliament! Stop the Legislative and Regulatory Reform Bill'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114467549726925735</id><published>2006-04-10T13:16:00.000Z</published><updated>2006-04-10T13:25:19.236Z</updated><title type='text'>GeoURL</title><content type='html'>Thanks to &lt;a href="http://www.josephbloggs.com/"&gt;Joe&lt;/a&gt; for pointing me to &lt;a href="http://geourl.org/"&gt;GeoURL&lt;/a&gt; which basically says how you should put location metadata into your web pages. After a quick edit of my blog templates you'll now know that I live in High Wycombe, it would be nice if there were some support from blogger for this so that when you set you location in your profile it could exposes the geourl metadata as well, but hey.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114467549726925735?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114467549726925735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114467549726925735'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/04/geourl.html' title='GeoURL'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114427432090356645</id><published>2006-04-05T19:09:00.000Z</published><updated>2006-04-05T21:58:40.960Z</updated><title type='text'>Compiling for Older JVMs</title><content type='html'>I've been doing some development on WebLearn from home today and had to perform build to be deployed on our test server. Now normally I develop on the same software as we run on the production machines but I just happened to only have the Java 1.5 SDK installed on my home machine. Not really thinking I set the target to 1.4 so that the outputted class files were compatible with the 1.4 JVM that we use on our testing and production machines. This is done through our ant build file with something like:
&lt;code&gt;
&amp;lt;javac srcdir="src" destdir="build"  source="1.4" target="1.4"/&amp;gt;
&lt;/code&gt;
The cruital bit I thought was the target attibute. However after shipping the build to the sysadmin guys they come back saying they're getting a stack trace when deploying the application:
&lt;code&gt;
java.lang.NoSuchMethodError:
java.lang.StringBuffer.insert (ILjava/lang/CharSequence;) Ljava/lang/StringBuffer;
       org.bodington.servlet.BuildingServlet.init (Unknown Source)
&lt;/code&gt;
which shows that although the class files could be run by the 1.4 JVM they used API calls that only exist in the 1.5 JVM. Now at first this is comfusing because the code compiles fine with a 1.4 compiler and classes so what has changed as all the 1.4 API calls should exist in 1.5 (apart from the deprecated ones that were removed). The problem comes from some code similar to this:
&lt;code&gt;
StringBuffer str1 = new StringBuffer("123456");
StringBuffer str2 = new StringBuffer("  ");

str1.insert(2, str2);
&lt;/code&gt;
Under the 1.4 StringBuffer API there isn't the method insert(int offset, StringBuffer str) so the compiler uses the method &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StringBuffer.html#insert%28int,%20java.lang.Object%29"&gt;insert(int offset, Object str)&lt;/a&gt;. In the 1.5 API again there isn't a perfect match but there is a better one than the Object one, it is the method &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuffer.html#insert%28int,%20java.lang.CharSequence%29"&gt;insert(int offset, CharSequence str)&lt;/a&gt; and as StringBuffer implements CharSequence this closer API call is used. We could have fixed the code by changing it to:
&lt;code&gt;
str1.insert(2, (Object)str2);
&lt;/code&gt;
but this just fixes one call and there maybe others that we didn't find.

The real solution to this is to compile against the 1.4 classes when you are using the 1.5 compiler. Todo this you can use something like the following:
&lt;code&gt;
&amp;lt;javac srcdir="src" destdir="build"  source="1.4" target="1.4" bootclasspath="/home/buckett/j2sdk1.4.2_11/jre/lib/rt.jar" extdirs=""/&amp;gt;
&lt;/code&gt;
But of course for this you need to have downloaded the 1.4 SDK so I might as well have used the 1.4 compiler. However it is very likely that the 1.5 compiler contains better optimisations so WebLearn should run faster. However in future I think I'll just use the 1.4 compiler as it isn't worth the hassel. Sun does have a document on this this topic but labels it &lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/javac.html#crosscomp-example"&gt;Cross Compiling&lt;/a&gt;. Why both the Sun and the ant documentation don't mention that when using the target option you probably also want to use the bootclasspath option. It seems obvious looking back but it wasn't at the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114427432090356645?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114427432090356645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114427432090356645'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/04/compiling-for-older-jvms.html' title='Compiling for Older JVMs'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114407152217748233</id><published>2006-04-03T11:37:00.000Z</published><updated>2007-01-11T22:18:09.512Z</updated><title type='text'>Thunderbird Address Book and LDAP</title><content type='html'>Here at Oxford University we have an LDAP server that contains details of all the staff and students, although it isn't yet a &lt;a href="http://www.oucs.ox.ac.uk/network/servers/index.xml.ID=ldap"&gt;production service&lt;/a&gt; it is available to computing services (OUCS) staff members. At first I tried configuring Thunderbird to access the LDAP server but found that searches took far too long so I just forgot about it and carried on using Thunderbird without LDAP support.

Then one of my colleagues Paul Trafford was trying to switch from Eudora to Thunderbird and was complaining that Thunderbird was taking ages to perform searches so I had another look into it. The reason that the searches were taking ages is that it was performing queries on attributes that don't have good indexes and so these required full scans taking a long time. Unfortunately finding and changing the queries used by Thunderbird isn't an easy task. After a little Googling the first thing to come up was a page explaining how &lt;a href="http://www.mozilla.org/projects/thunderbird/specs/ldap.html"&gt;LDAP attributes map onto Address Book properties&lt;/a&gt; and although this was useful it didn't explain how to change the search that was begin run.

A few people have blogged this and someone else's experience with &lt;a href="http://blogs.sun.com/roller/page/watt?entry=evolution_thunderbird_and_my_hate"&gt;Thunderbird and LDAP&lt;/a&gt; was helpful although it didn't go all the way to solving my problems. After a little more Googling I found another page that have details of &lt;a href="http://www.mozilla.org/mailnews/arch/addrbook/hiddenprefs.html"&gt;hidden preferences for LDAP searches&lt;/a&gt;. Now using this and the search that Paul had used in Eudora I was able to recreate a useful and fast LDAP search.

Here are the lines for pref.js in your Thunderbird profile directory. You should only edit this file when Thunderbird is not running as it gets saved when Thunderbird closes.

&lt;code&gt;
user_pref("ldap_2.autoComplete.directoryServer", "ldap_2.servers.Oxford");
user_pref("ldap_2.servers.Oxford.description", "Oxford");
user_pref("ldap_2.servers.Oxford.filename", "abook-1.mab");
// Oxford uses an objectClass of oucsOrganizationPerson to show a person.
user_pref("ldap_2.servers.Oxford.uri", "ldap://ldap.ox.ac.uk:389/ou=people,dc=ox,dc=ac,dc=uk??sub?(objectClass=oucsOrganizationalPerson)");
// Our LDAP stores some other useful data that should be mapped to attributes so we can search on it.
user_pref("ldap_2.servers.default.attrmap.Custom1", "universityBarcode");
user_pref("ldap_2.servers.default.attrmap.Custom2", "oucsUsername");
user_pref("ldap_2.servers.default.attrmap.Custom3", "uniqueIdentifier");
user_pref("ldap_2.servers.default.attrmap.Department", "oucsDivision");
// Although we have a displayname field it isn't indexed so search and diplay common name.
user_pref("ldap_2.servers.default.attrmap.DisplayName", "cn");
user_pref("ldap_2.servers.default.attrmap.PreferMailFormat", "preferredMail");
// Search on Oxford stuff
user_pref("mail.addr_book.quicksearchquery.format", "?(or(Custom1,=,@V)(Custom2,=,@V)(Custom3,=,@V)(DisplayName,c,@V))");
&lt;/code&gt;

Adding this to your config means that you can search on the common name, barcode, uniqueID and username and it is fast. It doesn't mean that you will be able to use the LDAP server when composing mails though as it seems that some of these preferences aren't used by that code and so the search still looks at the default attributes and as a result very slow here.

This has only been tested with Thunderbird 1.5&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114407152217748233?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thicksliced.blogspot.com/feeds/114407152217748233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10026400&amp;postID=114407152217748233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114407152217748233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114407152217748233'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/04/thunderbird-address-book-and-ldap.html' title='Thunderbird Address Book and LDAP'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114401430455784425</id><published>2006-04-02T21:41:00.000Z</published><updated>2006-04-02T21:45:04.573Z</updated><title type='text'>New Eclipse Milestone (3.2M6)</title><content type='html'>A couple of days ago &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.2M6-200603312000/index.php"&gt;Eclipse 3.2M6&lt;/a&gt; was released with some more nice features. It's getting to the point that I might switch to the new version (currently using the stable build, 3.1.2) for my main version as long as it is reasonably stable. I'll probably have a go next week and see how it goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114401430455784425?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114401430455784425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114401430455784425'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/04/new-eclipse-milestone-32m6.html' title='New Eclipse Milestone (3.2M6)'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114364256137827901</id><published>2006-03-29T13:57:00.000Z</published><updated>2006-03-30T11:05:26.873Z</updated><title type='text'>Skipping WebAuth Confirmation Screen</title><content type='html'>At my employer &lt;a href="http://www.ox.ac.uk/"&gt;Oxford University&lt;/a&gt; we use &lt;a href="http://webauth.stanford.edu/"&gt;Stanford WebAuth&lt;/a&gt; for web based Single Sign On (SSO). One of my particular problems with the current setup at Oxford is that for each service you sign into you have to confirm that you wish to signon using your credentials to the site. At Oxford this is known as the green tick page. Thanks to the wonderfull Firefox plugin called &lt;a href="http://greasemonkey.mozdev.org/"&gt;greasemonkey&lt;/a&gt; I can have some JavaScript run when I visit the green tick page to automatically follow the link. The result is a greasemonkey script that means I don't have to click on the link. I've put the script up for anyone else who might find it useful. &lt;a href="http://bumph.org/webauth/webauthtickjumper.user.js"&gt;WebAuth Tick Jumper&lt;/a&gt; to use it you should already have greasemonkey installed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114364256137827901?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114364256137827901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114364256137827901'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/03/skipping-webauth-confirmation-screen.html' title='Skipping WebAuth Confirmation Screen'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114362839609597274</id><published>2006-03-29T10:20:00.000Z</published><updated>2006-03-29T10:33:16.106Z</updated><title type='text'>SSH Tunnels and Multiple Copies of Firefox</title><content type='html'>I'm currently working from home and need todo some testing of a website that is only accessable from some restricted IPs inside my work offices. To get around this I use and ssh tunnel:

&lt;code&gt;ssh -D 1080 -N machine.ox.ac.uk &amp;&lt;/code&gt;

&lt;ul&gt;&lt;li&gt;-D 1080 sets up a SOCKS server listen on localhost, port 1080 &lt;/li&gt;&lt;li&gt;-N mean no command gets run when the connection is established so it can be run in the background safely (SSH 2)&lt;/li&gt;&lt;/ul&gt;Once I have connected and authenticate I want to start another copy of Firefox but keep my existing instance of Firefox running for normal browsing. Firefox by default tries to limit you to only one copy being running at any one time and so just starting Firefox up you end up with just another window for your existing instance. There are some other blog posts about &lt;a href="http://blog.dojotoolkit.org/2005/12/01/running-multiple-versions-of-firefox-side-by-side"&gt;running multiple copies of Firefox&lt;/a&gt; but they don't have a nice one liner. Mine is:

&lt;code&gt;( export MOZ_NO_REMOTE=1; firefox -profilemanager ) &amp;amp;&lt;/code&gt;

The brackets mean that a subshell is started so that the MOZ_NO_REMOTE only affects the single firefox instance. This then brings up the profile manager as when running multiple copies of Firefox you have to use a different profile for each one. As I am wanting to test a remote website through the ssh connection I create a new profile called SOCKS and start it. Then once the extra copy of Firefox is running I edit the connection settings (Edit -&gt; Preferences) and specify Manual Proxy Settings with the SOCKS host set to localhost and the port set to 1080.

After clicking Ok all my browsing from this copy of Firefox goes through the ssh connection so I can test the IP restricted website without having to run a VPN. The only thing left todo is to install a theme in the SOCKS profile so it is more obvious which profile I am using.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114362839609597274?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114362839609597274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114362839609597274'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/03/ssh-tunnels-and-multiple-copies-of.html' title='SSH Tunnels and Multiple Copies of Firefox'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114245778273153800</id><published>2006-03-15T21:23:00.000Z</published><updated>2006-03-15T21:23:02.786Z</updated><title type='text'>Wilf J Buckett</title><content type='html'>Anna gave brith to &lt;a href="http://flickr.com/photos/buckett/sets/72057594079827183/"&gt;Wilf J Buckett
&lt;/a&gt; on Friday the 10th of March 2006, he weighed 6lb 12oz and mother and baby are doing well. It doesn't feel all that different being a father I just see to be getting less sleep. The one change I have noticed is that now rather than watching TV we spend time watching Wilf. I just hope I can remember that not everyone want to hear about all the things Wilf has been doing that day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114245778273153800?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114245778273153800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114245778273153800'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/03/wilf-j-buckett.html' title='Wilf J Buckett'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-114182535580963978</id><published>2006-03-08T13:42:00.000Z</published><updated>2006-03-08T13:42:35.836Z</updated><title type='text'>Clipboard and the Web</title><content type='html'>Through a &lt;a href="http://philwilson.org/blog/2006/03/javascript-slides-yahoo-javascript-and.html"&gt;post&lt;/a&gt; by Phil Wilson I found a really beautiful idea about how the &lt;a href="http://spaces.msn.com/rayozzie/blog/cns%21FB3017FBB9B2E142%21285.entry?_c=BlogPart#permalink"&gt;clipboard should work on the web&lt;/a&gt;. It show a rather slick way of allowing data to be transfered between web applications and also between desktop applications and the web. To understand it best just watch the &lt;a href="http://spaces.msn.com/editorial/rayozzie/demo/liveclip/screencast/liveclipdemo.html"&gt;screencasts&lt;/a&gt;.

This sort of feature is one that needs consitent implementation across applications to ease the learning curve for users but with features like this the future does look good for applications being delivered through the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-114182535580963978?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114182535580963978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/114182535580963978'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/03/clipboard-and-web.html' title='Clipboard and the Web'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-10026400.post-113952414427305868</id><published>2006-02-09T22:29:00.000Z</published><updated>2006-02-09T22:29:04.286Z</updated><title type='text'>e-Literate: Stephen Downes Missed the Point</title><content type='html'>&lt;a href="http://mfeldstein.com/index.php/weblog/comments/307/"&gt;e-Literate: Stephen Downes Missed the Point&lt;/a&gt; has some very good discussion on VLE/LMS architecture/development/direction. It seems to have some parrallels with the questions I have regarding the project &lt;a href="http://sourceforge.net/projects/tetraelf"&gt;Tetra&lt;/a&gt;.

And what do I think? I'm very skeptical about this idea that we are close to a framework where we can take tools from different places and plug them together. If the tools are written against an existing product that defines the layers and APIs then everything works (like plugins for Firefox), but we are trying to get Firefox plugins to work in IE. For me the biggest problem in the VLE world is dealing with authentication and authorization which is often ignored by other web applications as they don't have materials that they need to restrict access to. Eg, Amazon doesn't have some books that only some people can see, so it's web APIs can be simple. In the VLE most of the current material is restricted and authorization checks have to be peformed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10026400-113952414427305868?l=thicksliced.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/113952414427305868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10026400/posts/default/113952414427305868'/><link rel='alternate' type='text/html' href='http://thicksliced.blogspot.com/2006/02/e-literate-stephen-downes-missed-point.html' title='e-Literate: Stephen Downes Missed the Point'/><author><name>Matthew Buckett</name><uri>https://profiles.google.com/115848623503312671365</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1fo0HjRzlhc/AAAAAAAAAAI/AAAAAAAAAV8/y3vEc51EUfE/s512-c/photo.jpg'/></author></entry></feed>
