<?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-2150042504803929508</id><updated>2012-01-20T23:46:20.214Z</updated><category term='java 1.5'/><category term='R bash parameters arguments'/><category term='Continuous Integration'/><category term='GWT'/><category term='VMWare'/><category term='ant'/><category term='mysql'/><category term='latex haskell'/><category term='googlecode hudson postcommitwebhook trigger'/><category term='haskell error'/><category term='1146'/><category term='filtering deprecated'/><category term='scala java'/><category term='maven'/><category term='VirtualBox copy and paste shared'/><category term='CSV unification java cobertura coverage generic interfaces enum hashcode'/><category term='xmlhttprequest'/><category term='Tomcat'/><category term='Doug Lea'/><category term='cargo'/><category term='WebMacro'/><category term='view'/><category term='replacing concurrent.jar'/><category term='rdf time oxpoints'/><category term='Hudson'/><category term='functional java'/><category term='java.util.concurrent'/><category term='java gwt virtual framebuffer'/><category term='amd64 skype android'/><category term='Brian Goetz'/><category term='git svn subversion'/><category term='jdbc mysql MyISMA InnoDB'/><category term='1356'/><category term='R package installation'/><category term='&quot;Out of memory error&quot;'/><category term='deploy'/><title type='text'>Tim Pizey</title><subtitle type='html'>Living in Oxford, Cyberspace</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-841570987475069138</id><published>2012-01-20T17:13:00.000Z</published><updated>2012-01-20T23:46:20.229Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='1356'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='1146'/><category scheme='http://www.blogger.com/atom/ns#' term='view'/><title type='text'>MySQL VIEW error "Table doesn't exist"</title><content type='html'>&lt;code&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select table_name&lt;br /&gt;    -&gt; from information_schema.tables&lt;br /&gt;    -&gt; where table_type='VIEW';&lt;br /&gt;+---------------+&lt;br /&gt;| table_name    |&lt;br /&gt;+---------------+&lt;br /&gt;| ClinicalDrugs |&lt;br /&gt;| Studies       |&lt;br /&gt;| StudySites    |&lt;br /&gt;| pkAnalytes    |&lt;br /&gt;| pkSamples     |&lt;br /&gt;| pkdetails     |&lt;br /&gt;+---------------+&lt;br /&gt;6 rows in set (0.00 sec)&lt;br /&gt;mysql&gt; select * from chassisDb.pkDetails;&lt;br /&gt;ERROR 1146 (42S02): Table 'chassisDb.pkDetails' doesn't exist&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;The listing gives the named view but we are told it does not exist. I was also able to provoke &lt;code&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; select * from viewname;&lt;br /&gt;ERROR 1356 (HY000): View 'dbname.viewname' references invalid table(s) or &lt;br /&gt;column(s) or function(s) or definer/invoker of view lack rights to use them&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;If you try to access the view from JDBC then you will see &lt;/p&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;java.sql.SQLException: View 'chassisDb.Studies' references invalid table(s) or &lt;br /&gt;column(s) or function(s) or definer/invoker of view lack rights to use them&lt;br /&gt; at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;This is caused by MySQL's weird, newish, security defaults for the &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/create-view.html"&gt;CREATE VIEW&lt;/a&gt; command. &lt;/p&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;create view Studies as &lt;br /&gt;select * from Entry, Study where Study.EntryId = Entry.Id;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;is translated, after defaults are applied, to &lt;code&gt;&lt;pre&gt;&lt;br /&gt;CREATE VIEW SQL SECURITY DEFINER Studies AS &lt;br /&gt;SELECT  Entry.Id, Study.Id FROM Entry, Study WHERE Study.EntryId = Entry.Id;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;If you now try to use this view as any user other than the definer of the view you will get the error above. What you wanted, and have to write explicitly to avoid the default is &lt;code&gt;&lt;pre&gt;&lt;br /&gt;CREATE VIEW SQL SECURITY INVOKER Studies AS &lt;br /&gt;SELECT  Entry.Id, Study.Id FROM Entry, Study WHERE Study.EntryId = Entry.Id;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;This page in the hope that it helps!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-841570987475069138?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/841570987475069138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2012/01/mysql-view-error-table-doesnt-exist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/841570987475069138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/841570987475069138'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2012/01/mysql-view-error-table-doesnt-exist.html' title='MySQL VIEW error &quot;Table doesn&apos;t exist&quot;'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-9190584671010316246</id><published>2012-01-19T17:41:00.000Z</published><updated>2012-01-19T17:41:05.149Z</updated><title type='text'>Simple MySQL reporting database</title><content type='html'>&lt;p&gt;We have created an XML based repository of clinical trials study data. &lt;/p&gt;&lt;p&gt;To report upon this we create an isomorphic MySQL database using &lt;a href="http://java.net/projects/hyperjaxb"&gt;HyperJAXB&lt;/a&gt;. Our main configuration of hyperjaxb is to use an &lt;a href="http://code.google.com/p/dsn-chassis/source/browse/#svn%2Ftrunk%2Fchassis-hyperjaxb3-naming"&gt;information preserving naming convention plugin&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The builds are under &lt;a href="http://jenkins.cggh.org/"&gt;Continuous Integration&lt;/a&gt;.The database is created during the course of the &lt;a href="http://maven.apache.org"&gt;Maven&lt;/a&gt; build, after this &lt;b&gt;views&lt;/b&gt; are created and the database dumped. &lt;/p&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;mysql chassisDb &lt; views.sql&lt;br /&gt;mysqldump chassisDb  --complete-insert --skip-opt --add-drop-table  &gt; $file&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;The dump file is then copied to an Amazon Web Services T1 instance, which only has MySQL installed.Two users exist: &lt;em&gt;reader&lt;/em&gt; and &lt;em&gt;uploader&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;These two users have usernames and passwords configured in &lt;span class="fileName"&gt;.my.cnf&lt;/span&gt; in their home directories containing&lt;/p&gt;&lt;pre class="fileText"&gt;&lt;br /&gt;[client]&lt;br /&gt;user=user&lt;br /&gt;password=password&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;uploader&lt;/em&gt; has a &lt;TT&gt;cron&lt;/TT&gt; job configured to update the database from any uploaded files: &lt;/p&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;mysql chassisDb &lt; chassisDb_20120119.sql &lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;The database can now be accessed using the &lt;a href="http://reporting.pentaho.com"&gt;Pentaho reporting tool&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/2150042504803929508-9190584671010316246?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/9190584671010316246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2012/01/simple-mysql-reporting-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/9190584671010316246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/9190584671010316246'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2012/01/simple-mysql-reporting-database.html' title='Simple MySQL reporting database'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-918767077330867375</id><published>2011-11-22T12:30:00.001Z</published><updated>2011-11-23T09:44:24.044Z</updated><title type='text'>Functional Programming in Haskell</title><content type='html'>&lt;p&gt;Wow, I have submitted my &lt;a href="http://tim.pizey.net/FPR/assignment/FPR.pdf"&gt;assignment&lt;/a&gt; for the &lt;a href="https://www.softeng.ox.ac.uk/subjects/FPR.html"&gt;Functional Programming in Haskell&lt;/a&gt; course. &lt;/p&gt;&lt;p&gt;I am really tired. &lt;/p&gt;&lt;p&gt;The period allotted to the assignment is six weeks. I have put in over 60 hours and taken two days leave. Yeah, I know, they said about 25 hours should do it, but it takes as long as it takes. &lt;/p&gt;&lt;p&gt;I have known that Functional Programming was the missing element of my experience for a long while. I asked for and was given this course by work - yay work! It is an expensive course and I could not have afforded the 7 days holiday it would have taken without their support. &lt;/p&gt;&lt;p&gt;These seven weeks started much earlier:This year I have written some R code, which is a sorta functional language. I tried to do some prestudy: I bought the course book and read chapter 1 twice (once on holiday). I read through the prestudy material. Very little of this cohered, but it was just enough to enable me to keep my balance during the course. &lt;/p&gt;&lt;p&gt;The course was great! The lecturer served on the Haskell committee. The SoftEng department at Oxford is smart in every sense. The lunches at Kellogg College were great. The other students were really bright. I just about kept up, contributing more than most and not being wrong as often as some. On Thursday I caught myself gurning during the lecture: it was all so elegant!&lt;/p&gt;&lt;p&gt;Immediately the course ended, I had hopes of Friday afternoon but it was not until the evening, I started organising myself. Reading the questions repeatedly, I tried chipping away at them. &lt;/p&gt;&lt;p&gt;Things soon went pretty horribly wrong: I could not be sure I understood the meaning of the questions, what level of completeness was expected or what shape the answers were meant to have. The assignment centred upon producers, which we had hardly touched upon and which did not feature in the course documents, consumers being the main focus. So I continued to erect a structure of &lt;span title="Yak hair comes from 'yak shaving'" style="background-color: #EEFFEE; border1px sold green;"&gt;&lt;tt&gt;yak hair&lt;/tt&gt;&lt;/span&gt;: we would need a test harness, Latex processing, bibliography. &lt;/p&gt;&lt;p&gt;I did manage to get an answer, thought it was right, was elated. Read in &lt;a href="http://occasional-reader.blogspot.com/2011/11/introduction-to-functional-programming.html"&gt;Bird&lt;/a&gt; that my answer was wrong (though, infuriatingly the answer was 'left as an exercise'), was pretty disconsolate.Researched further and discovered that the answer was that &lt;a href="http://en.wikipedia.org/wiki/Binary_tree#Combinatorics"&gt;the number of trees that can be generated from &lt;tt&gt;n&lt;/tt&gt; leaves is the Catalan number for &lt;tt&gt;n-1&lt;/tt&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Managed to write the generator and tests. Yay!&lt;/p&gt;&lt;p&gt;In between the ups and downs I had managed to pick off &lt;b&gt;list&lt;/b&gt;, &lt;b&gt;length&lt;/b&gt; etc. &lt;/p&gt;&lt;p&gt;Managed to do some pretty solid work around higher order functions, though was running out of time. I managed to finish &lt;em&gt;Part I&lt;/em&gt;, but now only had a week for &lt;em&gt;Part II&lt;/em&gt; and &lt;em&gt;Part III&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;&lt;em&gt;Part II&lt;/em&gt; did fall out pretty easily, but it was still probably 12 hours. The tests were in place when I started to embellish with nice-to-haves, which helped. &lt;/p&gt;&lt;blockquote style="border:2px solid black;"&gt;&lt;h4&gt;Part II&lt;/h4&gt;If all tests pass then the page is written to the  file system.&lt;code&gt;&lt;pre&gt;&lt;br /&gt;output :: IO ()&lt;br /&gt;output = do&lt;br /&gt;writeFile "fpr.xhtml" (charSequToString (showXHTMLPage testPage))&lt;br /&gt;The resulting xhtml  file can be seen at [&lt;a href="http://context-computing.co.uk/FPR/fpr.xhtml"&gt;output&lt;/a&gt;] and is shown valid at [&lt;a href="http://validator.w3.org/check?uri=http%3a%2f%2fcontext-computing%2eco%2euk%2fFPR%2ffpr%2exhtml"&gt;W3C Validator&lt;/a&gt;].&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;Part III&lt;/em&gt; (the essay - mine ended up as something like &lt;strong&gt;Discuss the Influence of FP on Java&lt;/strong&gt;) got significantly squeezed, as I kept returning to polish &lt;em&gt;Part II&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;At 11.30pm I spotted a mistake in &lt;em&gt;Part I&lt;/em&gt; - in the &lt;tt&gt;length&lt;/tt&gt; function and its test. &lt;/p&gt;&lt;p&gt;Submitted the thing at 12.40am. Have printed it out but resisted the temptation to read it. Am feeling like a zombie. &lt;/p&gt;&lt;p&gt;After the deadline had passed I added a missing line break to the output, just to show that this is for me, not just for the marker. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-918767077330867375?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/918767077330867375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/11/functional-programming-in-haskell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/918767077330867375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/918767077330867375'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/11/functional-programming-in-haskell.html' title='Functional Programming in Haskell'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-7590297002802793000</id><published>2011-11-07T13:56:00.000Z</published><updated>2011-11-07T13:59:38.292Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='jdbc mysql MyISMA InnoDB'/><title type='text'>Specify InnoDb as default table type in JDBC</title><content type='html'>One of the recurrent gotchas with MySQL is that the default table type is &lt;em&gt;MyISAM&lt;/em&gt;, whereas you almost definitely need &lt;em&gt;InnoDB&lt;/em&gt;, if you want transactions, indexing or anything else that would make MySQL a useful database. &lt;h3&gt;Set default table type for all databases&lt;/h3&gt;In &lt;span class="fileName"&gt;/etc/mysql/my.cnf&lt;/span&gt; add:&lt;span class='fileText'&gt;[mysqld] &lt;br/&gt;default-storage-engine=InnoDB&lt;/span&gt;But this requires that you have root access to the server and that you want all tables to use InnoDB. &lt;h3&gt;Specify default on JDBC url&lt;/h3&gt;&lt;span class='fileText'&gt;database.url=jdbc\:mysql\://localhost\:3306/chassis_studies?autoReconnect=true&amp;sessionVariables=storage_engine=InnoDB&lt;/span&gt;You could of course use &lt;a href="http://www.postgresql.org/"&gt;a real database&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-7590297002802793000?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/7590297002802793000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/11/specify-innodb-as-default-table-type-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7590297002802793000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7590297002802793000'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/11/specify-innodb-as-default-table-type-in.html' title='Specify InnoDb as default table type in JDBC'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-7623376615386096791</id><published>2011-10-14T15:25:00.000+01:00</published><updated>2011-10-14T15:25:37.294+01:00</updated><title type='text'>cvs to github</title><content type='html'>Following &lt;a href="http://stackoverflow.com/questions/584522/how-to-export-revision-history-from-mercurial-or-git-to-cvs/586225#586225"&gt;How to export revision history from mercurial or git to cvs?&lt;/a&gt; I created an id file mapping cvs ids to github name, email format for all contributors: &lt;code class="fileText"&gt;&lt;pre&gt;&lt;br /&gt;timp=Tim Pizey&amp;lt;timp@paneris.org&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;then create a repository on github (melati in this example, I already have uploaded my ssh public key for this machine) &lt;code&gt;&lt;pre&gt;&lt;br /&gt;git cvsimport -d /usr/cvsroot -C melati -r cvs -k -A ../../git_authors melati&lt;br /&gt;cd melati&lt;br /&gt;echo A jdbc to java object relational mapping system. 1999-2011 &gt; README.txt&lt;br /&gt;git add README.txt&lt;br /&gt;git commit -m "Initial" README.txt&lt;br /&gt;git remote add origin git@github.com:timp21337/melati.git&lt;br /&gt;git push -u origin master&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;See &lt;a href="https://github.com/timp21337/melati"&gt;https://github.com/timp21337/melati&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-7623376615386096791?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/7623376615386096791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/10/cvs-to-github.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7623376615386096791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7623376615386096791'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/10/cvs-to-github.html' title='cvs to github'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-6337438811105421691</id><published>2011-10-09T21:42:00.000+01:00</published><updated>2011-10-10T11:48:54.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latex haskell'/><title type='text'>Installing lhs2TeX on Ubuntu</title><content type='html'>&lt;a href="http://people.cs.uu.nl/andres/lhs2tex/"&gt;lhs2TeX&lt;/a&gt; is a processor for literate Haskell code whose output is laTeX.The following worked for me on Unbuntu 11.04, though this was not the path I travelled, that is I discovered that, for example, &lt;tt&gt;libghc6-zlib-dev&lt;/tt&gt; was a prerequisite the hard way.&lt;code&gt;&lt;pre&gt;&lt;br /&gt;sudo apt-get install ghc&lt;br /&gt;sudo apt-get install libghc6-zlib-dev&lt;br /&gt;sudo apt-get install cabal-install&lt;br /&gt;cabal update&lt;br /&gt;cabal install cabal-install&lt;br /&gt;sudo apt-get install texlive&lt;br /&gt;cabal install lhs2tex&lt;br /&gt;logout  or &lt;br /&gt;export PATH=$PATH:~/.cabal/bin&lt;br /&gt;lhs2TeX -o t.tex t.lhs &lt;br /&gt;pdflatex t.tex&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-6337438811105421691?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/6337438811105421691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/10/installing-lhs2tex-on-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6337438811105421691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6337438811105421691'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/10/installing-lhs2tex-on-ubuntu.html' title='Installing lhs2TeX on Ubuntu'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-5141474806937324928</id><published>2011-10-05T11:04:00.000+01:00</published><updated>2011-10-05T11:04:16.441+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell error'/><title type='text'>Haskell - parse error in pattern: n + 1</title><content type='html'>Should you get the following error from Haskell  &lt;pre&gt;&lt;code&gt;Parse error in pattern: n + 1&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;this maybe because you are using the &lt;b&gt;n+1&lt;/b&gt; pattern, which is no longer included by default eg &lt;pre&gt;&lt;code&gt;&gt; power :: Double -&gt; Int -&gt; Double&lt;br /&gt;&gt; power x 0         = 1&lt;br /&gt;&gt; power x (n + 1)   = x * power x n&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;the fix is to include &lt;pre&gt;&lt;code&gt;&gt; {-# LANGUAGE NPlusKPatterns #-}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Hope this helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-5141474806937324928?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/5141474806937324928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/10/haskell-parse-error-in-pattern-n-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5141474806937324928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5141474806937324928'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/10/haskell-parse-error-in-pattern-n-1.html' title='Haskell - parse error in pattern: n + 1'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-5394220845580005854</id><published>2011-08-17T13:05:00.004+01:00</published><updated>2011-08-17T15:29:04.129+01:00</updated><title type='text'>Proxying from apache2 to application server (eg tomcat, jetty)</title><content type='html'>It is often convenient to proxy an application server, such as Jetty or Tomcat, as these tend to be mounted on ports other than port 80. The following steps worked in an Ubuntu setup. &lt;br /&gt;&lt;br /&gt;Enable mod_proxy&lt;br /&gt;&lt;code&gt;&lt;pre&gt;a2enmod proxy&lt;br /&gt;a2enmod proxy_http&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Edit &lt;span class="fileName"&gt;sites-enabled/default&lt;/span&gt; to add your proxying rule, eg: &lt;br /&gt;&lt;span class='fileText'&gt;    ProxyPass /alfresco http://localhost:8080/alfresco&lt;br /&gt;ProxyPassReverse /alfresco http://localhost:8080/alfresco&lt;br /&gt;&amp;lt;Proxy http://localhost:8080/alfresco*&amp;gt;&lt;br /&gt;Order deny,allow&lt;br /&gt;Allow from all&lt;br /&gt;&amp;lt;/Proxy&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;/etc/init.d/apache2 restart&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;You should now see your application server content on your default url ie &lt;a href="http://localhost/alfresco"&gt;http://localhost/alfresco&lt;/a&gt; will contain the same content as &lt;br /&gt;&lt;a href="http://localhost:8080/alfresco"&gt;http://localhost:8080/alfresco&lt;/a&gt;.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-5394220845580005854?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/5394220845580005854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/08/proxying-from-apache2-to-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5394220845580005854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5394220845580005854'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/08/proxying-from-apache2-to-application.html' title='Proxying from apache2 to application server (eg tomcat, jetty)'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1547711224261249207</id><published>2011-08-16T16:34:00.006+01:00</published><updated>2011-09-20T15:52:21.955+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VirtualBox copy and paste shared'/><title type='text'>Alfresco setup</title><content type='html'>Alfresco is AMAZING - it does not follow the Unix way, or even the Java way, but rather the bloatware way. This is a very bad smell (as is their constant pimping of the paid version). &lt;br /&gt;&lt;br /&gt;Alfresco comes with ITS OWN COPY of Java, MySQL and Tomcat. &lt;br /&gt;As I have copies of all these systems on my own box I have chosen to insulate my system and to play fair with Alfreco, and install on a fresh Ubuntu VirtualBox VM, with nothing other than OpenSSH installed. &lt;br /&gt;&lt;br /&gt;VM Setup: I also enabled the VirtualBox Guest Additions, on my MacBookPro host, and found that the default bidirectional Copy/Paste functionality did not work. &lt;br /&gt;Stop the VM and change Settings&gt;&gt;Advanced &lt;em&gt;Shared Clipboards&lt;/em&gt; to &lt;b&gt;Host To Guest&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This vm (called alfresco) is on a virtual network, setup with help from Mr Sysadmin:&lt;br /&gt;&lt;br /&gt;Add a Host only network in &lt;i&gt;virtualbox &gt;&gt; preferences &gt;&gt; network&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Add an adapter2 to vm &gt;&gt; settings &gt;&gt; network &lt;br /&gt;attached to &lt;b&gt;&lt;i&gt;Host-only adapter&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Add to /etc/hosts on host machine&lt;br /&gt;&lt;code&gt;&lt;pre&gt;192.168.56.10 alfresco&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;On vm add to &lt;span class="fileName"&gt;/etc/network/interfaces&lt;/span&gt;&lt;br /&gt;&lt;pre class="fileText"&gt;auto eth1&lt;br /&gt;iface eth1 inet static&lt;br /&gt;        address 192.168.56.10&lt;br /&gt;        netmask 255.255.255.0&lt;br /&gt;&lt;/pre&gt;&lt;code&gt;&lt;pre&gt;/etc/init.d/networking restart&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Install alfresco (NOTE The x32 versions also works)&lt;br /&gt;&lt;code&gt;&lt;pre&gt;wget http://dl.alfresco.com/release/community/build-3370/alfresco-community-3.4.d-installer-linux-x64.bin&lt;br /&gt;sudo su&lt;br /&gt;chmod u+x alfresco-community-3.4.d-installer-linux-x64.bin&lt;br /&gt;./alfresco-community-3.4.d-installer-linux-x64.bin &lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Take defaults, specify a password for mysql root and Alfresco admin.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;/etc/init.d/alfresco start&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now the url &lt;a href="http://alfresco:8080/alfresco/"&gt;http://alfresco:8080/alfresco/&lt;/a&gt; should work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1547711224261249207?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1547711224261249207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/08/alfresco-setup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1547711224261249207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1547711224261249207'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/08/alfresco-setup.html' title='Alfresco setup'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1210957280024040316</id><published>2011-08-15T15:24:00.008+01:00</published><updated>2011-08-18T15:36:43.852+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git svn subversion'/><title type='text'>Dual repositories: Subversion and  Git</title><content type='html'>&lt;h3&gt;Git and SVN&lt;/h3&gt;I have not got a completely pain free git/svn integration,&lt;br /&gt;this seems to be because &lt;a href="https://github.com/timp21337/casutils"&gt;casutils&lt;/a&gt; started life as a git project.&lt;br /&gt;&lt;br /&gt;Install git svn integration&lt;br /&gt;&lt;code&gt;&lt;pre&gt;sudo apt-get install git-core git-svn&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;I have two checkouts: local/casutils and workspace/casutils&lt;br /&gt;workspace/casutils was created in the normal way with&lt;br /&gt;&lt;code&gt;&lt;pre&gt;git init casutils&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;local/casutils was created with&lt;br /&gt;&lt;code&gt;&lt;pre&gt;git svn clone https://tim.pizey@dsn-chassis.googlecode.com/svn/trunk/casutils&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;I work in workspace/casutils, when all is committed and pushed to master I switch to local/casutils&lt;br /&gt;&lt;code&gt;&lt;pre&gt;git pull -s recursive -Xtheirs ../../workspace/casutils&lt;br /&gt;git svn dcommit&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;this pushes the changes, with their git commit messages, to svn.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1210957280024040316?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1210957280024040316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/08/dual-repositories-subversion-and-git.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1210957280024040316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1210957280024040316'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/08/dual-repositories-subversion-and-git.html' title='Dual repositories: Subversion and  Git'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-6091161849685860058</id><published>2011-06-21T23:03:00.006+01:00</published><updated>2011-08-16T09:44:47.259+01:00</updated><title type='text'>Cretan Opinel</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Jpx2lIZV6L8/TgEWl_f5rAI/AAAAAAAAGfI/lYirGDlwCnU/s1600/IMGP4378.JPG" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-Jpx2lIZV6L8/TgEWl_f5rAI/AAAAAAAAGfI/lYirGDlwCnU/s320/IMGP4378.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;On our holiday to Paleochora, Crete we spent a day on the &lt;a href="http://maps.google.com/maps/ms?msa=0&amp;msid=216878860856967875806.0004a63fe8e67ef9c07b1"&gt;East Beach&lt;/a&gt;. The sun was pretty hot, so we spent a lot of time under a tamarisk tree. I built a little wall. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7bOYrvXn8_E/TgEXM6dFcEI/AAAAAAAAGfQ/o9SoNqXLv38/s1600/penknife_before_IMGP4388.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-7bOYrvXn8_E/TgEXM6dFcEI/AAAAAAAAGfQ/o9SoNqXLv38/s320/penknife_before_IMGP4388.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;On the way back I found an &lt;a href="http://www.opinel.com/"&gt;Opinel&lt;/a&gt; knife&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4MbPfyjzm9o/TgEXdCCDAeI/AAAAAAAAGfY/LjHf7PL0Uao/s1600/opinel_IMGP4524.jpg" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="240" width="320" src="http://3.bp.blogspot.com/-4MbPfyjzm9o/TgEXdCCDAeI/AAAAAAAAGfY/LjHf7PL0Uao/s320/opinel_IMGP4524.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;which has cleaned up quite well. Note the change in the branding: no &lt;strong&gt;France&lt;/strong&gt; and the Main Coron&amp;eacute; has moved. This would indicate that it is quite a few years old. (I could not discover when this change occurred).&lt;br /&gt;&lt;br /&gt;[Thanks to Laurent in the comments: it was made between 1986 and 1990.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-6091161849685860058?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/6091161849685860058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/06/cretan-opinel.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6091161849685860058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6091161849685860058'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/06/cretan-opinel.html' title='Cretan Opinel'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Jpx2lIZV6L8/TgEWl_f5rAI/AAAAAAAAGfI/lYirGDlwCnU/s72-c/IMGP4378.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-2321080941260909090</id><published>2011-06-21T22:44:00.006+01:00</published><updated>2011-07-01T16:29:50.853+01:00</updated><title type='text'>A button from Tom's Farm</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-EPcPAzMWznM/TgESDQVmKMI/AAAAAAAAGe4/qZjJeYhTCkw/s1600/IMGP4523.JPG" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="240" width="320" src="http://3.bp.blogspot.com/-EPcPAzMWznM/TgESDQVmKMI/AAAAAAAAGe4/qZjJeYhTCkw/s320/IMGP4523.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;Really quite a long time ago, maybe sixteen years ago, I went to &lt;a href = "http://maps.google.com/maps/ms?authuser=0&amp;amp;ie=UTF8&amp;amp;hl=en&amp;amp;oe=UTF8&amp;amp;msa=0&amp;amp;msid=216878860856967875806.0004a63fb5bb99e079432&amp;amp;output=html"&gt;Tom's Farm&lt;/a&gt;, on &lt;a href="http://translate.google.com/#cy|en|gwern%20ddu"&gt;Black Alder&lt;/a&gt; Road and walking up the Green Lane found this button. I rediscovered it recently and put it in some silvo, which seemed to show up a bit of silver, now black. &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9-kWx-PEf0c/TgESZ42dtkI/AAAAAAAAGfA/Rf0SzknZQPo/s1600/IMGP4522.JPG" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-9-kWx-PEf0c/TgESZ42dtkI/AAAAAAAAGfA/Rf0SzknZQPo/s320/IMGP4522.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;Will give it back to Tom, can't think why I ever took it away, except perhaps I was younger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-2321080941260909090?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/2321080941260909090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/06/button-from-toms-farm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2321080941260909090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2321080941260909090'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/06/button-from-toms-farm.html' title='A button from Tom&apos;s Farm'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-EPcPAzMWznM/TgESDQVmKMI/AAAAAAAAGe4/qZjJeYhTCkw/s72-c/IMGP4523.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-699793087767685033</id><published>2011-06-09T09:46:00.003+01:00</published><updated>2011-06-09T12:00:13.288+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional java'/><title type='text'>My first functional java class</title><content type='html'>I have known about this particular hammer for ten years. It is a technique widely used in &lt;a href="http://www.melati.org/"&gt;Melati&lt;/a&gt;, as William was mostly 'translating on the fly from OCAML' at the time, however I have never recognised a situation where it was the correct approach. &lt;br /&gt;&lt;br /&gt;To a commercial programmer on the long journey from BASIC to lisp, via perl and java, even when you know of the &lt;em&gt;functional&lt;/em&gt; hammer the world does not appear to have any &lt;em&gt;functional&lt;/em&gt; nails in it. &lt;br /&gt;&lt;br /&gt;Last night I did recognise such a situation. I wanted to reuse a bit of code: &lt;br /&gt;&lt;code&gt;&lt;pre&gt;if (lock()) {&lt;br /&gt;  try {&lt;br /&gt;    body();&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;    throw new RuntimeException(e); &lt;br /&gt;  } finally {&lt;br /&gt;    unlock();&lt;br /&gt;  }&lt;br /&gt;} else {&lt;br /&gt;  throw new RuntimeException("Lock file " + LOCK_FILE_NAME + " exists.");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;The only way to reuse this, for a &lt;tt&gt;body2()&lt;/tt&gt; function, would have been to cut'n'paste, which I will go to some lengths to avoid. &lt;br /&gt;&lt;br /&gt;I extracted this to its own abstract class &lt;tt&gt;ExclusiveFunction&lt;/tt&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;import java.io.File;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author timp&lt;br /&gt; * @since 2011/06/07 22:00:01&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public abstract class ExclusiveFunction {&lt;br /&gt;  final static String LOCK_FILE_NAME = "/tmp/EXCLUSIVE_LOCK";&lt;br /&gt;&lt;br /&gt;  abstract void body() throws Exception;&lt;br /&gt;  &lt;br /&gt;  public void invoke() { &lt;br /&gt;    if (lock()) {&lt;br /&gt;      try {&lt;br /&gt;        body();&lt;br /&gt;      } catch (Exception e) {&lt;br /&gt;        throw new RuntimeException(e); &lt;br /&gt;      } finally {&lt;br /&gt;        unlock();&lt;br /&gt;      }&lt;br /&gt;    } else {&lt;br /&gt;      throw new RuntimeException("Lock file " + LOCK_FILE_NAME + " exists.");&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private boolean lock() {&lt;br /&gt;    File lockFile = new File(LOCK_FILE_NAME);&lt;br /&gt;    if (!lockFile.exists()) {&lt;br /&gt;      try {&lt;br /&gt;        lockFile.createNewFile();&lt;br /&gt;      } catch (IOException e) {&lt;br /&gt;        throw new RuntimeException(e);&lt;br /&gt;      }&lt;br /&gt;      return true;&lt;br /&gt;    }&lt;br /&gt;    return false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void unlock() {&lt;br /&gt;    new File(LOCK_FILE_NAME).delete();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;which is then invoked with:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;new ExclusiveFunction() {&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      void body() throws IOException {&lt;br /&gt;        body2();&lt;br /&gt;      }&lt;br /&gt;    }.invoke();&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I think the world is soon going to appear to have a lot more nails in it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-699793087767685033?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/699793087767685033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/06/my-first-functional-java-class.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/699793087767685033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/699793087767685033'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/06/my-first-functional-java-class.html' title='My first functional java class'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-8106968400390456353</id><published>2011-04-14T23:30:00.002+01:00</published><updated>2011-04-14T23:34:13.933+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala java'/><title type='text'>Scala and Java</title><content type='html'>HelloWorldScala.scala&lt;br /&gt;&lt;code&gt;&lt;pre&gt;package net.pizey.scala.toy&lt;br /&gt;&lt;br /&gt;class HelloWorldScala {&lt;br /&gt;  def m(message: String) {&lt;br /&gt;    println(message + " - from scala")&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;object HellowWorld {&lt;br /&gt;  def main(args: Array[String]) {&lt;br /&gt;    val s = new HelloWorldScala()&lt;br /&gt;    val j = new HelloWorldJava()&lt;br /&gt;    s.m("Hello world")&lt;br /&gt;    j.m("Hello world")&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;HelloWorldJava.java&lt;br /&gt;&lt;code&gt;&lt;pre&gt;package net.pizey.scala.toy;&lt;br /&gt;&lt;br /&gt;public class HelloWorldJava {&lt;br /&gt;&lt;br /&gt;  public void m(String message) {&lt;br /&gt;    System.out.println(message + " - from java");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    HelloWorldScala s = new HelloWorldScala();&lt;br /&gt;    HelloWorldJava j = new HelloWorldJava();&lt;br /&gt;    s.m("Hello world");&lt;br /&gt;    j.m("Hello World");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Both output&lt;br /&gt;&lt;code&gt;&lt;pre&gt;Hello world - from scala&lt;br /&gt;Hello World - from java&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-8106968400390456353?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/8106968400390456353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/04/scala-and-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8106968400390456353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8106968400390456353'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/04/scala-and-java.html' title='Scala and Java'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-763287210614972367</id><published>2011-03-14T20:30:00.004Z</published><updated>2011-03-14T21:18:52.392Z</updated><title type='text'>Ubuntu setup</title><content type='html'>&lt;pre&gt;&lt;code&gt;&lt;br /&gt;apt-get install emacs23-nox&lt;br /&gt;apt-get install cvs&lt;br /&gt;apt-get install git-base&lt;br /&gt;&lt;br /&gt;#setup apt-get &lt;br /&gt;&lt;br /&gt;deb http://switch.dl.sourceforge.net/project/jedit /&lt;br /&gt;&lt;br /&gt;apt-get install jedit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;&lt;br /&gt;emacs /etc/apt/sources.list&lt;br /&gt;&lt;br /&gt;# Google software repository&lt;br /&gt;deb http://dl.google.com/linux/deb/ stable non-free main&lt;br /&gt;&lt;br /&gt;apt-get install google-chrome-unstable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;cvs -d :ext:timp@paneris.net:/usr/cvsroot co timp&lt;br /&gt;mv timp/.* .&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-763287210614972367?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/763287210614972367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/03/ubuntu-setup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/763287210614972367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/763287210614972367'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/03/ubuntu-setup.html' title='Ubuntu setup'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-5189111965783298283</id><published>2011-03-01T14:50:00.002Z</published><updated>2011-03-01T14:50:59.062Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='R package installation'/><title type='text'>Installing packages in R</title><content type='html'>&lt;pre&gt;&lt;code&gt;&lt;br /&gt;sudo R&lt;br /&gt;install.packages('Rcmdr')&lt;br /&gt;q()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-5189111965783298283?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/5189111965783298283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/03/installing-packages-in-r.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5189111965783298283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5189111965783298283'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/03/installing-packages-in-r.html' title='Installing packages in R'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1093665533183250612</id><published>2011-02-28T11:36:00.001Z</published><updated>2011-02-28T11:36:51.406Z</updated><title type='text'>Dropbox setup for work and home</title><content type='html'>I instinctively created two Dropbox accounts, but soon found that Dropbox expects you only to have one Dropbox account per user account.&lt;br /&gt;&lt;br /&gt;Googling revealed this &lt;a href="http://forums.dropbox.com/topic.php?id=13725"&gt;setup for work and personal Dropbox files&lt;/a&gt; from Samuel D. : &lt;br /&gt;&lt;blockquote&gt;My solution is to have a paid personal account with all the storage I need, and a free work account. The entire contents of my work account are shared with the personal account. I just have my work account set up on my work computer, and my personal one on my personal computer.&lt;br /&gt;&lt;br /&gt;This means I can&lt;br /&gt;- Access all my work and personal files on my personal computer&lt;br /&gt;- Access ONLY my work files on my work computer, and even if the system admin figured out the password they would only have access to my work data, not my personal stuff.&lt;br /&gt;&lt;br /&gt;Everything syncs fluidly between both computers, I don't have to unlink and relink Dropbox as I only have one account set up with each computer. This works very well. &lt;br /&gt;&lt;/blockquote&gt;looks like this is the way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1093665533183250612?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1093665533183250612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/dropbox-setup-for-work-and-home.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1093665533183250612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1093665533183250612'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/dropbox-setup-for-work-and-home.html' title='Dropbox setup for work and home'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1952670272942585313</id><published>2011-02-23T16:25:00.003Z</published><updated>2011-02-24T10:07:32.701Z</updated><title type='text'>Window 7 Setup</title><content type='html'>A new Windows 7 machine is setup by work admin team to have Endnote, VPN and Anti-Virus installed. Oh and Microsoft Visual Studio 2005.&lt;br /&gt;&lt;h3&gt;Installation list&lt;/h3&gt;The following are my list of initial installs.&lt;br /&gt;&lt;br /&gt;Firefox&lt;br /&gt;Chrome&lt;br /&gt;VirtualBox&lt;br /&gt;&lt;h4&gt;Cygwin&lt;/h4&gt;&lt;p style="margin-left:6em"&gt;zip&lt;br /&gt;unzip&lt;br /&gt;CVS&lt;br /&gt;git&lt;br /&gt;git-completion&lt;br /&gt;git-gui&lt;br /&gt;gitk&lt;br /&gt;make&lt;br /&gt;ocaml*&lt;br /&gt;svn&lt;br /&gt;emacs&lt;br /&gt;nano&lt;br /&gt;vim&lt;br /&gt;graphicsmagick&lt;br /&gt;imagemagick&lt;br /&gt;clisp&lt;br /&gt;python&lt;br /&gt;ruby&lt;br /&gt;openssl&lt;br /&gt;openssh&lt;br /&gt;rsynch&lt;br /&gt;perl&lt;br /&gt;lyx&lt;br /&gt;tetex&lt;br /&gt;chere&lt;br /&gt;catdoc&lt;br /&gt;lynx&lt;br /&gt;wget&lt;br /&gt;&lt;/p&gt;java - set JAVA_HOME&lt;br /&gt;jEdit&lt;br /&gt;quassel&lt;br /&gt;maven - set M2_HOME&lt;br /&gt;WinMerge&lt;br /&gt;IntelliJ&lt;br /&gt;checkout all projects&lt;br /&gt;Eclipse&lt;br /&gt;Spotify&lt;br /&gt;Dropbox&lt;br /&gt;Visual Studio 2010 Professional &lt;br /&gt;7-zip&lt;br /&gt;git&lt;br /&gt;R&lt;br /&gt;TortoiseSVN&lt;br /&gt;Skype&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;TODO&lt;/h4&gt;SPSS&lt;br /&gt;Stata&lt;br /&gt;StatTransfer&lt;br /&gt;Talend&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1952670272942585313?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1952670272942585313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/window-7-setup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1952670272942585313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1952670272942585313'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/window-7-setup.html' title='Window 7 Setup'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-2341980970469722294</id><published>2011-02-17T17:50:00.011Z</published><updated>2011-02-17T21:30:34.134Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='R bash parameters arguments'/><title type='text'>rrun - a bash R wrapper</title><content type='html'>&lt;h4&gt;&lt;a href="https://github.com/timp21337/rrun"&gt;&lt;tt&gt;rrun&lt;/tt&gt;&lt;/a&gt; - A script to wrap around R, passing some variables.&lt;/h4&gt;First some motivation, what is the problem?&lt;br /&gt;&lt;br /&gt;The default command line interface for R is a bit idiosyncratic, and there are no defaults:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;~$ R&lt;br /&gt;Fatal error: you must specify '--save', '--no-save' or '-vanilla'&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;someone went out of their way to deliberately make it behave that way! This is a language which is taking no prisoners.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;~/r$ r --help&lt;br /&gt;Usage: C:\Program Files\R\R-2.12.1\bin\r.exe [command args]&lt;br /&gt;&lt;br /&gt;where 'command args' can be&lt;br /&gt;&lt;br /&gt;  --arch n   for n=i386, x64, 32 or 64&lt;br /&gt;  any other arguments listed by C:\Program Files\R\R-2.12.1\bin\r.exe --arch i386 --help&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Its rude to point and stare!&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;~$ r --arch i386 --help&lt;br /&gt;Usage: Rterm [options] [&amp;lt; infile] [&amp;gt; outfile] [EnvVars]&lt;br /&gt;&lt;br /&gt;Start R, a system for statistical computation and graphics, with the&lt;br /&gt;specified options&lt;br /&gt;&lt;br /&gt;EnvVars: Environmental variables can be set by NAME=value strings&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;  -h, --help            Print usage message and exit&lt;br /&gt;  --version             Print version info and exit&lt;br /&gt;  --encoding=enc        Specify encoding to be used for stdin&lt;br /&gt;  --encoding enc        ditto&lt;br /&gt;  --save                Do save workspace at the end of the session&lt;br /&gt;  --no-save             Don't save it&lt;br /&gt;  --no-environ          Don't read the site and user environment files&lt;br /&gt;  --no-site-file        Don't read the site-wide Rprofile&lt;br /&gt;  --no-init-file        Don't read the .Rprofile or ~/.Rprofile files&lt;br /&gt;  --restore             Do restore previously saved objects at startup&lt;br /&gt;  --no-restore-data     Don't restore previously saved objects&lt;br /&gt;  --no-restore-history  Don't restore the R history file&lt;br /&gt;  --no-restore          Don't restore anything&lt;br /&gt;  --vanilla             Combine --no-save, --no-restore, --no-site-file,&lt;br /&gt;                          --no-init-file and --no-environ&lt;br /&gt;  --min-vsize=N         Set vector heap min to N bytes; '4M' = 4 MegaB&lt;br /&gt;  --max-vsize=N         Set vector heap max to N bytes;&lt;br /&gt;  --min-nsize=N         Set min number of cons cells to N&lt;br /&gt;  --max-nsize=N         Set max number of cons cells to N&lt;br /&gt;  --max-mem-size=N      Set limit for memory to be used by R&lt;br /&gt;  --max-ppsize=N        Set max size of protect stack to N&lt;br /&gt;  -q, --quiet           Don't print startup message&lt;br /&gt;  --silent              Same as --quiet&lt;br /&gt;  --slave               Make R run as quietly as possible&lt;br /&gt;  --verbose             Print more information about progress&lt;br /&gt;  --internet2           Use Internet Explorer for proxies etc.&lt;br /&gt;  --args                Skip the rest of the command line&lt;br /&gt;  --ess                 Don't use getline for command-line editing&lt;br /&gt;                          and assert interactive use&lt;br /&gt;  -f file               Take input from 'file'&lt;br /&gt;  --file=file           ditto&lt;br /&gt;  -e expression         Use 'expression' as input&lt;br /&gt;&lt;br /&gt;One or more -e options can be used, but not together with -f or --file&lt;br /&gt;&lt;br /&gt;An argument ending in .RData (in any case) is taken as the path&lt;br /&gt;to the workspace to be restored (and implies --restore)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Or: R CMD command args&lt;br /&gt;&lt;br /&gt;where 'command' is one of:&lt;br /&gt;  INSTALL  Install add-on packages&lt;br /&gt;  REMOVE   Remove add-on packages&lt;br /&gt;  SHLIB    Make a DLL for use with dynload&lt;br /&gt;  BATCH    Run R in batch mode&lt;br /&gt;  build    Build add-on packages&lt;br /&gt;  check    Check add-on packages&lt;br /&gt;  Rprof    Post process R profiling files&lt;br /&gt;  Rdconv   Convert Rd format to various other formats&lt;br /&gt;  Rdiff    difference R output files&lt;br /&gt;  Rd2dvi   Convert Rd format to DVI&lt;br /&gt;  Rd2pdf   Convert Rd format to PDF&lt;br /&gt;  Rd2txt   Convert Rd format to pretty text&lt;br /&gt;  Sd2Rd    Convert S documentation to Rd format&lt;br /&gt;  Stangle  Extract S/R code from Sweave documentation&lt;br /&gt;  Sweave   Process Sweave documentation&lt;br /&gt;  config   Obtain configuration information about R&lt;br /&gt;  open     Open a file via Windows file associations&lt;br /&gt;  texify   Process a latex file&lt;br /&gt;&lt;br /&gt;Use&lt;br /&gt;  R CMD command --help&lt;br /&gt;for usage information for each command.&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;I think we may need some help here.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;A simple interface&lt;/h4&gt;&lt;a href="https://github.com/timp21337/rrun"&gt;&lt;tt&gt;rrun&lt;/tt&gt;&lt;/a&gt; is intended to simplify the above, or at least be a handy place for my defaults and to enable me to pass parameters to R in addition to an input file of R commands.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;sorry about the escaping&lt;/strong&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;rrun s=\"nice\" f=1 s.R&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Where &lt;tt&gt;s.R&lt;/tt&gt; contains&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;print(s)&lt;br /&gt;print(f)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;The result:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;~/r$ rrun s=\"nice\" f=1 ls.R&lt;br /&gt;&gt; # Temporary file generated by rrun&lt;br /&gt;&gt; # Date: Thu Feb 17 21:11:26 GMTST 2011&lt;br /&gt;&gt; # Command: rrun s="nice" f=1 ls.R&lt;br /&gt;&gt; #&lt;br /&gt;&gt; s="nice"&lt;br /&gt;&gt; f=1&lt;br /&gt;&gt; print(s)&lt;br /&gt;[1] "nice"&lt;br /&gt;&gt; print(f)&lt;br /&gt;[1] 1&lt;br /&gt;&gt; warnings()&lt;br /&gt;NULL&lt;br /&gt;&gt;&lt;br /&gt;~/r$&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-2341980970469722294?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/2341980970469722294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/rrun-bash-r-wrapper.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2341980970469722294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2341980970469722294'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/rrun-bash-r-wrapper.html' title='rrun - a bash R wrapper'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-8426445498584703074</id><published>2011-02-16T15:18:00.009Z</published><updated>2011-02-17T17:20:15.368Z</updated><title type='text'>Gygwin setup for Debianistas</title><content type='html'>&lt;em&gt;An on-going log of the tweeks needed to make Cygwin more intuitive to those of use who use Debian based systems when given a choice. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;cygwin&lt;/tt&gt; is not &lt;tt&gt;Ubuntu&lt;/tt&gt;, you may have noticed :)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Allow customisation&lt;/h3&gt;To end of &lt;tt&gt;/etc/profile&lt;/tt&gt; add&lt;br /&gt;&lt;code&gt;&lt;br /&gt;. $HOME/.bashrc&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;h3&gt;A little welcome&lt;/h3&gt;Add to your &lt;tt&gt;.bashrc&lt;/tt&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if [[ $(uname -o) == Cygwin ]] &lt;br /&gt;then&lt;br /&gt;echo "Usable Windows"&lt;br /&gt;echo `uname -a`&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;h3&gt;Simplicity rules&lt;/h3&gt;To the Cygwin specific block created above add &lt;br /&gt;&lt;code&gt;&lt;br /&gt;alias more=less&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-8426445498584703074?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/8426445498584703074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/gygwin-setup-for-debianistas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8426445498584703074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8426445498584703074'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2011/02/gygwin-setup-for-debianistas.html' title='Gygwin setup for Debianistas'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-6580228503007363430</id><published>2010-12-12T20:37:00.001Z</published><updated>2011-08-17T13:28:27.139+01:00</updated><title type='text'>Blogging cooking</title><content type='html'>Now blogging my cooking at &lt;a href="http://weekend-chef.blogspot.com/"&gt;http://weekend-chef.blogspot.com/&lt;/a&gt; as I could not remember how I last cooked duck. &lt;br /&gt;&lt;br /&gt;I blog as I cook, which brings the stress of cooking to a head, but should bring a little more planning and structure to future meals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-6580228503007363430?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/6580228503007363430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2010/12/blogging-cooking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6580228503007363430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6580228503007363430'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2010/12/blogging-cooking.html' title='Blogging cooking'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-6074030474573931323</id><published>2010-12-03T16:48:00.006Z</published><updated>2010-12-03T17:13:38.103Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='googlecode hudson postcommitwebhook trigger'/><title type='text'>A Trigger Servlet for Hudson</title><content type='html'>Have written a little &lt;a href="http://hudson-trigger.googlecode.com"&gt;Trigger Servlet&lt;/a&gt; for &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt;, to enable post commit builds on Google Code projects.&lt;br /&gt;&lt;br /&gt;By relying upon a shared secret, it enables pre-authentication of the trigger url; which should only be visible to someone with administrator access to the Hudson job and &lt;br /&gt;administrator access to the triggering site, for example the Google Code Administer Source page. &lt;br /&gt;&lt;br /&gt;Managed to hit &lt;a href="http://hudson.paneris.net/job/hudson-trigger/site/cobertura/index.html"&gt;100% line and branch coverage&lt;/a&gt; Yay!.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-6074030474573931323?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/6074030474573931323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2010/12/trigger-servlet-for-hudson.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6074030474573931323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/6074030474573931323'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2010/12/trigger-servlet-for-hudson.html' title='A Trigger Servlet for Hudson'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-2765497536433244677</id><published>2010-11-23T15:00:00.035Z</published><updated>2011-08-18T19:39:00.154+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSV unification java cobertura coverage generic interfaces enum hashcode'/><title type='text'>CSV unification</title><content type='html'>&lt;h4&gt;&lt;a href="https://github.com/timp21337/unifier/"&gt;Unifier on GitHub&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;&lt;h4&gt;A simple problem&lt;/h4&gt;Given an excel spreadsheet with three sheets within it, all with approximately the same rows  but with differing columns, produce a unified CSV file. If a sheet does not contain a row then insert blank columns. The unique key for each sheet is column 2, called ID, move this column to column 1. No doubt you can see all the issues, as I can in retrospect, but after a week and a bit the job is done. &lt;a href="http://jenkins.paneris.net/job/unifier/site/cobertura/index.html"&gt;High test coverage&lt;/a&gt; enabled me to refactor and add features through to a completely different beast.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Lessons learned&lt;/h3&gt;&lt;h4&gt;hashcode() for enum constants&lt;/h4&gt;The members of an &lt;tt&gt;enum&lt;/tt&gt; inherit their &lt;tt&gt;hashCode()&lt;/tt&gt; method from &lt;tt&gt;Object&lt;/tt&gt; so it varies between JVM invocations. Hence I used &lt;br /&gt;&lt;pre class="fileText"&gt;result = prime * result + unificationOption.ordinal();&lt;/pre&gt;in &lt;tt&gt;CsvTable.hashCode()&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Bridging methods&lt;/h4&gt;During the compilation of generic code Java quietly generates what are called &lt;a href="http://codeidol.com/java/javagenerics/Comparison-and-Bounds/Bridges/"&gt;bridging methods&lt;/a&gt; these are visible to Cobertura but not to you, the coder, so &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=2015158&amp;group_id=130558&amp;atid=720015"&gt;Cobertura tries to tell you&lt;/a&gt; that you have not exercised these methods by marking the class definition line as not covered. Using the following code to print out all methods &lt;br /&gt;&lt;pre class="fileText"&gt;for (Method m : CsvTable.class.getMethods()) {&lt;br /&gt;  System.out.println(m.toGenericString());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;I discovered the &lt;font color="green"&gt;generated bridging methods&lt;/font&gt;&lt;br /&gt;&lt;pre class="fileText"&gt;public net.pizey.csv.CsvRecord get(java.lang.Object)&lt;br /&gt;&lt;font color="green"&gt;public java.lang.Object get(java.lang.Object)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;public net.pizey.csv.CsvRecord put(java.lang.String,net.pizey.csv.CsvRecord)&lt;br /&gt;&lt;font color="green"&gt;public java.lang.Object put(java.lang.Object,java.lang.Object)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;public net.pizey.csv.CsvRecord remove(java.lang.Object)&lt;br /&gt;&lt;font color="green"&gt;public java.lang.Object remove(java.lang.Object)&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;The &lt;tt&gt;put(Object key, Object value)&lt;/tt&gt; cannot be accessed normally, as it is masked by the generic version. So we have to introduce a reflective mechanism of invoking it. &lt;br /&gt;&lt;pre class="fileText"&gt;public void testBridgingPut() {&lt;br /&gt;  CsvTable t = new CsvTable("src/test/resources/sheet2.csv", UnificationOptions.LOG);&lt;br /&gt;  Object o = t.get((Object) "1");&lt;br /&gt;  Method method = t.getClass().getMethod("put", new Class[] { Object.class, Object.class });&lt;br /&gt;  method.invoke(t, "jj", o);&lt;br /&gt;}&lt;/pre&gt;Finally I had to deal with the generated bridging methods for clone. This is done by not supplying a generic clone method but using the pre-generics signature.&lt;br /&gt;&lt;br /&gt;I have come to enjoy Java6 however &lt;em&gt;Generics&lt;/em&gt; do feel like an expensive compromise.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Tools and sources&lt;/h4&gt;The CSV parser was written by WilliamC and incorporated in a CSV importer in 2000 by MylesC. I started from that framework, but as it was written before Java Collections, let alone Java 6, not a lot remains of the original. &lt;br /&gt;The tools used: &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;, &lt;a href="http://infradna.com/"&gt;Hudson CI&lt;/a&gt;, &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;, &lt;a href="http://eclipse.org/"&gt;Eclipse&lt;/a&gt; and &lt;a href="http://cobertura.sourceforge.net/"&gt;Cobertura&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Sharing and Deployment&lt;/h4&gt;The code is at &lt;a href="https://github.com/timp21337/unifier"&gt;https://github.com/timp21337/unifier&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To include the jar in Maven: &lt;br /&gt;&lt;pre class='fileText'&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;net.pizey.csv&amp;gt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;unifier&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;Deployed to a Maven repository at &lt;a href="http://pizey.net/maven2/"&gt;http://pizey.net/maven2/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-2765497536433244677?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/2765497536433244677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2010/11/csv-unification.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2765497536433244677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2765497536433244677'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2010/11/csv-unification.html' title='CSV unification'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-5711079849496281548</id><published>2010-10-05T12:50:00.018+01:00</published><updated>2011-08-17T14:11:17.312+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java gwt virtual framebuffer'/><title type='text'>Adding a framebuffer to a headless unix server</title><content type='html'>&lt;p&gt;&lt;br /&gt;Some java software, including GWT, expects a framebuffer to be present.&lt;br /&gt;This post shows how to install Xvfb (X virtual Frame Buffer) on a Ubuntu/Debian system. This assumes that you do not currently have an X server running (it is a headless server).&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;apt-get install xvfb xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;(the fonts are not needed but their absense is warned about)&lt;br /&gt;Place the following in &lt;span class='fileName'&gt;/etc/init.d/xvfb&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;echo "Starting virtual X frame buffer: Xvfb"&lt;br /&gt;&lt;br /&gt;/usr/bin/Xvfb :0 \&lt;br /&gt;-auth /etc/X99.cfg -screen 0 1024x768x24 \&lt;br /&gt;-fbdir /var/lib/xvfb \&lt;br /&gt;-extension RANDR &amp;amp;&lt;br /&gt;&lt;br /&gt;export  DISPLAY=:0&lt;br /&gt;&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;echo "Stopping virtual X frame buffer: Xvfb"&lt;br /&gt;echo "noop"&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo "Usage: /etc/init.d/xvfb {start|stop}"&lt;br /&gt;exit 1&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;then &lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;chmod u+x /etc/init.d/xvfb &lt;br /&gt;echo localhost &gt; /etc/X99.cfg&lt;br /&gt;mkdir /var/lib/xvfb&lt;br /&gt;/etc/init.d/xvfb start&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;should be good to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-5711079849496281548?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/5711079849496281548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2010/10/adding-framebuffer-to-headless-unix.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5711079849496281548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5711079849496281548'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2010/10/adding-framebuffer-to-headless-unix.html' title='Adding a framebuffer to a headless unix server'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-7911211557133249661</id><published>2010-07-01T12:27:00.018+01:00</published><updated>2011-08-17T14:14:32.000+01:00</updated><title type='text'>Using both Http-basic and session based form-login authorisation in Spring Security with wget (--auth-no-challenge)</title><content type='html'>We recently changed our &lt;a href="http://static.springsource.org/spring-security"&gt;Spring Security&lt;/a&gt; configuration from http-basic to form-login, well actually we used &lt;br /&gt;&lt;pre&gt;&amp;lt;http &lt;br /&gt;auto-config="true" &amp;gt;&lt;br /&gt;&lt;/pre&gt;which is shorthand for &lt;br /&gt;&lt;pre&gt;&amp;lt;http&amp;gt;&lt;br /&gt;&amp;lt;intercept-url pattern="/**" access="ROLE_USER" /&amp;gt;&lt;br /&gt;&amp;lt;form-login /&amp;gt;&lt;br /&gt;&amp;lt;anonymous /&amp;gt;&lt;br /&gt;&amp;lt;http-basic /&amp;gt;&lt;br /&gt;&amp;lt;logout /&amp;gt;&lt;br /&gt;&amp;lt;remember-me /&amp;gt;&lt;br /&gt;&amp;lt;/http&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The above, and the rest of the &lt;a href="http://static.springsource.org/spring-security/site/docs/2.0.x/reference/ns-config.html"&gt;documentation&lt;/a&gt; suggests that both http-basic and form-login should work simultaneously. However my &lt;tt&gt;wget&lt;/tt&gt; script broke on the change over. The &lt;tt&gt;wget&lt;/tt&gt; command was &lt;br /&gt;&lt;pre&gt;&lt;code&gt;wget  --user=foo@example.org --password=bar --post-data="" \&lt;br /&gt;-d http://localhost/protectedUrl &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This got redirected to the forms login page, as though the authorisation header was being ignored. However &lt;a href="http://alimanfoo.wordpress.com/"&gt;alimanfoo&lt;/a&gt; was able to use authenticated requests from java to access the protected urls. &lt;br /&gt;&lt;br /&gt;Further research revealed that &lt;tt&gt;wget&lt;/tt&gt; only issues authorisation headers in response to a challenge, unless the &lt;tt&gt;--auth-no-challenge&lt;/tt&gt; qualifier is added. &lt;br /&gt;&lt;pre&gt;&lt;code&gt;wget  --user=foo@example.org --password=bar --post-data="" \&lt;br /&gt;--auth-no-challenge -d http://localhost/protectedUrl &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;You might have thought that supplying username and password meant that you wanted to set them, and this was the behaviour of &lt;tt&gt;wget&lt;/tt&gt; 1.10.2 and prior but no longer. &lt;br /&gt;&lt;br /&gt;In fluent manpage we get: &lt;br /&gt;&lt;pre&gt;&lt;code&gt;Use of this option is not recommended, and is intended only to&lt;br /&gt;support some few obscure servers, which never send HTTP&lt;br /&gt;authentication challenges, but accept unsolicited auth info, say,&lt;br /&gt;in addition to form-based authentication.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;So I am off to explain the use-case to the &lt;a href="http://lists.gnu.org/archive/html/bug-wget/2010-07/msg00000.html"&gt;maintainer list&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-7911211557133249661?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/7911211557133249661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2010/07/using-both-http-basic-and-session-based.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7911211557133249661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7911211557133249661'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2010/07/using-both-http-basic-and-session-based.html' title='Using both Http-basic and session based form-login authorisation in Spring Security with wget (--auth-no-challenge)'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-8802870562339045469</id><published>2010-05-25T15:05:00.008+01:00</published><updated>2011-08-17T14:30:55.379+01:00</updated><title type='text'>Android fonts for Debian/Ubuntu</title><content type='html'>I first came across the mention of the free, Open Source, Android fonts a while ago; &lt;a href='http://eeepc.net/get-the-android-font-on-your-netbook/'&gt;here&lt;/a&gt;, I think. &lt;br /&gt;They are clean and easy on the eye.&lt;br /&gt;&lt;br /&gt;You can install them with &lt;br /&gt;&lt;pre&gt;&lt;code&gt;sudo apt-get install ttf-droid &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;which will place fonts in &lt;tt class="fileName"&gt;/usr/share/fonts/truetype/ttf-droid&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;However if all you want is to use a droid font in a web page just use &lt;br /&gt;&lt;pre class="fileText"&gt;&amp;lt;link href='http://fonts.googleapis.com/css?family=Droid+Sans' &lt;br /&gt;rel='stylesheet' type='text/css'&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-8802870562339045469?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/8802870562339045469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2010/05/android-fonts-for-debianubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8802870562339045469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8802870562339045469'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2010/05/android-fonts-for-debianubuntu.html' title='Android fonts for Debian/Ubuntu'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1814386090610174106</id><published>2010-02-21T16:39:00.010Z</published><updated>2010-02-22T14:18:14.476Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebMacro'/><category scheme='http://www.blogger.com/atom/ns#' term='java.util.concurrent'/><category scheme='http://www.blogger.com/atom/ns#' term='Brian Goetz'/><category scheme='http://www.blogger.com/atom/ns#' term='Doug Lea'/><category scheme='http://www.blogger.com/atom/ns#' term='replacing concurrent.jar'/><category scheme='http://www.blogger.com/atom/ns#' term='java 1.5'/><title type='text'>Bringing WebMacro up for air</title><content type='html'>&lt;a href="http://webmacro.sourceforge.net"&gt;WebMacro&lt;/a&gt; was the first OpenSource community that I followed, so I love it and still feel a sense of hurt that licensing issues meant that &lt;a href="http://velocity.apache.org/"&gt;Velocity&lt;/a&gt; had to be born. &lt;br /&gt;&lt;br /&gt;On top of that I have quite a few WebMacro templates around, and anyway the world needs more than one templating engine. &lt;br /&gt;&lt;br /&gt;However, WebMacro went the way of all flesh: The original author moved on, the push to version 1.0 was slow, and I for one stopped following every thread. Versioning was a real mess; (which was more recent 1.0b or 1.0?) Then came the painful, acrid push to 2.0. &lt;br /&gt;&lt;br /&gt;I have revisited a few times, cleaning the code of warnings, ensuring tests continue to pass, even regenerating with new versions of &lt;a hef="https://javacc.dev.java.net/"&gt;javacc&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;However what was really needed was a restructuring of the source tree to align with Maven conventions and a thorough cleanout. &lt;br /&gt;&lt;br /&gt;The only way to do that used to be to backup the CVS tree, restructure and then ask a SF admin to recreate the repository, which was too big a hurdle. &lt;br /&gt;&lt;br /&gt;Recently (well some time in the last ten years) SF have introduced &lt;tt&gt;adminrepo&lt;/tt&gt;, which enables you to lock a repository, restructure it and then replace: &lt;br /&gt;&lt;code&gt;&lt;br /&gt;ssh -t timp,webmacro@shell.sourceforge.net create&lt;br /&gt;adminrepo --checkout  cvs&lt;br /&gt;cd /cvsroot/webmacro/webmacro&lt;br /&gt;mkdir src/main&lt;br /&gt;mkdir src/main/java&lt;br /&gt;mv src/org src/main/java&lt;br /&gt;cd ~&lt;br /&gt;adminrepo --save  cvs&lt;br /&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;By this means I was able to move current code into the places Maven expects them and move non-core code out to &lt;tt&gt;../contrib&lt;/tt&gt;. &lt;br /&gt;&lt;br /&gt;Then I upgraded from Doug Lea's venerable &lt;a href="http://g.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"&gt;Concurrent&lt;/a&gt; to his &lt;tt&gt;java.util.concurrent&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;Thanks to a message from &lt;a href="http://www.briangoetz.com/"&gt;Brian Goetz&lt;/a&gt; himself I was able to surmount the only real hickup: &lt;tt&gt;EDU.oswego.cs.dl.util.concurrent.ClockDaemon&lt;/tt&gt; becomes &lt;tt&gt;java.util.concurrent.ScheduledExecutorService&lt;/tt&gt;.&lt;br /&gt; &lt;br /&gt;Now WebMacro had only one compile-time dependency: the logging system. On inspection it seems that WebMacro's own logging (yes its has a complete logging system built in) should be ripped out in favour of &lt;a href="http://www.slf4j.org"&gt;slf4j&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;WebMacro 2.2 should be back in the swim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1814386090610174106?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1814386090610174106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2010/02/bringing-webmacro-up-for-air.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1814386090610174106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1814386090610174106'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2010/02/bringing-webmacro-up-for-air.html' title='Bringing WebMacro up for air'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-4493611312430852010</id><published>2009-12-17T12:17:00.001Z</published><updated>2011-08-17T14:32:24.843+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='cargo'/><category scheme='http://www.blogger.com/atom/ns#' term='Hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;Out of memory error&quot;'/><title type='text'>Deploying large war files to Tomcat under Hudson: use Cargo</title><content type='html'>Whilst &lt;pre&gt;&lt;code&gt;mvn tomcat:deploy&lt;/code&gt;&lt;/pre&gt;works for the majority of war files under Hudson, for a large war (34m) the deploy failed with &lt;b&gt;Out of memory error&lt;/b&gt;, though not at the shell prompt. Failure to fix by tweeking memory arguments led me to use Cargo instead. Note that the local tomcat is treated as remote to reduce rework when deploying to a remote server.&lt;br /&gt;&lt;pre class="fileText"&gt;&amp;lt;build&amp;gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.codehaus.cargo&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;cargo-maven2-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;wait&amp;gt;true&amp;lt;/wait&amp;gt;&lt;br /&gt;&amp;lt;container&amp;gt;&lt;br /&gt;&amp;lt;containerId&amp;gt;tomcat6x&amp;lt;/containerId&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;remote&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;/container&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;runtime&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;&amp;lt;cargo.tomcat.manager.url&amp;gt;http://localhost:8080/manager&amp;lt;/cargo.tomcat.manager.url&amp;gt;&lt;br /&gt;&amp;lt;cargo.remote.username&amp;gt;admin&amp;lt;/cargo.remote.username&amp;gt;&lt;br /&gt;&amp;lt;cargo.remote.password&amp;gt;&amp;lt;/cargo.remote.password&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;deployer&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;remote&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;deployables&amp;gt;&lt;br /&gt;&amp;lt;deployable&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;${project.groupId}&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;${project.artifactId}&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;&amp;lt;context&amp;gt;${project.artifactId}&amp;lt;/context&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;type&amp;gt;war&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;lt;/deployable&amp;gt;&lt;br /&gt;&amp;lt;/deployables&amp;gt;&lt;br /&gt;&amp;lt;/deployer&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;executions&amp;gt;&lt;br /&gt;&amp;lt;execution&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;do&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;&lt;br /&gt;&amp;lt;goals&amp;gt;&lt;br /&gt;&amp;lt;goal&amp;gt;deployer-redeploy&amp;lt;/goal&amp;gt;&lt;br /&gt;&amp;lt;/goals&amp;gt;&lt;br /&gt;&amp;lt;/execution&amp;gt;&lt;br /&gt;&amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-4493611312430852010?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/4493611312430852010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/11/deploying-large-war-files-to-tomcat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/4493611312430852010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/4493611312430852010'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/11/deploying-large-war-files-to-tomcat.html' title='Deploying large war files to Tomcat under Hudson: use Cargo'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1544682858601591007</id><published>2009-11-11T13:07:00.004Z</published><updated>2011-08-17T14:43:12.593+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='VMWare'/><category scheme='http://www.blogger.com/atom/ns#' term='Hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Setting up Hudson CI for GWT Development</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.gliffy.com/pubdoc/1889004/L.jpg" target="_new"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://www.gliffy.com/pubdoc/1889004/T.jpg" border="0" alt="Hudson CI for GWT Development (made with Gliffy)" /&gt;&lt;/a&gt;GWT development requires a 32 bit Sun JDK. &lt;br /&gt;&lt;br /&gt;We decided to do this by using a 32 bit VM, which could be moved to another server at a later date. &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install VMWare Player (Ensure networking is enabled during installation)&lt;/li&gt;&lt;li&gt;Download a 32 bit ubuntu ISO (or 32 bit Debian)&lt;/li&gt;&lt;li&gt;Create a new VM from the ISO.&lt;/li&gt;&lt;li&gt;Enter VM and establish your ipaddress. &lt;/li&gt;&lt;li&gt;Add hudson repo to &lt;tt class="fileName"&gt;/etc/apt/sources&lt;/tt&gt;&lt;pre class="fileText"&gt;deb http://hudson.gotdns.com/debian binary/&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Install Sun JDK&lt;pre&gt;&lt;code&gt;apt-get install sun-java6-jdk &lt;br /&gt;update-alternatives --config java&lt;br /&gt;update-alternatives --config javac&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Install Tomcat&lt;pre&gt;&lt;code&gt;apt-get install tomcat6&lt;br /&gt;apt-get install tomcat6-admin&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Modify &lt;span class="fileName"&gt;/etc/tomcat/tomcat-users.xml&lt;/span&gt; and add  &lt;br /&gt;&lt;span class="fileText"&gt;&amp;lt;user username="admin" password="" roles="manager,admin"/&amp;gt;&lt;/span&gt;&lt;br /&gt;(or add a password and add password to ~/.m2/settings.xml)&lt;br /&gt;Set Tomcat security off &lt;br /&gt;&lt;pre&gt;&lt;code&gt;sed -i "s/TOMCAT6_SECURITY=.\+/TOMCAT6_SECURITY=no/" \&lt;br /&gt;/etc/default/tomcat6&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Increase Tomcat default memory allocation in &lt;span class="fileName"&gt;/etc/defaults/tomcat6&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green"&gt;JAVA_OPTS="-Djava.awt.headless=true -Xmx1024M -Xms1024m"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Install Hudson&lt;pre&gt;&lt;code&gt;apt-get install hudson&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Change Hudson port and ajpport by editting &lt;tt class="fileName"&gt;/etc/init.d/hudson&lt;/tt&gt; to add &lt;pre&gt;&lt;span class="fileText"&gt;HUDSON_ARGS="--httpPort=8081  --ajp13Port=8102" &lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Install Apache&lt;pre&gt;&lt;code&gt;apt-get install apache2&lt;br /&gt;a2enmod proxy&lt;br /&gt;a2enmod proxy_http&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Setup &lt;tt class="fileName"&gt;/etc/apache2/httpd.conf&lt;/tt&gt; (or similar)&lt;/li&gt;&lt;pre&gt;&lt;span class="fileText"&gt;servername hudson&lt;br /&gt;ProxyPass   /  http://localhost:8081/&lt;br /&gt;ProxyPassReverse  /  http://localhost:8081/&lt;br /&gt;ProxyRequests   Off&lt;br /&gt;&amp;lt;Proxy http://localhost:8081/*&amp;gt;&lt;br /&gt;Order deny,allow&lt;br /&gt;Allow from all&lt;br /&gt;&amp;lt;/Proxy&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Install Maven&lt;pre&gt;&lt;code&gt;apt-get install maven2&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Configure Hudson&lt;ul&gt;&lt;li&gt;setup smtp&lt;/li&gt;&lt;li&gt;set &lt;tt&gt;MAVEN_HOME&lt;/tt&gt; to &lt;tt&gt;/usr/share/maven2&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;set email from address&lt;/li&gt;&lt;li&gt;set url to ip address&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Download &lt;a href='http://google-web-toolkit.googlecode.com/files/gwt-linux-1.7.1.tar.bz2'&gt;GWT toolkit 1.7.1&lt;/a&gt; and extract then install &lt;tt&gt;gwt-dev-linux.jar&lt;/tt&gt; to your local repo&lt;pre&gt;&lt;code&gt;mvn install:install-file \&lt;br /&gt;-DgroupId=com.google.gwt -DartifactId=gwt-dev \&lt;br /&gt;-Dversion=1.7.1 -Dclassifier=linux \&lt;br /&gt;-Dpackaging=jar -Dfile=gwt-dev-linux.jar&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Add individual projects to Hudson&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1544682858601591007?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1544682858601591007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/11/setting-up-hudson-ci-for-gwt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1544682858601591007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1544682858601591007'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/11/setting-up-hudson-ci-for-gwt.html' title='Setting up Hudson CI for GWT Development'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-8502815791415310597</id><published>2009-09-30T11:25:00.006+01:00</published><updated>2011-08-17T14:47:25.608+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xmlhttprequest'/><title type='text'>Enabling private cross site scripting with a XMLHttpRequest proxy servlet</title><content type='html'>&lt;div  style="font-size:130%;"&gt;&lt;span style="font-size:130%;"&gt;The problem&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;You have a list of URLs and want to interrogate them for their Content-Type using javascript in the browser.&lt;br /&gt;&lt;br /&gt;You cannot do this because the &lt;em&gt;javascript security model&lt;/em&gt; forbids this activity, called &lt;em&gt;cross site scripting&lt;/em&gt;, as it could be used to invoke malign code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Install a proxy on your server which can make the request on your behalf and relay it back to you. You have not violated the &lt;em&gt;javascript security model&lt;/em&gt; and you are free to invoke any url on the net by a call to your own, originating, server.&lt;br /&gt;&lt;br /&gt;However the proxy does need to be protected otherwise it could be abused by other sites. To protect the proxy we ensure that it can only be accessed from a page generated by our server, indeed one which has set a named session variable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The code&lt;/span&gt; As implemented within the Melati framework, which wraps the HttpRequest and HttpResponse objects in a Melati object:&lt;br /&gt;&lt;pre class="fileText"&gt;private String proxy(Melati melati, ServletTemplateContext context) {&lt;br /&gt;  if (melati.getSession().getAttribute("generatedByMelatiClass") == null)&lt;br /&gt;    throw new AnticipatedException("Only available from within an Admin generated page");&lt;br /&gt;  String method = melati.getRequest().getMethod();&lt;br /&gt;  String url =  melati.getRequest().getQueryString();&lt;br /&gt;  HttpServletResponse response = melati.getResponse();&lt;br /&gt;  HttpMethod httpMethod = null;&lt;br /&gt;  try {&lt;br /&gt;&lt;br /&gt;    HttpClient client = new HttpClient();&lt;br /&gt;    if (method.equals("GET"))&lt;br /&gt;      httpMethod = new GetMethod(url);&lt;br /&gt;    else if (method.equals("POST"))&lt;br /&gt;      httpMethod = new PostMethod(url);&lt;br /&gt;    else if (method.equals("PUT"))&lt;br /&gt;      httpMethod = new PutMethod(url);&lt;br /&gt;    else if (method.equals("HEAD"))&lt;br /&gt;      httpMethod = new HeadMethod(url);&lt;br /&gt;    else&lt;br /&gt;      throw new RuntimeException("Unexpected method '" + method + "'");&lt;br /&gt;    try {&lt;br /&gt;      httpMethod.setFollowRedirects(true);&lt;br /&gt;      client.executeMethod(httpMethod);&lt;br /&gt;      for (Header h : httpMethod.getResponseHeaders()) {&lt;br /&gt;        response.setHeader(h.getName(), h.getValue());&lt;br /&gt;      }&lt;br /&gt;      response.setStatus(httpMethod.getStatusCode());&lt;br /&gt;      response.setHeader("Cache-Control", "no-cache");&lt;br /&gt;      byte[] outputBytes = httpMethod.getResponseBody();&lt;br /&gt;      if (outputBytes != null) {&lt;br /&gt;        response.setBufferSize(outputBytes.length);&lt;br /&gt;        response.getWriter().write(new String(outputBytes));&lt;br /&gt;        response.getWriter().flush();&lt;br /&gt;      }&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      throw new MelatiIOException(e);&lt;br /&gt;    }&lt;br /&gt;  } finally {&lt;br /&gt;    httpMethod.releaseConnection();&lt;br /&gt;  }&lt;br /&gt;  return null;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-8502815791415310597?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/8502815791415310597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/09/enabling-private-cross-site-scripting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8502815791415310597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8502815791415310597'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/09/enabling-private-cross-site-scripting.html' title='Enabling private cross site scripting with a XMLHttpRequest proxy servlet'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-3333916550660905742</id><published>2009-09-04T10:15:00.000+01:00</published><updated>2009-11-17T17:07:14.875Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Software Development with Certainty</title><content type='html'>My most recent project was to turn an impressive prototype developed by one person into a library, and applications based upon it, that can be simultaneously developed and used by a team.&lt;br /&gt;&lt;br /&gt;The development process gains a new dimension once you have published your first version or have your first user. The task is made more tricky due to the absence of the original author.&lt;br /&gt;In other words: situation normal, don't start from here.&lt;br /&gt;&lt;br /&gt;The Erewhon applications, &lt;a href="http://gaboto.sourceforge.net/"&gt;Gaboto library&lt;/a&gt; and its main dependencies &lt;a href="http://www4.wiwiss.fu-berlin.de/bizer/ng4j/"&gt;ng4j&lt;/a&gt; and &lt;a href="http://jena.sourceforge.net/"&gt;Jena&lt;/a&gt; are all changing rapidly. New functionality is being added and code and dependencies are being refactored and changed. The challenge is to enable this change without breaking installed systems or at least not breaking them unknowingly. This is ensured by establishing a contract between the code and the design by the use of tests.  The tests guarantee that the system actually does do what it claims. Or, more properly, the tests are exactly what the system claims to do.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The minimum requirement to ensure that a project remains alive is that it keeps up with the current versions of all the libraries it depends upon. There are two approaches to the management of dependencies: Saltation and &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Continuous Integration&lt;/a&gt;.&lt;br /&gt;Saltation is when you leave updating the dependencies until a blitz, you update all of them and re-test. The problem with Saltation is that it appears to the outside world that nothing is going on, the project is approaching stagnation, and when you do address the issue there is a lot  of work to do,  there is no obvious connection  to the change that caused the problem and the developers of the library who have caused the problem have moved on and will not immediately know what they did to break your build.&lt;br /&gt;&lt;br /&gt;By contrast using a Continuous Integration methodology one can expect to identify the particular commit that broke the build!&lt;br /&gt;&lt;br /&gt;Continuous Integration relies upon repeating a repeatable build process. For this we turned to &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; as it addresses the other problem which we and our dependencies have: Dependency Management.&lt;br /&gt;&lt;br /&gt;Dependency Management is a much re-invented wheel to address a problem which has re-occurred time and time again.  In the world of Windows programming the problem is known as &lt;a href="http://en.wikipedia.org/wiki/DLL_hell"&gt;DLL Hell&lt;/a&gt;. In the Linux world there are two predominant dependency management  systems: &lt;a href="http://www.debian.org/doc/FAQ/ch-pkgtools.en.html"&gt;Deb&lt;/a&gt; from Debian and &lt;a href="http://www.rpm.org/"&gt;RPM&lt;/a&gt; from RedHat to manage package dependencies. Quite astonishingly, in the java world the problem was re-invented, as jar hell, by the practice of not versioning jar files. This anti-pattern was thought to be extinct by about 2001, however it has clung on in the eco-system surrounding Jena.&lt;br /&gt;&lt;br /&gt;In addition to a repeatable build process with dependency management Maven offers code quality tools such as static analysers and style checkers and runs tests so enabling code coverage metrics.&lt;br /&gt;&lt;br /&gt;Unlike Ant, which is a Turing complete scripting language with XML syntax, Maven is a project build system guided by an explicit definition of best practice and a widely used set of conventions which all Java programmers can now be expected to know.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://maven.apache.org/pom.html"&gt;Maven project definitions&lt;/a&gt; do not quite take us to Continuous Integration nirvana, we have a repeatable build but now we need to repeat it and to define when it should be repeated.&lt;br /&gt;&lt;br /&gt;To repeat the build we use &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; which can schedule, monitor and record builds defined as Ant scripts, bash scripts and commands as well a Maven builds. Hudson is currently the best of breed of the java CI servers, based upon experience with Continuum and Cruise Control: it just works.&lt;br /&gt;&lt;br /&gt;The build should be repeated whenever any code within the project is changed or whenever any code in any dependency is changed. This is achieved by publishing SNAPSHOT builds after every commit.&lt;br /&gt;&lt;br /&gt;A Maven project defines a single artefact, usually a jar but possibly a war, ear or website.&lt;br /&gt;The artefacts are published to a repository which has the same structure as the &lt;a href="http://repo1.maven.org/maven2/"&gt;main Maven repository&lt;/a&gt;.&lt;br /&gt;Projects are versioned in the usual way, however between explicit versions a SNAPSHOT version is published, usually nightly.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;0.1&lt;/li&gt;&lt;li&gt;0.2-SNAPSHOT&lt;/li&gt;&lt;li&gt;0.2&lt;/li&gt;&lt;li&gt;0.3-SNAPSHOT&lt;/li&gt;&lt;li&gt;0.3&lt;/li&gt;&lt;li&gt;0.4-SNAPSHOT&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;A non-SNAPSHOT build should not depend upon any SNAPSHOT artefacts.&lt;br /&gt;&lt;br /&gt;The process of publishing a new version is now straight forward and should only involve incrementing the version, removing the SNAPSHOT classifier from all dependencies, tagging the source control system and deploying the artefact. Immediately after publication the SNAPSHOT classifier is added back to this project and all its dependencies.&lt;br /&gt;&lt;br /&gt;In this state of bliss the creation of a new version is very little work and any breach of the contract between tests and code is caught as it is committed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-3333916550660905742?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/3333916550660905742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/09/software-development-with-certainty.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/3333916550660905742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/3333916550660905742'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/09/software-development-with-certainty.html' title='Software Development with Certainty'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-2111448231901132784</id><published>2009-08-19T00:16:00.000+01:00</published><updated>2009-08-19T15:59:35.895+01:00</updated><title type='text'>Rendering ancient languages with CSS3 font-face</title><content type='html'>Re-reading &lt;a href="http://www.amazon.co.uk/s?keywords=0521398304&amp;amp;tag=thepaneriscollab"&gt;The Decipherment of Linear B&lt;/a&gt;  led me to revisit the CSS3 feature &lt;tt&gt;@font-face&lt;/tt&gt; and to address my ignorance of &lt;a href="http://www.unicode.org/"&gt;Unicode&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As always it is just about to be ready, really. The browsers which work: Firefox 3.5.2, Android cupcake, Safari (Mac). The browsers which fail: IE6, Firefox 3.0, Konqueror, Safari (iPhone). Opera works, but assumes one font per character sequence.&lt;br /&gt;&lt;br /&gt;Unicode has Linear B &lt;a href="http://www.unicode.org/charts/PDF/U10000.pdf"&gt;sorted&lt;/a&gt; and will have Egyptian done sometime soon (October 2009).&lt;br /&gt;&lt;br /&gt;There are some very nice, free fonts created by &lt;a href="http://users.teilar.gr/%7Eg1951d/"&gt;George Douros&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;See the resulting &lt;a href="http://context-computing.co.uk/~timp/unicode"&gt;Browser Unicode rendering test page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-2111448231901132784?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/2111448231901132784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/08/rendering-ancient-languages-with-css3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2111448231901132784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2111448231901132784'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/08/rendering-ancient-languages-with-css3.html' title='Rendering ancient languages with CSS3 font-face'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-7841990469813262404</id><published>2009-07-27T09:16:00.000+01:00</published><updated>2009-07-27T12:05:22.170+01:00</updated><title type='text'>Bye then Ben and Nevis. Coo Cows.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KzADlO3M7hM/Sm2IelNPVdI/AAAAAAAAB70/fzRmiqh68Qw/s1600-h/ben.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_KzADlO3M7hM/Sm2IelNPVdI/AAAAAAAAB70/fzRmiqh68Qw/s320/ben.jpg" alt="" id="BLOGGER_PHOTO_ID_5363092790233224658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This morning Herbie and the man from the abbertoir will despatch &lt;a href="http://picasaweb.google.com/lh/photo/kSS5seViFpCIZq8UJQ2N2w?feat=directlink"&gt;Ben&lt;/a&gt; and &lt;a href="http://picasaweb.google.com/lh/photo/OWfDsfdVAjB8vqiupW7FOg?feat=directlink"&gt;Nevis&lt;/a&gt;. They were brothers and were bought some eighteen years ago. They have kept &lt;a href="http://picasaweb.google.com/lh/albumMap?uname=Tim.Pizey&amp;aid=5355608662234747825#map"&gt;their fields&lt;/a&gt; from turning into woodland and have become local landmarks. Although bullocks their size and six foot horn span mean that they are best viewed from a distance.&lt;br /&gt;&lt;br /&gt;Whilst actively seeking out human company, especially in winter when they were fed, they have never been handled and so are impossible to treat for ailments. What has led the vet to say that they must be put down is an insect infestation under their fur.&lt;br /&gt;&lt;br /&gt;They were bought by Noel to maintain the bio-diversity of the grassland, which they did spectacularly, the field is thought to have the highest score in the West Country, though this is likely to be as much to do with its bewildering geology as its management.&lt;br /&gt;&lt;br /&gt;Noel also chose them because they themselves do not require  the attention which he lavished on them anyway, as he just liked Highland cattle. The twice daily walk to feed them undoubtably added years to his life so their ending is even more sad, as another connection to Noel passes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-7841990469813262404?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/7841990469813262404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/07/bye-then-ben-and-nevis-coo-cows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7841990469813262404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7841990469813262404'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/07/bye-then-ben-and-nevis-coo-cows.html' title='Bye then Ben and Nevis. Coo Cows.'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KzADlO3M7hM/Sm2IelNPVdI/AAAAAAAAB70/fzRmiqh68Qw/s72-c/ben.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-2377910653164256783</id><published>2009-07-24T17:58:00.000+01:00</published><updated>2009-07-27T13:51:17.540+01:00</updated><title type='text'>Hell is other people's code</title><content type='html'>&lt;h4&gt;Refactoring java packages&lt;/h4&gt;Maintenance programming on OpenSource projects is much, much more pleasant than using non-writable libraries, as you are able to &lt;b&gt;read with a pen&lt;/b&gt;; by which I mean that as you understand the code you can document that understanding. If code was difficult to understand due to it's lacking in structure or unevocative naming you can change it.&lt;br /&gt;&lt;br /&gt;The maintenance programmer has a very different relation to the code than does the original author. The original author understands the intention of the code and inhabits the conceptual framework it embodies. The maintenance programmer strives to intuit.&lt;br /&gt;&lt;br /&gt;As the understanding of the code grows so does the desire to rewrite it. Once  I have tests for the main use cases for a library I am working with I am able to think about giving it a vigorous refactoring.&lt;br /&gt;&lt;br /&gt;Refactoring is odd, it is hard and dangerous work yet nothing is meant to change. The functionality of the code should, indeed must, not change. It is tricky to come up with a defense against the injunctions &lt;b&gt;if it ain't broke don't fix it&lt;/b&gt; and &lt;b&gt;change for change's sake&lt;/b&gt;. I claim that unloved code is dieing code and unchanging software is no longer soft. At the end of the process there should be some increase in beauty and hence comprehensibility and maintainability.&lt;br /&gt;&lt;br /&gt;These qualities cannot be measured, however there are things which can be measured: the links between packages (java classes live within a namespace tree where each node is called a package), the number of classes and the proportion of interfaces and abstract classes to concrete classes. These and other metrics are created by the &lt;a href="http://clarkware.com/software/JDepend.html"&gt;JDepend&lt;/a&gt; code metrics tool.&lt;h4&gt;Why package at all?&lt;/h4&gt;One of the code smells that refactoring should aim to reduce is the number of import statements within classes. There is a way in which to reduce the number of inter-package linkages: create all classes in the default package and be done with it. However you cannot control, or even be aware of, name clashes in the default namespace, it should &lt;b&gt;NEVER&lt;/b&gt; be used. Another possibility is to put all of your code into one single package in a namespace you control. This too gets pretty silly pretty quickly for all but the most trivial project.&lt;br /&gt;&lt;br /&gt;The purpose of java package namespaces should be to impose a conceptual structure upon your code which helps you and other programmers understand it. Java packages have no functional effect, given the prevailing practice of restricting visibility modifiers to &lt;tt&gt;public&lt;/tt&gt; or &lt;tt&gt;private&lt;/tt&gt; and eschewing the default &lt;tt&gt;package&lt;/tt&gt; visibility. The compiler does not care how you group your classes. There are no tools that I am aware of which will make any comments about how you do it. The only measurable thing is the number of import statements required in classes within the package. My claim is that &lt;em&gt;for two package schemas with equal number of packages one is &lt;strong&gt;better&lt;/strong&gt; than the other if it results in fewer import statements&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Anti Patterns&lt;/h4&gt;&lt;br /&gt;&lt;h5&gt;Separating all exceptions into a separate package&lt;/h5&gt;This will necessarily increase the number of intra-package links, as each exception will have to be imported from the exceptions package.&lt;br /&gt;&lt;br /&gt;Exceptions should be declared in the package they are thrown in or in the nearest parent node if they are thrown in two packages.&lt;h5&gt;A new package for a new concept&lt;/h5&gt;Today is a new day, I am adding new stuff, I want my stuff to be separate from the previous work are all bad justifications for creating a new package.&lt;h5&gt;Overuse of checked exceptions&lt;/h5&gt;Checked exceptions should only be used for events which the application programmer can respond to. Programming bugs should be unchecked exceptions.&lt;h5&gt;Meaningless names and abbreviations&lt;/h5&gt;Naming is the most important aspect of writing maintainable code. Good naming removes the need to remember meaning.&lt;h5&gt;Package names should be singular&lt;/h5&gt;Analogous to the naming of tables in an SQL database, you might think that you store people records in a table called &lt;tt&gt;people&lt;/tt&gt; but everything falls out much more neatly if you call the table &lt;tt&gt;person&lt;/tt&gt;, not just because you avoid English irregular plurals.&lt;h5&gt;Do not repeat yourself (DRY)&lt;/h5&gt;In fully qualified names, as in much else in programming, you should not repeat yourself. So &lt;tt&gt;com.mycompany.myproject.mypackage.MyProjectEntity&lt;/tt&gt; should probably be named &lt;tt&gt;com.mycompany.myproject.mypackage.Entity&lt;/tt&gt;&lt;h5&gt;Use your own default package space&lt;/h5&gt;If you are writing a modelling library and its root package is to be &lt;tt&gt;net.mylib&lt;/tt&gt; then use that space for the main guts not &lt;tt&gt;net.mylib.model&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;My latest refactoring with JDepend metrics &lt;a href="http://bogof.nsms.ox.ac.uk/mvn/gaboto/jdepend-report-2009-07-13.html"&gt;before&lt;/a&gt;, &lt;a href="http://bogof.nsms.ox.ac.uk/mvn/gaboto/jdepend-report-2009-07-26.html"&gt;nearly there&lt;/a&gt; and &lt;a href="http://bogof.nsms.ox.ac.uk/mvn/gaboto/jdepend-report.html"&gt;after&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-2377910653164256783?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/2377910653164256783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/07/hell-is-other-peoples-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2377910653164256783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2377910653164256783'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/07/hell-is-other-peoples-code.html' title='Hell is other people&apos;s code'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-9207766451459500237</id><published>2009-06-17T10:43:00.001+01:00</published><updated>2011-08-17T14:50:07.115+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='filtering deprecated'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Ant Rant - Version filtering deprecated</title><content type='html'>Filtering is one of those features which Ant makes available which was overused in the initial excitement when Ant was new.&lt;br /&gt;&lt;br /&gt;By using version filtering you are tying your codebase into being built by Ant, or at least a build system which has the same filtering mechanism as Ant.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://melati.org/"&gt;Melati&lt;/a&gt;, &lt;a href="http://webmacro.sourcefoge.ne/"&gt;WebMacro&lt;/a&gt; and now ten years later in &lt;a href="http://jena.sourceforge.net/"&gt;Jena&lt;/a&gt; there was a feature to filter the code and insert the version number. The uses are so similar I suspect they were in some popular "Introduction to Ant".&lt;br /&gt;&lt;br /&gt;We even had tests to ensure that the version variable had been successfully filtered.&lt;br /&gt;&lt;br /&gt;&lt;tt class="fileText"&gt;assertNotEquals("@version@", Product.VERSION);&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;When I came to convert to &lt;a href="http://maven.apache.org"&gt;Maven&lt;/a&gt; I wanted to keep this handy feature, but of course the test was failing.&lt;br /&gt;&lt;br /&gt;I asked how to do filtering on the Maven lists way back. They were very scathing about the notion of a build process modifying production code. It is not the Maven way.&lt;br /&gt;&lt;br /&gt;The question that needs a very convincing answer is &lt;span style="font-weight: bold;"&gt;what is this for?&lt;/span&gt; Does it fit with how people use and develop the software.&lt;br /&gt;&lt;br /&gt;As a developer, in your IDE, do you want to see&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public static final String NAME = "@Name@";&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;or more sanely&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public static final String NAME = "MyProject";&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Filtering may work for the users but not for the developers. &lt;br /&gt;&lt;br /&gt;Lets look at the actual use cases, taking Jena as a typical project. A sensible place for these strings is Jena.java. Of the static strings in the following references are found.&lt;br /&gt;&lt;br /&gt;PATH -  15 references - interestingly hardcoded, not interpolated.&lt;br /&gt;NAME - 0 references&lt;br /&gt;WEBSITE - 0 references&lt;br /&gt;VERSION - 0 references&lt;br /&gt;MAJOR_VERSION - 0 references&lt;br /&gt;MINOR_VERSION - 0 references&lt;br /&gt;REVISION_VERSION - 0 references&lt;br /&gt;VERSION_STATUS - 0 references&lt;br /&gt;BUILD_DATE - 0 references&lt;br /&gt;&lt;br /&gt;We can see that after 6 years this facility has not actually been used. It was put in because the coder knew how to do it and thought it might come in useful. It hasn't. &lt;a href="http://c2.com/xp/YouArentGonnaNeedIt.html"&gt;YAGNI&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you &lt;b&gt;REALLY&lt;/b&gt; want to use filtering then filter a properties file using &lt;a href="http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files"&gt;Maven Resource Filtering&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;However if you do just want to provide, for example, a version command in your application then explicitly add the version string as a static variable in a prominent place in your code and add a step to your release procedure document to update this variable. &lt;br /&gt;&lt;br /&gt;Code should not depend upon the build system: rip it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-9207766451459500237?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/9207766451459500237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/06/ant-rant-version-filtering-deprecated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/9207766451459500237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/9207766451459500237'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/06/ant-rant-version-filtering-deprecated.html' title='Ant Rant - Version filtering deprecated'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-943062284100146194</id><published>2009-05-29T10:25:00.000+01:00</published><updated>2009-11-17T17:03:23.693Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>You are using Continuous Integration, aren't you?</title><content type='html'>This is one of those &lt;span style="font-style:italic;"&gt;questions expecting the answer yes&lt;/span&gt;, like &lt;span style="font-weight:bold;"&gt;you have lost your virginity, haven't you?&lt;/span&gt;, which has a motivational impact. &lt;br /&gt;&lt;br /&gt;Another prod in the right direction was when someone used &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; as the term for CI server, as you would use Hoover for vaccum cleaner. &lt;br /&gt;&lt;br /&gt;I have tried three times to use &lt;a href="http://continuum.apache.org/"&gt;Continuum&lt;/a&gt;, only once with any degree of success. Hudson just works, straight out of the box. &lt;br /&gt;&lt;br /&gt;I am proud to say I am, at last and later than most, using Continuous Integration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-943062284100146194?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/943062284100146194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/06/you-are-using-continuous-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/943062284100146194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/943062284100146194'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/06/you-are-using-continuous-integration.html' title='You are using Continuous Integration, aren&apos;t you?'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-2594305275402175637</id><published>2009-04-08T09:40:00.000+01:00</published><updated>2009-04-08T11:28:50.663+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rdf time oxpoints'/><title type='text'>The map is not the territory</title><content type='html'>My new job on the &lt;a href="http://erewhon.oucs.ox.ac.uk/"&gt;Erewhon Project&lt;/a&gt; is largely based upon the work of my predecessor Arno Mittelbach. &lt;br /&gt;&lt;br /&gt;In a series of posts leading up to the &lt;a href="http://oxforderewhon.wordpress.com/2009/03/20/the-new-oxpoints/"&gt;new OxPoints&lt;/a&gt; Arno rediscovers the issues around using first order predicate calculus on continuous dimensions such as time. &lt;br /&gt;&lt;br /&gt;This would appear to be a rediscovery of the &lt;a href="http://www.stanford.edu/~laurik/fsmbook/examples/YaleShooting.html"&gt;Yale Shooting Problem&lt;/a&gt;: the real world cannot be modelled in a monotonic logic. Locations are not points but areas, names are not simple properties but have implicit usage start and end times. Only in maths is something as simple as its description: the map is not the territory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-2594305275402175637?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/2594305275402175637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/04/map-is-not-territory.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2594305275402175637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/2594305275402175637'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/04/map-is-not-territory.html' title='The map is not the territory'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-8632167059320485001</id><published>2009-04-03T15:23:00.002+01:00</published><updated>2011-08-17T14:51:53.308+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amd64 skype android'/><title type='text'>amd64 "no such file or directory" error with Android and Skype</title><content type='html'>Using an amd64 debian (lenny and kubuntu jaunty) install I came across the least informative error message yet:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;tt&gt;bash: adb: No such file or directory &lt;/tt&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;and similarly for skype.&lt;br /&gt;&lt;br /&gt;This appears to be due to not yet having installed the i36 compatibility libraries:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;apt-get install ia32-libs&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;and it goes away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-8632167059320485001?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/8632167059320485001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/04/amd64-no-such-file-or-directory-andoid.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8632167059320485001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8632167059320485001'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/04/amd64-no-such-file-or-directory-andoid.html' title='amd64 &quot;no such file or directory&quot; error with Android and Skype'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1297689412417724174</id><published>2009-04-01T11:07:00.000+01:00</published><updated>2009-04-04T12:17:43.349+01:00</updated><title type='text'>Bye then Pepper. Good girl.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KzADlO3M7hM/SddBrDttGtI/AAAAAAAAAKA/TxmD1AG2fYE/s1600-h/pepperAtKylesMorar20070707.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_KzADlO3M7hM/SddBrDttGtI/AAAAAAAAAKA/TxmD1AG2fYE/s320/pepperAtKylesMorar20070707.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5320793692748716754" /&gt;&lt;/a&gt;&lt;br /&gt;On Wednesday morning, at about 8.15, Pepper died.&lt;br /&gt;&lt;br /&gt;Whilst she was rather young (eleven maybe) to die, for a mongrel, her timing was pretty good. It was the first day of my new job and as it was all of us were stroking her as she stopped breathing, twitched and was gone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1297689412417724174?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1297689412417724174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/04/bye-then-pepper-good-girl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1297689412417724174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1297689412417724174'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/04/bye-then-pepper-good-girl.html' title='Bye then Pepper. Good girl.'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KzADlO3M7hM/SddBrDttGtI/AAAAAAAAAKA/TxmD1AG2fYE/s72-c/pepperAtKylesMorar20070707.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-5835655340694983351</id><published>2009-03-20T20:49:00.000Z</published><updated>2009-06-17T12:42:16.382+01:00</updated><title type='text'>Pictures tell of thousands of words</title><content type='html'>Had to give a presentation for an interview with OUCS on "the challenges of creating mobile location-based services to students" so took &lt;a href="http://picasaweb.google.com/Tim.Pizey/20090318LanguageInTheLandscape"&gt;a walk&lt;/a&gt; and photographed the signage. &lt;br /&gt;&lt;br /&gt;Did the presentation in OpenOffice Impress, but of course the fonts were different on Windows and the colours were the first ones I chose not the ones I had settled on and saved and which showed on Apple and Linux. &lt;br /&gt;If I don't get the job I will blame grotty software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-5835655340694983351?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/5835655340694983351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/03/pictures-tell-of-thousands-of-words.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5835655340694983351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/5835655340694983351'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/03/pictures-tell-of-thousands-of-words.html' title='Pictures tell of thousands of words'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-9178548661361242081</id><published>2009-03-19T14:46:00.000Z</published><updated>2009-03-19T14:46:51.914Z</updated><title type='text'>Ellie as Shiva</title><content type='html'>&lt;div style='text-align:center;margin:0px auto 10px;'&gt;&lt;a href='http://2.bp.blogspot.com/_KzADlO3M7hM/ScJa2yris8I/AAAAAAAAAEg/4W9XpbREXl4/s1600-h/imgp1567.jpg'&gt;&lt;img src='http://2.bp.blogspot.com/_KzADlO3M7hM/ScJa2yris8I/AAAAAAAAAEg/4W9XpbREXl4/s320/imgp1567.jpg' border='0' alt='' /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div style='clear:both; text-align:CENTER'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-9178548661361242081?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/9178548661361242081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/03/ellie-as-shiva.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/9178548661361242081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/9178548661361242081'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/03/ellie-as-shiva.html' title='Ellie as Shiva'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KzADlO3M7hM/ScJa2yris8I/AAAAAAAAAEg/4W9XpbREXl4/s72-c/imgp1567.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-1838865765807391559</id><published>2009-02-17T22:34:00.001Z</published><updated>2011-08-17T14:53:58.138+01:00</updated><title type='text'>Wavemaker 32 bit rpm on amd64 debian</title><content type='html'>&lt;p&gt;As there is no appropriate .deb file for &lt;a href="http://www.wavemaker.com"&gt;wavemaker&lt;/a&gt; but the rpm is pure java so the following works:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;rpm2cpio wavemaker-4.0.2.24308-community.i386.rpm &amp;gt;wm.cpio &amp;#160;&lt;br /&gt;cpio -idv &amp;#160;&amp;lt; wm.cpio&lt;p&gt;mv opt/wavemaker-4.0.2.24308 /opt/ &amp;#160;&lt;br /&gt;/opt/wavemaker-4.0.2.24308/bin/wavemaker.sh &lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-1838865765807391559?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/1838865765807391559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/wavemaker-32-bit-rpm-on-amd64-debian.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1838865765807391559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/1838865765807391559'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/wavemaker-32-bit-rpm-on-amd64-debian.html' title='Wavemaker 32 bit rpm on amd64 debian'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-8812396000176125553</id><published>2009-02-15T20:58:00.000Z</published><updated>2009-02-15T20:49:45.101Z</updated><title type='text'>£900m googlewhack</title><content type='html'>In &lt;a href="http://www.guardian.co.uk/business/2009/feb/14/lloydstsbgroup-banking"&gt;Saturday&amp;#39;s Guardian&lt;/a&gt; Jill Treanor treated us to an &amp;#39;explanation&amp;#39; of the downfall of Lloyds, which left me perplexed and annoyed, so I turned to Google to try to decipher the jargon.&lt;br /&gt;&lt;br /&gt;I discover that a &lt;a href="http://www.google.co.uk/search?hl=en&amp;amp;q=%22policy+tax+charge%22"&gt;&amp;quot;policy tax charge&amp;quot;&lt;/a&gt; is a googlewhack so am none the wiser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-8812396000176125553?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/8812396000176125553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/900m-googlewhack.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8812396000176125553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/8812396000176125553'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/900m-googlewhack.html' title='£900m googlewhack'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-7340293622453430061</id><published>2009-02-13T21:31:00.000Z</published><updated>2009-02-14T11:28:47.445Z</updated><title type='text'>"Yahoo!",  the number two, plays a spoiling game</title><content type='html'>I went to hear &lt;a href=http://dblife.cs.wisc.edu/search.cgi?query=Raghu+Ramakrishnan&gt;Mr Raghu Ramakrishnan&lt;/a&gt; of &lt;a href="http://research.yahoo.com/"&gt;Yahoo! Research&lt;/a&gt; give a talk at &lt;a href="http://web.comlab.ox.ac.uk/"&gt;ComLab&lt;/a&gt;, which was a real treat. Lovely people in a lovely building doing interesting things, this is the joy of living in Oxford and I am determined to take more advantage of it.&lt;br /&gt;&lt;br /&gt;The talk was rather light on detail, if clearly and energetically given. The problem space was described very well, but the solution was mostly given by pointing to &lt;a href="http://dblife.cs.wisc.edu/"&gt;DBLife&lt;/a&gt;, so it can be done but the how is left for you to discover. &lt;br /&gt;&lt;br /&gt;If, like me, you think of &amp;quot;Yahoo!&amp;quot; as a failing company  with an incorrect belief that punctuation can form part of a name then you may not have paid much attention to them. &lt;br&gt;(Douglas Crockford&amp;#39;s &lt;a href="http://javascript.crockford.com/"&gt;json&lt;/a&gt; excepted).&lt;br /&gt;&lt;br /&gt;However the point was well made that as the number two in the market &amp;quot;Yahoo!&amp;quot; must, necessarily, play a market disrupting game and the way they are doing this is to open their API. The current monetised search model is sown up by big G. The next generation will be &amp;#39;semantic&amp;#39; search: &lt;br /&gt;&lt;br /&gt;- the search engine inferring the reason for the search and possibly tracking episodes in a search which may be engaged in over a number of sessions over a period of days or months.&lt;br /&gt;&lt;br /&gt;- the search engine extracting more structure from the pages crawled. &lt;br /&gt;&lt;br /&gt;How to do this is unknown so &amp;quot;Yahoo!&amp;quot; have opened their API, lowered the barrier to entry for academics and others to play with the results of spidering. No more having to setup the spiders, parsers or vast datastores previously required to start a websearch project.&lt;br /&gt;&lt;br /&gt;&amp;quot;Yahoo!&amp;quot; do not want anything in return, all they want is the current incumbent de-throned, so that they can have another shot, possibly in partnership with the next big idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-7340293622453430061?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/7340293622453430061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/yahoo-number-two-plays-spoiling-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7340293622453430061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/7340293622453430061'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/yahoo-number-two-plays-spoiling-game.html' title='&quot;Yahoo!&quot;,  the number two, plays a spoiling game'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-3782093717951853032</id><published>2009-02-05T20:34:00.000Z</published><updated>2009-02-05T20:35:53.939Z</updated><title type='text'>Bibliomania as a search provider</title><content type='html'>A nasty bug surfaced , which I introduced to poem in 2007, when &lt;a href="http://bibliomania.com"&gt;Bibliomania&lt;/a&gt; was reunited with current melati/poem, see &lt;a href="http://sourceforge.net/mailarchive/message.php?msg_name=200902011119.23479.timp%40paneris.org"&gt;Melati Developers&lt;/a&gt; for gory details. The site is now even faster.&lt;p&gt;That done I have created an OpenSearchDescription for &lt;a href="http://bibliomania.com"&gt;Bibliomania&lt;/a&gt;, which can be installed from the site or via &lt;a href="https://addons.mozilla.org/en-US/firefox/"&gt;the Mozilla addon repository&lt;/a&gt;.&lt;p&gt;I would like a few things to happen: &lt;p&gt;Someone with IE7 or IE8 try clicking on the little search icon at the bottom of the &amp;#39;your details&amp;#39; login screen on &lt;a href="http://bibliomania.com"&gt;Bibliomania&lt;/a&gt;.&lt;p&gt;Someone with Mozilla go to the Mozilla Addon site, search for &amp;#39;Bibliomania search&amp;#39;, create an account and login, install the addon and then review it positively. Ideally this will be more than one person, but at least one is required, other than me, before it is accepted. &lt;p&gt;You might also want to check the new entry about search in the Bibliomania FAQ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-3782093717951853032?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/3782093717951853032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/bibliomania-as-search-provider.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/3782093717951853032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/3782093717951853032'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/02/bibliomania-as-search-provider.html' title='Bibliomania as a search provider'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2150042504803929508.post-959715539618840085</id><published>2009-01-21T16:52:00.000Z</published><updated>2009-01-21T18:46:48.636Z</updated><title type='text'>First Post</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Too busy to get a job! &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since end of the last one I have:&lt;br /&gt;&lt;br /&gt;relaunched &lt;a href="http://www.bibliomania.com/"&gt;Bibliomania&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;fixed the paneris mail server.&lt;br /&gt;&lt;br /&gt;moved &lt;a hef="http://paneris.net/"&gt;paneris.net&lt;/a&gt;,&lt;a hef="http://paneris.com/"&gt;paneris.com&lt;/a&gt;, &lt;a hef="http://melati.org/"&gt;melati.org&lt;/a&gt;, &lt;a hef="http://melati.net/"&gt;melati.net&lt;/a&gt; to&lt;br /&gt;&lt;a hef="http://www.bytemark.co.uk/"&gt;bytemark&lt;/a&gt;, though annoyingly not &lt;a hef="http://paneris.org/"&gt;paneris.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Installed &lt;a href="http://ofbiz.apache.org/"&gt;OFBiz&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Installed &lt;a href="http://www.gogle.com/android/"&gt;Android&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Joined &lt;a href="http://www.twitter.com/freequi"&gt;Twitter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Setup this blog.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2150042504803929508-959715539618840085?l=tim-pizey.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tim-pizey.blogspot.com/feeds/959715539618840085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tim-pizey.blogspot.com/2009/01/first-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/959715539618840085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2150042504803929508/posts/default/959715539618840085'/><link rel='alternate' type='text/html' href='http://tim-pizey.blogspot.com/2009/01/first-post.html' title='First Post'/><author><name>Tim Pizey</name><uri>http://www.blogger.com/profile/15301339931345833746</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_KzADlO3M7hM/SiTvyaBt6uI/AAAAAAAAAYc/DtpDUq0Ya1A/S220/pinpanza.png'/></author><thr:total>0</thr:total></entry></feed>
