<?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-29426273</id><updated>2011-12-17T09:31:06.264Z</updated><title type='text'>An Open Access Peon</title><subtitle type='html'>Technical postings (predominantly related to Web/document processing) and general musings on Open Access to scientific literature. Very low bandwidth.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-29426273.post-7906142702021342676</id><published>2011-10-26T12:45:00.003+01:00</published><updated>2011-10-26T12:54:29.935+01:00</updated><title type='text'>Ubuntu 11.10 on Sun X4540 ("Thumper")</title><content type='html'>I installed Ubuntu 11.10 Server x64 edition using the Java ILOM client - you must use a 32bit Java client to connect a CD image. I set up a MD RAID1 across the bootable devices of controllers 0 and 1 (first disks on 0 and 1).&lt;br /&gt;&lt;br /&gt;Post-install I encountered a blank, black screen on the GRUB 2 stage (i.e. after the kernel selection screen). To fix this edit the boot parameters on the kernel selection screen:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;set gfxpayload=text...linux [...] rootdelay=90&lt;/code&gt;&lt;br /&gt;To make these changes permanent after booting:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo vi /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT="rootdelay=90"GRUB_GFXMODE=textsudo update-grub&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(reboot to check everything worked correctly)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Installing native ZFS and setting up a ZFS pool&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo apt-get install python-software-propertiessudo add-apt-repository ppa:zfs-native/stablesudo apt-get updatesudo apt-get install ubuntu-zfs&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I created a small Perl script to set up a zpool over the remaining 46 disks. The scheme I use is 4 hot spares (the first disk of the other 4 controllers) with 7 raidz RAIDs over 1 disk per controller.&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Warning!&lt;/b&gt; This will destroy any data you have on the disks in your system. Only use this if you *really* know what you're doing.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo&amp;nbsp;perl [script.pl] --create&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The source code for the script:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;#!/usr/bin/perluse Getopt::Long;use strict;use warnings;my $usage = "$0 [--dry-run --create --destroy --dump]";GetOptions(        'dry-run' =&amp;gt; \(my $dry_run),        'create' =&amp;gt; \(my $opt_create),        'destroy' =&amp;gt; \(my $opt_destroy),        'dump' =&amp;gt; \(my $opt_dump),        'help' =&amp;gt; \(my $opt_help),) or die "$usage\n";die "$usage\n" if $opt_help;my @DISKS;open(my $fh, "&amp;lt;", "/var/log/dmesg") or die "Error opening dmesg: $!";while(&amp;lt;$fh&amp;gt;){        next if $_ !~ /Attached SCSI disk/;        s/^\[[^\]]+\]\s*//;        die if $_ !~ /sd\s+(\d+):0:(\d+):0:\s+\[(\w+)\]/;        my( $c, $t, $dev ) = ($1, $2, $3);        $DISKS[$c][$t] = "/dev/$dev";}shift @DISKS while !defined $DISKS[0];if( $opt_dump ){        foreach my $i (0..$#DISKS)        {                print "Controller $i:\n";                foreach my $j (0..$#{$DISKS[0]})                {                        next if !defined $DISKS[$i][$j];                        print "\t$j\t$DISKS[$i][$j]\n";                }        }}# system disks$DISKS[0][0] = undef;$DISKS[1][0] = undef;my @spares;for(@DISKS[2..$#DISKS]){        push @spares, $_-&amp;gt;[0]                or die "Missing disk at $_:0\n";}my @pools;foreach my $i (1..$#{$DISKS[0]}){        foreach my $j (0..$#DISKS)        {                $pools[$i - 1][$j] = $DISKS[$j][$i]                        or die "Missing disk at $j:$i\n";        }}for(@pools){        $_ = "raidz @$_";}if( $opt_destroy ){        cmd("zpool destroy zdata");}if( $opt_create ){        cmd("zpool create -f zdata @pools spare @spares");}sub cmd{        my( $cmd ) = @_;        print "$cmd\n";        system($cmd) if !$dry_run;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-7906142702021342676?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/7906142702021342676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=7906142702021342676' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7906142702021342676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7906142702021342676'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2011/10/ubuntu-1110-on-sun-x4540-thumper.html' title='Ubuntu 11.10 on Sun X4540 (&quot;Thumper&quot;)'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-9168061599129096635</id><published>2011-07-05T15:26:00.003+01:00</published><updated>2011-07-05T15:31:12.725+01:00</updated><title type='text'>IPv6-Only Ubuntu 10.04 LTS</title><content type='html'>To load eth0 on start-up without a configured IPv4 address /etc/network/interfaces:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;auto eth0&lt;br /&gt;iface eth0 inet manual&lt;br /&gt;up ifconfig eth0 up&lt;br /&gt;# iface eth0 inet dhcp&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For the Google IPv6 public DNS servers add to /etc/resolv.conf:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;domain localdomain&lt;br /&gt;search google.com&lt;br /&gt;nameserver 2001:4860:4860::8888&lt;br /&gt;nameserver 2001:4860:4860::8844&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/29426273-9168061599129096635?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/9168061599129096635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=9168061599129096635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/9168061599129096635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/9168061599129096635'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2011/07/ipv6-only-ubuntu-1004-lts.html' title='IPv6-Only Ubuntu 10.04 LTS'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-926261652691079866</id><published>2011-02-11T15:49:00.004Z</published><updated>2011-02-11T15:59:47.570Z</updated><title type='text'>libxml2 and libxslt supported XPath functions</title><content type='html'>The following functions are supported by the libxml2 library for use in XPath statements and hence supported in libxslt for use in transforms. For more information see xpath.c in the libxml2 source.&lt;br /&gt;&lt;br /&gt;Note: string length is 'string-length' and not just 'length'!&lt;br /&gt;&lt;br /&gt;&lt;code&gt;last()&lt;br /&gt;position()&lt;br /&gt;count()&lt;br /&gt;id()&lt;br /&gt;local-name()&lt;br /&gt;namespace-uri()&lt;br /&gt;string()&lt;br /&gt;string-length()&lt;br /&gt;concat()&lt;br /&gt;contains()&lt;br /&gt;starts-with()&lt;br /&gt;substring()&lt;br /&gt;substring-before()&lt;br /&gt;substring-after()&lt;br /&gt;normalize-space()&lt;br /&gt;translate()&lt;br /&gt;not()&lt;br /&gt;true()&lt;br /&gt;false()&lt;br /&gt;lang()&lt;br /&gt;number()&lt;br /&gt;sum()&lt;br /&gt;floor()&lt;br /&gt;ceiling()&lt;br /&gt;round()&lt;br /&gt;boolean()&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/29426273-926261652691079866?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/926261652691079866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=926261652691079866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/926261652691079866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/926261652691079866'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2011/02/libxml2-hence-libxslt-supported-xpath.html' title='libxml2 and libxslt supported XPath functions'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-4386972891667606080</id><published>2011-01-19T13:47:00.007Z</published><updated>2011-01-19T16:31:06.649Z</updated><title type='text'>CMIS vs Google Documents API vs SWORD</title><content type='html'>The &lt;a href="http://tools.ietf.org/html/rfc4287"&gt;Atom protocol&lt;/a&gt; is a very simple mechanism for publishing news feeds - that is, date-ordered small bits of information. An Atom feed is a collection of Atom entries. Each entry contains some basic metadata (title, id) and may have links to other resources. Links of particular interest are 'edit' and 'edit-media' which, respectively, refer to the entry's metadata and media file.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;    &amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;    &amp;lt;entry xmlns="http://www.w3.org/2005/Atom"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;The Beach&amp;lt;/title&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;updated&amp;gt;2005-10-07T17:17:08Z&amp;lt;/updated&amp;gt;&lt;br /&gt;      &amp;lt;author&amp;gt;&amp;lt;name&amp;gt;Daffy&amp;lt;/name&amp;gt;&amp;lt;/author&amp;gt;&lt;br /&gt;      &amp;lt;summary type="text" /&amp;gt;&lt;br /&gt;      &amp;lt;content type="image/png"&lt;br /&gt;         src="http://media.example.org/the_beach.png"/&amp;gt;&lt;br /&gt;      &amp;lt;link rel="edit-media"&lt;br /&gt;         href="http://media.example.org/edit/the_beach.png" /&amp;gt;&lt;br /&gt;      &amp;lt;link rel="edit"&lt;br /&gt;         href="http://example.org/media/edit/the_beach.atom" /&amp;gt;&lt;br /&gt;    &amp;lt;/entry&amp;gt; &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://bitworking.org/projects/atom/rfc5023.html"&gt;Atom Publishing protocol&lt;/a&gt; (or AtomPub) provides a protocol to add new entries (i.e. to publish to feeds). AtomPub uses the HTTP POST, PUT and DELETE methods to, respectively, create, update or delete entries.&lt;br /&gt;&lt;br /&gt;To create an entry the client POSTs an Atom entry to the feed's URL. To update an entry the client PUTs an Atom entry to the entry's URL (replacing anything already there). And lastly, DELETEing an Atom entry URL destroys that entry. The protocol itself is quite readable so I suggest going there if you're lost!&lt;br /&gt;&lt;br /&gt;AtomPub is sufficient if you just want to post small entries in XML but often the client wants to e.g. publish a photo, which the new Atom entry will then refer to. There are several approaches to this but the simplest is to use the &lt;a href="http://tools.ietf.org/html/draft-gregorio-atompub-multipart-04"&gt;Atom Multipart Media Resource Creation&lt;/a&gt; mechanism, which bundles together the Atom entry and the media file into a single POST.&lt;br /&gt;&lt;br /&gt;Atom/AtomPub provides us with a fairly simple tool to publish items onto a Web site. As Institutional Repository (IR) developers we, unfortunately, require a more complex model than just a feed of entries containing one file each. We have more complex metadata and multiple files making up an object. An editorial workflow means items uploaded by users must first be checked by editors before they can be published. There are various other aspects to consider that I won't go into here.&lt;br /&gt;&lt;br /&gt;So we like the simplicity of Atom/AtomPub but it doesn't fulfil all of our requirements. Fortunately it is easy to extend AtomPub by injecting additional links and metadata into entries. These links can connect to other URLs that allow complex manipulations to be made on the underlying data structure (hence also to create more complex data structures). OASIS CMIS, SWORD and the Google Documents API are all extensions of AtomPub better known as "AtomPub Profiles". (I'm sure there are others but these are the obvious candidates for IR use.)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.oasis-open.org/cmis/CMIS/v1.0/cmis-spec-v1.0.html"&gt;OASIS Content Management Interoperability Services (CMIS)&lt;/a&gt; is over 200 pages long but, in part, describes an AtomPub profile. I concur with the sentiment &lt;a href="http://blogs.cetis.ac.uk/philb/2010/05/06/oasis-release-cmis/"&gt;here&lt;/a&gt; that being asked to implement CMIS won't make your developers happy. The model underpinning CMIS has a hierarchical folder structure. By supplying a special tag in a POST to a feed an Atom entry is created that points to another Atom feed (or 'folder'). In this way Atom entries are effectively typed to be either a 'document' or a 'folder'. Atom entries can be moved to other folders by POSTing them that folder's feed. There is lots more that CMIS adds in, to the extent that I forget what's at the beginning before I get to the end!&lt;br /&gt;&lt;br /&gt;&lt;code&gt;root feed&lt;br /&gt; |&lt;br /&gt; |-- document entry&lt;br /&gt; |&lt;br /&gt; |-- document entry&lt;br /&gt; |&lt;br /&gt; |-- folder entry&lt;br /&gt;      |&lt;br /&gt;      |-- folder feed&lt;br /&gt;           |&lt;br /&gt;           |-- document entry&lt;br /&gt;           |&lt;br /&gt;           |-- folder entry&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html"&gt;Google Documents API&lt;/a&gt; is in a different sphere to CMIS and SWORD. It is specific to Google's API so would need tweaking to be used elsewhere. Similarly to CMIS special syntax passed during a POST to a feed can create a folder-type Atom entry. This entry then points to a new feed which can in turn contain a mix of folder-entries or normal entries. Google support a number of parameters to modify the default behaviour of a URL, for instance downloading a document in a different format.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swordapp.org/"&gt;SWORD&lt;/a&gt; is an AtomPub profile developed to support deposit in IRs. SWORD v1 adds several HTTP headers to support more complex publishing behaviour. Often in the repository world one user will be depositing on behalf of another (doctoral student depositing her supervisor's old papers ...). To support this SWORD added the X-On-Behalf-Of header, which supplies the username of the user to deposit as - assuming the current user has permission to do that. Another part of SWORD v1 was to support more complex objects (i.e. multiple files) by defining 'packages'. Packages are collections of files and metadata and are archived together then published, with the server unpacking them to create the complex object. SWORD v2 (at time of writing) will look similar to the previous version but will define means for clients to interact with the packages after upload. &lt;a href="http://www.openarchives.org/ore/"&gt;OAI-ORE&lt;/a&gt; is used to describe the unpacked complex object while content-negotiation will be used to allow clients to retrieve the complex object in agreed format.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;repository feed&lt;br /&gt; |&lt;br /&gt; |-- document entry&lt;br /&gt; |&lt;br /&gt; |-- document entry&lt;br /&gt; |    |&lt;br /&gt; |    |-- OAI-ORE/RDF&lt;br /&gt; |&lt;br /&gt; |-- document entry&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;All three AtomPub Profiles probably work with a client speaking just AtomPub. The question that is left is which extension of AtomPub is best adopted to achieve our goals. I don't think any of these protocols are entirely satisfactory: SWORD feels like it is working around AtomPub rather than building on it (publishing .zip files?). It isn't clear what IPR Google's profile has nor whether they will take it in a different (incompatible) direction to what we need. CMIS, given it's industrial backing, will likely be essential in the corporate environment but is daunting in its complexity (and that normally means difficult to get right in practise).&lt;br /&gt;&lt;br /&gt;Regrettably my influence over any of these profiles is small - as developers we tend to be pushed more by political requirements ("your must support X") than technical merit. I just hope that, given the narrow range these profiles exist in, that they adopt the best bits of each other! (NB I would be interested to hear of any other potential AtomPub profiles)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-4386972891667606080?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/4386972891667606080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=4386972891667606080' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/4386972891667606080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/4386972891667606080'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2011/01/cmis-vs-google-documents-api-vs-sword.html' title='CMIS vs Google Documents API vs SWORD'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-1039162418433693432</id><published>2010-12-03T09:43:00.003Z</published><updated>2010-12-03T10:48:18.964Z</updated><title type='text'>Ubuntu Maverick 10.0 on Acer Revo 3700</title><content type='html'>These are some rough notes on what I needed to get Ubuntu Maverick 32bit working on the Acer r3700.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;wireless&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While the kernel rt2860pci driver will run the wireless ok it will cause a hard-lock when it is unloaded (e.g. during shutdown). Thanks to Wolfgang Kufner and Marcus Tisoft for providing a solution - replace the kernel driver with a patched driver from Ralink for the rt3090 (comment #9): &lt;a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/662288"&gt;https://bugs.launchpad.net/ubuntu/+source/linux/+bug/662288&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;sound over hdmi (stereo only tested)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unmute all digital outputs in Alsa (use right cursor + 'M' until they are all green):&lt;br /&gt;&lt;pre&gt;alsamixer -c 1&lt;br /&gt;sudo alsactl store&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Testing alsa:&lt;br /&gt;&lt;pre&gt;speaker-test -D plughw:1,7&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Setting pulseaudio to output via alsa:&lt;br /&gt;&lt;pre&gt;sudo gedit /etc/pulse/default.pa&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Uncomment and modify the line containing module-alsa-sink:&lt;br /&gt;&lt;pre&gt;  load-module module-alsa-sink device=hw:1,7&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;suspend&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fails to suspend ... haven't found a solution yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-1039162418433693432?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/1039162418433693432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=1039162418433693432' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/1039162418433693432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/1039162418433693432'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2010/12/ubuntu-maverick-100-on-acer-revo-3700.html' title='Ubuntu Maverick 10.0 on Acer Revo 3700'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-6684998903224269578</id><published>2010-06-09T12:26:00.002+01:00</published><updated>2010-06-09T12:30:41.449+01:00</updated><title type='text'>Enabling support for HTTPS in wkhtmltopdf</title><content type='html'>If you get the following error when attempting to web thumbshot an HTTPS-based site with &lt;a href="http://code.google.com/p/wkhtmltopdf/"&gt;wkhtmltopdf&lt;/a&gt; in Fedora Core 13:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;QSslSocket: cannot call unresolved function SSLv3_client_method&lt;br /&gt;QSslSocket: cannot call unresolved function SSL_CTX_new&lt;br /&gt;QSslSocket: cannot call unresolved function SSL_library_init&lt;br /&gt;QSslSocket: cannot call unresolved function ERR_get_error&lt;br /&gt;QSslSocket: cannot call unresolved function ERR_error_string&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You need to add some additional library links. As root do:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cd /usr/lib64&lt;br /&gt;ln -s libssl.so.10 libssl.so&lt;br /&gt;cd /lib64&lt;br /&gt;ln -s libcrypto.so.1.0.0 libcrypto.so&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Hopefully that will fix the problem!&lt;br /&gt;&lt;br /&gt;NB I resolved this by using strace to find out where wkhtmltopdf was attempting to find libcrypto and libssl (the problem being the static wkhtmltopdf build was looking for different versions than are installed on FC13):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;strace wkhtmltopdf https://mail.google.com/ gmail.pdf 2&gt;&amp;1 | less&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-6684998903224269578?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/6684998903224269578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=6684998903224269578' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/6684998903224269578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/6684998903224269578'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2010/06/enabling-support-for-https-in.html' title='Enabling support for HTTPS in wkhtmltopdf'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-5468129491462183554</id><published>2010-05-20T11:14:00.008+01:00</published><updated>2010-06-17T12:31:25.178+01:00</updated><title type='text'>Ubuntu 10.04 vnc-based login server</title><content type='html'>This recipe is for setting up a VNC login server. This allows you to use a VNC client to access a full GUI on a remote server. If instead you want to get VNC access to your desktop (or share with other users) you need to enable remote desktop.&lt;br /&gt;&lt;br /&gt;VNC connections are not encrypted so if you connect directly to the VNC server any login details will be sent in the clear.&lt;br /&gt;&lt;br /&gt;Install the required packages:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo apt-get install vnc4server xinetd gdm&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Restrict GDM to only listening to localhost by adding the following to &lt;tt&gt;/etc/hosts.allow&lt;/tt&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;gdm: ip6-localhost&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Enable XDMCP in GDM by setting up &lt;tt&gt;/etc/gdm/custom.conf&lt;/tt&gt; as:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;# GDM configuration storage&lt;br /&gt;&lt;br /&gt;[daemon]&lt;br /&gt;&lt;br /&gt;[security]&lt;br /&gt;&lt;br /&gt;[xdmcp]&lt;br /&gt;Enable=true&lt;br /&gt;HonorIndirect=false&lt;br /&gt;# following line fixes a problem with login/logout&lt;br /&gt;DisplaysPerHost=2&lt;br /&gt;&lt;br /&gt;[greeter]&lt;br /&gt;&lt;br /&gt;[chooser]&lt;br /&gt;&lt;br /&gt;[debug]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Create a new xinetd service &lt;tt&gt;/etc/xinetd.d/Xvnc&lt;/tt&gt; (adjust geometry to get different screen sizes):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;service Xvnc&lt;br /&gt;{&lt;br /&gt;        type = UNLISTED&lt;br /&gt;        disable = no&lt;br /&gt;        socket_type = stream&lt;br /&gt;        protocol = tcp&lt;br /&gt;        wait = no&lt;br /&gt;        user = nobody&lt;br /&gt;        server = /usr/bin/Xvnc&lt;br /&gt;        server_args = -inetd -query ip6-localhost -geometry 1280x800 -depth 16 -cc 3 -once -SecurityTypes=none&lt;br /&gt;        port = 5901&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Restart gdm (which will close any current logins!) and xinetd:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo service gdm restart&lt;br /&gt;sudo /etc/init.d/xinetd restart&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can then connect to the VNC server using:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;vncviewer localhost:5901&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/29426273-5468129491462183554?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/5468129491462183554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=5468129491462183554' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/5468129491462183554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/5468129491462183554'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2010/05/ubuntu-1004-vnc-based-login-server.html' title='Ubuntu 10.04 vnc-based login server'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-7433949211941004461</id><published>2010-03-29T12:40:00.003+01:00</published><updated>2010-03-29T13:17:25.628+01:00</updated><title type='text'>slapd configuration hints</title><content type='html'>I run an &lt;a href="http://www.openldap.org/"&gt;OpenLDAP&lt;/a&gt; instance to provide common login credentials for &lt;a href="http://subversion.apache.org/"&gt;Subversion&lt;/a&gt; and &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;OpenLDAP is one of those tools that can be nightmarish to get working. LDAP may be 'lightweight' but when put in a stack of browser-web server-LDAP it can be very tricky to work out what's going wrong and where. I spent a weekend fruitlessly trying to debug Apache auth when what I needed to do was stop/start rather than restart (stupid I know).&lt;br /&gt;&lt;br /&gt;In OpenLDAP 2.4 the configuration is now moved from a standard "slapd.conf" to LDIF configuration files (in Ubuntu under /etc/ldap/slapd.d/). These can be changed directly or updated via a ldapmodify/ldapadd.&lt;br /&gt;&lt;br /&gt;You can add configuration files via the ldapi interface:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo ldapmodify  -c -Y EXTERNAL -H ldapi:/// -f FILENAME.LDIF&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Beware that if you add a configuration that breaks slapd it will shut down right after you add the configuration. So it's a good idea to backup /etc/ldap/slapd.d/ before making any untested changes (restore/start slapd).&lt;br /&gt;&lt;br /&gt;A quick example for querying the LDAP server (note: -ZZ requires TLS, omit this for unsecured connections):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ldapsearch -ZZ -b dc=eprints,dc=org -h localhost -v -D cn=USERNAME,ou=people,dc=eprints,dc=org -w PASSWORD&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To start slapd in debugging/console mode do (see the OpenLDAP documentation for values for the -d argument):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;slapd -h 'ldap:/// ldaps:/// ldapi:///' -F /etc/ldap/slapd.d/ -d 16383&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you start slapd as root it will write its configuration files as root, so be careful to restore permissions on /etc/ldap/slapd.d/ back to openldap:openldap. If slapd starts as root but not from init.d it may be due to permissions problems (e.g. can't read a certificate file).&lt;br /&gt;&lt;br /&gt;I found it difficult to find a working example of creating a slapd database. Here's what I used to create an HDB-based database (paths are Ubuntu):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;# Load modules for database type&lt;br /&gt;dn: cn=module{0},cn=config&lt;br /&gt;objectClass: olcModuleList&lt;br /&gt;cn: module{0}&lt;br /&gt;olcModulePath: /usr/lib/ldap&lt;br /&gt;olcModuleLoad: {0}back_hdb&lt;br /&gt;&lt;br /&gt;# Create directory database&lt;br /&gt;dn: olcDatabase={1}hdb,cn=config&lt;br /&gt;objectClass: olcDatabaseConfig&lt;br /&gt;objectClass: olcHdbConfig&lt;br /&gt;olcDatabase: {1}hdb&lt;br /&gt;olcDbDirectory: /var/lib/ldap&lt;br /&gt;olcSuffix: dc=eprints,dc=org&lt;br /&gt;olcRootDN: cn=admin,dc=eprints,dc=org&lt;br /&gt;## FIXME below!&lt;br /&gt;olcRootPW: xxx&lt;br /&gt;olcLastMod: TRUE&lt;br /&gt;olcDbCheckpoint: 512 30&lt;br /&gt;olcDbConfig: {0}set_cachesize 0 4194304 0&lt;br /&gt;olcDbConfig: {1}set_lk_max_objects 2048&lt;br /&gt;olcDbConfig: {2}set_lk_max_locks 2048&lt;br /&gt;olcDbConfig: {3}set_lk_max_lockers 2048&lt;br /&gt;olcDbIndex: uid pres,eq&lt;br /&gt;olcDbIndex: cn,sn,mail pres,eq,approx,sub&lt;br /&gt;olcDbIndex: objectClass eq&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Translating permissions from slapd.conf to LDIF is relatively easy. If, like me, you need a few tries at getting this write use this as a template (ldapmodify as above will replace *all* existing olcAccess lines):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;# Set up permissions on dc=eprints,dc=org&lt;br /&gt;dn: olcDatabase={1}hdb,cn=config&lt;br /&gt;changetype: modify&lt;br /&gt;replace: olcAccess&lt;br /&gt;olcAccess: {0}to dn.base=""&lt;br /&gt;    by * read&lt;br /&gt;olcAccess: {1}to dn.base="cn=Subschema"&lt;br /&gt;    by * read&lt;br /&gt;olcAccess: {2}to dn.subtree="ou=people,dc=eprints,dc=org"&lt;br /&gt;    by group/groupOfUniqueNames/uniqueMember="cn=superusers,ou=groups,dc=eprints,dc=org" write&lt;br /&gt;    by self write&lt;br /&gt;    by users auth&lt;br /&gt;    by anonymous auth&lt;br /&gt;olcAccess: {3}to *&lt;br /&gt;    by * none&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Your permissions will likely need to be very different to those given here (which I've abbreviated anyway). Because I'm using apache mod_authz_ldap I have to provide a two-stage authentication, which requires having a 'superuser' account that can search for the relevant cn entry before performing the user authentication.&lt;br /&gt;&lt;br /&gt;I hope this saves somebody a headache!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-7433949211941004461?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/7433949211941004461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=7433949211941004461' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7433949211941004461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7433949211941004461'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2010/03/slapd-configuration-hints.html' title='slapd configuration hints'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-8592972127363357685</id><published>2010-03-19T10:31:00.002Z</published><updated>2010-03-19T10:48:39.666Z</updated><title type='text'>Check your house boundaries</title><content type='html'>I'm currently trying to purchase a house. We have an agreed price, the vendor has vacated the property but we're got stuck on legal issues going on 4 months.&lt;br /&gt;&lt;br /&gt;The issue is the previous owner to the current one expanded the garden into unused land, expanding the garden nearly twofold in size. She then sold the property on with land which wasn't on the title deed, leaving the current vendor trying to sell something she doesn't have title to. A conservatory extension has also been added without a permission required by a deed convenant. These issues only came to light after we agreed an offer and after I had spent money on a survey and the solicitor's initial searches.&lt;br /&gt;&lt;br /&gt;The Home Information Pack (HIP) does include a copy of the land registry entry. It was a simple process to marry-up the plot (as indicated on the land registry) with a satellite image of the plot. Having done this it is obvious that the plot does not correspond to the land registry, ringing alarm bells. With the benefit of hind-sight I could've avoided the financial exposure of surveys and solicitor costs before having the vendor sort these problems out.&lt;br /&gt;&lt;br /&gt;In a more general sense, it's unclear who if anyone checks that the boundaries for a property are the same as those shown on the land registry. My full structural survey didn't include a boundary survey and the solicitor doesn't visit the site (and are seemingly technology illiterate).&lt;br /&gt;&lt;br /&gt;As it seems with all house-buying processes the best person to actually check these things is you. When viewing a property's surrounding land you should definitely ask the estate agent whether the sale includes the entire plot and whether they have checked that against the land registry (which they should get as part of the HIP).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-8592972127363357685?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/8592972127363357685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=8592972127363357685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/8592972127363357685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/8592972127363357685'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2010/03/check-your-house-boundaries.html' title='Check your house boundaries'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-2268365904658857705</id><published>2009-09-07T10:27:00.002+01:00</published><updated>2009-09-07T10:35:43.147+01:00</updated><title type='text'>Generating Flash Video (FLV) using FFMpeg</title><content type='html'>I encountered a problem generating Flash Video (.flv) format files using the latest versions of ffmpeg and libmp3lame. The generated files didn't contain a duration so wouldn't play nicely in the &lt;a href="http://flv-player.net/players/"&gt;FLV Player&lt;/a&gt; embedded player (the player would buffer and play the 5 seconds buffer then stop).&lt;br /&gt;&lt;br /&gt;After some investigation I found the problem was due to a buffer error with the libmp3lame library that, while it didn't stop a file being generated, prevented ffmpeg embedding the duration in the flv output. Here's a &lt;a href="https://bugs.launchpad.net/ubuntu/+source/lame/+bug/401406"&gt;bug entry for Ubuntu&lt;/a&gt; but the OP erronously claims the encoding succeeds - it does to a degree, but any post-encoding operations by ffmpeg won't happen (setting the duration for FLV happens after the encoding).&lt;br /&gt;&lt;br /&gt;After much fruitless time trying to fix the broken lame library I used the AAC codec instead:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ffmpeg -i FOO.MPG -acodec aac FOO.FLV&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-2268365904658857705?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/2268365904658857705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=2268365904658857705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2268365904658857705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2268365904658857705'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2009/09/generating-flash-video-flv-using-ffmpeg.html' title='Generating Flash Video (FLV) using FFMpeg'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-2063577749202932958</id><published>2009-08-20T10:04:00.002+01:00</published><updated>2009-08-20T11:15:29.308+01:00</updated><title type='text'>Installing Microsoft Access 97 with Office 2007</title><content type='html'>Installing Access '97 onto a machine with a later version of Office already installed is troublesome. Before installing '97 follow these steps:&lt;br /&gt;&lt;br /&gt;Install the Jet 3.5 update (fixes problem with creating system database file):&lt;br /&gt;&lt;br /&gt;Jet 3.5 - http://support.microsoft.com/kb/172733&lt;br /&gt;&lt;br /&gt;Follow the instructions here in the "Access 2000 Is Already Installed" section:&lt;br /&gt;&lt;br /&gt;http://support.microsoft.com/kb/241141&lt;br /&gt;&lt;br /&gt;If you don't do the "hatten.ttf" trick you will get this error: "Microsoft Access can't start because there is no license for it on this machine".&lt;br /&gt;&lt;br /&gt;Now install Access '97 as normal (you may want to change it's installation directory).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-2063577749202932958?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/2063577749202932958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=2063577749202932958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2063577749202932958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2063577749202932958'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2009/08/installing-microsoft-access-97-with.html' title='Installing Microsoft Access 97 with Office 2007'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-7066997064500190471</id><published>2009-06-23T15:50:00.005+01:00</published><updated>2009-06-29T12:57:39.484+01:00</updated><title type='text'>Building xapian-bindings-php under Fedora Core 10</title><content type='html'>Fedora Core includes packages for &lt;a href="http://www.xapian.org/"&gt;Xapian&lt;/a&gt;, an Open Source Search Engine Library. Due to a &lt;a href="http://trac.xapian.org/ticket/191"&gt;licensing problem&lt;/a&gt; Fedora Core doesn't include the PHP bindings for Xapian. Regardless of licensing spats I need to use Xapian from PHP so worked out a patch for the spec file (below) and the steps needed to build the missing xapian-bindings-php RPM:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# rpm building dependencies&lt;br /&gt;sudo yum -y install rpmbuild rpmdevtools autoconf automake libtool zlib-devel gcc-g++&lt;br /&gt;# set up the RPM build tree (and macro file ~/.rpmmacros)&lt;br /&gt;rpmdev-setuptree&lt;br /&gt;# dependencies for building xapian-bindings&lt;br /&gt;sudo yum -y install xapian-core-devel python python-devel ruby ruby-devel php php-devel&lt;br /&gt;# download source RPM&lt;br /&gt;yumdownloader --source xapian-bindings-python&lt;br /&gt;# install source file&lt;br /&gt;rpm -ivh xapian-bindings-*&lt;br /&gt;# copy the patch below to rpmbuild/SPECS/xapian-bindings.spec.diff&lt;br /&gt;# patch the spec file&lt;br /&gt;patch --dry-run -p0 -d rpmbuild/SPECS/ -i xapian-bindings.spec.diff &amp;&amp; \&lt;br /&gt;patch -p0 -d rpmbuild/SPECS/ -i xapian-bindings.spec.diff&lt;br /&gt;# build all packages from the installed RPM spec file&lt;br /&gt;rpmbuild -ba rpmbuild/SPECS/xapian-bindings.spec&lt;br /&gt;# RPMs for your platform will be output to rpmbuild/RPMS/&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I needed to do this to build a xapian-bindings-php RPM, which required patching of the spec file:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;--- xapian-bindings.spec.orig   2008-12-08 13:20:55.000000000 +0000&lt;br /&gt;+++ xapian-bindings.spec    2009-06-23 15:45:05.000000000 +0100&lt;br /&gt;@@ -12,6 +12,7 @@&lt;br /&gt; BuildRequires: python-devel &gt;= 2.2&lt;br /&gt; BuildRequires: autoconf automake libtool&lt;br /&gt; BuildRequires: ruby-devel ruby&lt;br /&gt;+BuildRequires: php-devel php&lt;br /&gt; BuildRequires: xapian-core-devel == %{version}&lt;br /&gt; Source0: http://www.oligarchy.co.uk/xapian/%{version}/%{name}-%{version}.tar.gz&lt;br /&gt; Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)&lt;br /&gt;@@ -42,11 +43,21 @@&lt;br /&gt; indexing and search facilities to applications. This package provides the&lt;br /&gt; files needed for developing Ruby scripts which use Xapian&lt;br /&gt;&lt;br /&gt;+%package php&lt;br /&gt;+Group: Developer/Libraries&lt;br /&gt;+Summary: Files needed for developing PHP scripts which use Xapian&lt;br /&gt;+&lt;br /&gt;+%description php&lt;br /&gt;+Xapian is an Open Source Probabilistic Information Retrieval framework. It&lt;br /&gt;+offers a highly adaptable toolkit that allows developers to easily add advanced&lt;br /&gt;+indexing and search facilities to applications. This package provides the&lt;br /&gt;+files needed for developing Ruby scripts which use Xapian&lt;br /&gt;+&lt;br /&gt; %prep&lt;br /&gt; %setup -q -n %{name}-%{version}&lt;br /&gt;&lt;br /&gt; %build&lt;br /&gt;-%configure --with-python --with-ruby&lt;br /&gt;+%configure --with-python --with-ruby --with-php&lt;br /&gt; make %{?_smp_mflags}&lt;br /&gt;&lt;br /&gt; %install&lt;br /&gt;@@ -59,6 +70,9 @@&lt;br /&gt; mv %{buildroot}%{buildroot}/usr/share/doc/%{name}/python %{buildroot}/usr/share/doc/%{name}-python-%{version}&lt;br /&gt; mv %{buildroot}%{buildroot}/usr/share/doc/%{name}/ruby %{buildroot}/usr/share/doc/%{name}-ruby-%{version}&lt;br /&gt; rm -rf %{buildroot}%{buildroot}/usr/share/doc/%{name}/&lt;br /&gt;+# Fix location of PHP 5 include file&lt;br /&gt;+mkdir -p %{buildroot}/usr/share/php/&lt;br /&gt;+mv %{buildroot}%{buildroot}/usr/share/php5/xapian.php %{buildroot}/usr/share/php/xapian.php&lt;br /&gt;&lt;br /&gt; %clean&lt;br /&gt; [ "%{buildroot}" != "/" ] &amp;&amp; rm -rf %{buildroot}&lt;br /&gt;@@ -74,6 +88,11 @@&lt;br /&gt; %{ruby_sitearch}/_xapian.so&lt;br /&gt; %{ruby_sitelib}/xapian.rb&lt;br /&gt;&lt;br /&gt;+%files php&lt;br /&gt;+%defattr(-, root, root)&lt;br /&gt;+%doc AUTHORS ChangeLog COPYING NEWS README&lt;br /&gt;+/usr/lib64/php/modules/xapian.so&lt;br /&gt;+/usr/share/php/xapian.php&lt;br /&gt;&lt;br /&gt; %changelog&lt;br /&gt; * Mon Dec 08 2008 Adel Gadllah &lt;adel.gadllah@gmail.com&gt; 1.0.9-1&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/29426273-7066997064500190471?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/7066997064500190471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=7066997064500190471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7066997064500190471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7066997064500190471'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2009/06/building-xapian-bindings-php-under.html' title='Building xapian-bindings-php under Fedora Core 10'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-2423020236822141272</id><published>2009-03-10T10:05:00.006Z</published><updated>2009-03-10T10:20:17.236Z</updated><title type='text'>PPTP VPN under Ubuntu Intrepid 8.10</title><content type='html'>It seems there are some issues with PPTP VPN under Ubuntu's latest Intrepid (as-of March 2009). When I tried to connect I would get an error in /var/log/syslog of "EAP: peer reports authentication failure" (amongst the general PPTP messages). Depending on your PPTP server you may have the same problem or entirely unrelated issues but I suspect mine is a very common set-up.&lt;br /&gt;&lt;br /&gt;The Ubuntu bug here - https://bugs.launchpad.net/ubuntu/intrepid/+source/network-manager-pptp/+bug/259168 - contained the answer, which is to both enable MPPE and to disable EAP authentication.&lt;br /&gt;&lt;br /&gt;Here is what I did:&lt;br /&gt;&lt;br /&gt;1. Add a new VPN connection&lt;br /&gt;2. Only add the username (do not set the password in the connection settings):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_sa1flHl-no8/SbY88E5Mf3I/AAAAAAAAABQ/l26lpqPdOtA/s1600-h/connection.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 274px; height: 400px;" src="http://1.bp.blogspot.com/_sa1flHl-no8/SbY88E5Mf3I/AAAAAAAAABQ/l26lpqPdOtA/s400/connection.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5311499813333532530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Under "Advanced" check "Use Point-to-Point Encryption (MPPE)":&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_sa1flHl-no8/SbY9Cm0txYI/AAAAAAAAABY/wYKPpbAfu1s/s1600-h/mppe_setting.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 274px; height: 400px;" src="http://4.bp.blogspot.com/_sa1flHl-no8/SbY9Cm0txYI/AAAAAAAAABY/wYKPpbAfu1s/s400/mppe_setting.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5311499925520762242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. Next, run gconf-editor and find your VPN connection and add a new key of "refuse-eap"/String/"yes":&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_sa1flHl-no8/SbY9GrPq1LI/AAAAAAAAABg/dWzHno3hrCE/s1600-h/gconf_settings.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 314px;" src="http://1.bp.blogspot.com/_sa1flHl-no8/SbY9GrPq1LI/AAAAAAAAABg/dWzHno3hrCE/s400/gconf_settings.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5311499995427034290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. Connect using the VPN and give it your password.&lt;br /&gt;&lt;br /&gt;If you ever change settings using the Network Manager applet you will lose the "refuse-eap" setting and will need to re-add it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-2423020236822141272?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/2423020236822141272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=2423020236822141272' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2423020236822141272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2423020236822141272'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2009/03/pptp-vpn-under-ubuntu-intrepid-810.html' title='PPTP VPN under Ubuntu Intrepid 8.10'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_sa1flHl-no8/SbY88E5Mf3I/AAAAAAAAABQ/l26lpqPdOtA/s72-c/connection.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-1455499613580727141</id><published>2008-09-09T09:49:00.004+01:00</published><updated>2010-12-12T15:11:46.828Z</updated><title type='text'>Automounting a CIFS share in Ubuntu</title><content type='html'>autofs is a tool that mounts and unmounts devices on demand. To use autofs to mount CIFS shares (Windows/Samba) in Ubuntu do the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ sudo apt-get install autofs smbfs smbclient&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then edit /etc/auto.master and uncomment the smb line:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#&lt;br /&gt;# $Id: auto.master,v 1.4 2005/01/04 14:36:54 raven Exp $&lt;br /&gt;#&lt;br /&gt;# Sample auto.master file&lt;br /&gt;# This is an automounter map and it has the following format&lt;br /&gt;# key [ -mount-options-separated-by-comma ] location&lt;br /&gt;# For details of the format look at autofs(5).&lt;br /&gt;#/misc  /etc/auto.misc --timeout=60&lt;br /&gt;/smb    /etc/auto.smb&lt;br /&gt;#/misc  /etc/auto.misc&lt;br /&gt;#/net   /etc/auto.net&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Restart autofs:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ sudo /etc/init.d/autofs restart&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can now view and mount CIFS shares by changing to the directory /smb/HOSTNAME/SHARENAME e.g. to mount and change directory to "photos" on "bart":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ cd /smb/bart/photos&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can even list the shares on "bart" by doing:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ ls /smb/bart/&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What the default scripts don't provide is the ability to have per-connection mount options. In particular I wanted to mount some hosts read only and using UTF-8. I modified the /etc/auto.smb script as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;...&lt;br /&gt;&lt;br /&gt;# This file must be executable to work! chmod 755!&lt;br /&gt;&lt;br /&gt;key="$1"&lt;br /&gt;mountopts="-fstype=cifs"&lt;br /&gt;smbopts=""&lt;br /&gt;credfile="/etc/auto.smb.$key"&lt;br /&gt;optsfile="/etc/auto.smb.$key.opts"&lt;br /&gt;&lt;br /&gt;if [ -e $optsfile ]; then&lt;br /&gt;        . $optsfile&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I then created a connection specific file /etc/auto.smb.bart.opts containing:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mountopts="$mountopts,ro,iocharset=utf8"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now any mounts on "bart" will be set read only and use the UTF-8 character set.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-1455499613580727141?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/1455499613580727141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=1455499613580727141' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/1455499613580727141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/1455499613580727141'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2008/09/automounting-cifs-share-in-ubuntu.html' title='Automounting a CIFS share in Ubuntu'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-2970638694422300293</id><published>2008-09-04T08:47:00.005+01:00</published><updated>2008-09-04T10:42:59.048+01:00</updated><title type='text'>DG834/DG834G to OpenSwan VPN</title><content type='html'>The Netgear DG834 ADSL routers support IPSEC based Virtual Private Networks (VPN). The DG834 uses the Open Source Openswan software (&lt;a href="http://www.openswan.org/"&gt;http://www.openswan.org/&lt;/a&gt;). This blog provides the configuration details for how I connected an intranet LAN behind a DG834 to a Ubuntu-based Linux server in another LAN via the Internet.&lt;br /&gt;&lt;br /&gt;Here's my setup:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;NAS - [192.168.0.1] DG834G [starsky] - {inet}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; {inet} - [hutch] ADSL ROUTER [192.168.1.1] - Backup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Where:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The NAS is a Western Digital network drive.&lt;/li&gt;&lt;li&gt;The Backup is a normal PC running Ubuntu with a RAID 5 SATA storage.&lt;/li&gt;&lt;li&gt;Both ADSL connections have static IPs.&lt;/li&gt;&lt;li&gt;starsky's public IP is 10.1.1.1&lt;/li&gt;&lt;li&gt;hutch's public IP is 10.2.2.2&lt;/li&gt;&lt;li&gt;Backup is set as the DMZ server in ADSL ROUTER.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The goal was to copy data from the NAS to the Backup and to provide Windows share access to the Backup from the 192.168.0.0/24 subnet.&lt;br /&gt;&lt;br /&gt;The DG834G is running firmware version V2.10.22. I used the VPN Wizard to set up the VPN endpoint initially and then revised it in the VPN policy editor. The &lt;span style="font-style: italic;"&gt;Policy Name&lt;/span&gt; can be anything (e.g. "Bob"). As I want this connection to be up all the time I set the "IKE Keep Alive" and set the connection to "Initiator and Responder". The &lt;span style="font-style: italic;"&gt;Address Data&lt;/span&gt; is the host name of &lt;span style="font-family:courier new;"&gt;ADSL ROUTER&lt;/span&gt; (hutch). The &lt;span style="font-style: italic;"&gt;Pre-shared Key&lt;/span&gt; should be something difficult to guess.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_sa1flHl-no8/SL-V6w8ZTzI/AAAAAAAAAA8/TSmrpZ7p4ow/s1600-h/dg834g_vpn.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_sa1flHl-no8/SL-V6w8ZTzI/AAAAAAAAAA8/TSmrpZ7p4ow/s400/dg834g_vpn.png" alt="" id="BLOGGER_PHOTO_ID_5242073328085716786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On &lt;span style="font-family:courier new;"&gt;Backup&lt;/span&gt; I installed Openswan and followed the defaults during installation:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ sudo apt-get install openswan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I added to &lt;span style="font-family:courier new;"&gt;/etc/ipsec.conf&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;conn Bob&lt;br /&gt;        type=tunnel&lt;br /&gt;        leftid=10.2.2.2 # hutch&lt;br /&gt;        left=%defaultroute&lt;br /&gt;        leftsubnet=192.168.1.0/24&lt;br /&gt;        right=10.1.1.1 # starsky&lt;br /&gt;        rightsubnet=192.168.0.0/24&lt;br /&gt;        keyexchange=ike&lt;br /&gt;        auto=start&lt;br /&gt;        auth=esp&lt;br /&gt;        authby=secret&lt;br /&gt;        pfs=no&lt;br /&gt;        rekey=no&lt;br /&gt;        ike=3des-sha1-modp1024&lt;br /&gt;        esp=3des-sha1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And to &lt;span style="font-family:courier new;"&gt;/etc/ipsec.secrets&lt;/span&gt; (where &lt;span style="font-style: italic;"&gt;pre-shared key&lt;/span&gt; is the same as you entered into the DG834):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# secrets for "Bob"&lt;br /&gt;hutch starsky&lt;br /&gt;      10.2.2.2 10.1.1.1: PSK "pre-shared key"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I then restarted Openswan:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo /etc/init.d/ipsec restart&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once the VPN has established (look in &lt;span style="font-family:courier new;"&gt;/var/log/auth.log&lt;/span&gt;) I can access &lt;span style="font-family:courier new;"&gt;Backup&lt;/span&gt; by browsing to it's IP address: &lt;span style="font-family:courier new;"&gt;//192.168.1.100/SHARENAME&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I'm not sure with the above configuration you can access the 192.168.1 subnet from the 192.168.0 subnet. Answers on a postcard ...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ADSL ROUTER&lt;/span&gt; is actually a DG834Gv4, but the firmware seems to be buggy. In the default firmware it won't allow Windows shares to be accessed across it and in the latest firmware (V5.01.09) the VPN connection is unreliable and won't re-establish unless the router is rebooted.&lt;br /&gt;&lt;br /&gt;The above "works for me", but I'm by no means an IPSEC or Openswan expert so welcome any feedback/corrections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-2970638694422300293?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/2970638694422300293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=2970638694422300293' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2970638694422300293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2970638694422300293'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2008/09/dg834dg834g-to-openswan-vpn.html' title='DG834/DG834G to OpenSwan VPN'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sa1flHl-no8/SL-V6w8ZTzI/AAAAAAAAAA8/TSmrpZ7p4ow/s72-c/dg834g_vpn.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-5621799779277290214</id><published>2007-09-07T16:04:00.000+01:00</published><updated>2007-09-07T16:14:41.283+01:00</updated><title type='text'>Setting the output page size with ps2pdf</title><content type='html'>Ghostscript's ps2pdf utility converts Postscript format files into Adobe PDF. One drawback with this utility is that, by default, it always outputs in Ghostscript's default page size, regardless of the postscript document's page layout. This is probably sensible if the document is destined for printing, but at the moment PDF is also the best cross-platform way to express large spaces of graphics (in this case directed-tree graphs).&lt;br /&gt;&lt;br /&gt;I've managed to get around this - mostly - as follows:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use ImageMagick's identify to get the Postscript document dimensions:&lt;br /&gt;&lt;tt&gt;$ identify test.ps&lt;br /&gt;test.ps PS 609x1528 609x1528+0+0 PseudoClass 256c 909kb 0.020u 0:01&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Execute ps2pdf with the -dDEVICEWIDTHPOINTS and -dDEVICEHEIGHTPOINTS arguments&lt;br /&gt;&lt;tt&gt;$ ps2pdf -dDEVICEWIDTHPOINTS=679 -dDEVICEHEIGHTPOINTS=1598 test.ps test.pdf&lt;/tt&gt;&lt;/li&gt;&lt;/ol&gt;What I &lt;span style="font-weight: bold;"&gt;haven't&lt;/span&gt; been able to work out is how to suppress the margins in the resulting PDF. To avoid the Postscript document being cropped I added 70 points to the width and height.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-5621799779277290214?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/5621799779277290214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=5621799779277290214' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/5621799779277290214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/5621799779277290214'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/09/setting-output-page-size-with-ps2pdf.html' title='Setting the output page size with ps2pdf'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-3038632476830692298</id><published>2007-05-10T11:24:00.000+01:00</published><updated>2007-05-10T11:27:40.858+01:00</updated><title type='text'>Automatically creating home directories on login</title><content type='html'>PAM (pluggable authentication modules) allows you to automatically create home directories when a user first logs into a system. This means they will get the skeleton shell init scripts (so e.g. they get a decent prompt).&lt;br /&gt;&lt;br /&gt;Add to /etc/pam.d/system-auth (below the pam_deny.so line):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;session     required      /lib/security/$ISA/pam_mkhomedir.so skel=/etc/skel umask=0022&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That will automatically create a home directory in /home the first time any new user logs into the system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-3038632476830692298?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/3038632476830692298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=3038632476830692298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/3038632476830692298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/3038632476830692298'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/05/automatically-creating-home-directories.html' title='Automatically creating home directories on login'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-113647676459596640</id><published>2007-04-02T10:41:00.000+01:00</published><updated>2007-04-02T10:46:06.140+01:00</updated><title type='text'>Recovering a corrupted OpenLDAP database</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Warning! I do not give any warranty that this will work, it may make things worse. Always backup. A lot.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You will require the 'db_recover' utility for db4 (lives in the db-utils RPM).&lt;br /&gt;&lt;br /&gt;Backup your LDAP database (in &lt;span style="font-family: courier new;"&gt;/var/lib/ldap&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Stop the LDAP server if it is running:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; /etc/init.d/ldap stop&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Change to the OpenLDAP directory:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; cd /var/lib/ldap&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Execute db_recover:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; db_recover -v&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reset the file permissions:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; chown ldap.ldap *&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; chmod 600 *&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Restart the server:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; /etc/init.d/slap start&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-113647676459596640?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/113647676459596640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=113647676459596640' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/113647676459596640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/113647676459596640'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/04/recovering-corrupted-openldap-database.html' title='Recovering a corrupted OpenLDAP database'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-193332687816945361</id><published>2007-03-17T23:51:00.000Z</published><updated>2008-12-09T02:02:38.207Z</updated><title type='text'>ROAR Google Earth Tours</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_sa1flHl-no8/Rf7GTZ6tauI/AAAAAAAAAAU/YmeYesB4twU/s1600-h/roar_earth_02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_sa1flHl-no8/Rf7GTZ6tauI/AAAAAAAAAAU/YmeYesB4twU/s400/roar_earth_02.png" alt="" id="BLOGGER_PHOTO_ID_5043686669378480866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_sa1flHl-no8/Rf7GOZ6tatI/AAAAAAAAAAM/Kvf4wgC6NnY/s1600-h/roar_earth_01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_sa1flHl-no8/Rf7GOZ6tatI/AAAAAAAAAAM/Kvf4wgC6NnY/s400/roar_earth_01.png" alt="" id="BLOGGER_PHOTO_ID_5043686583479134930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've added KML support to ROAR, which enables repository locations to be overlayed on &lt;a href="http://earth.google.com/"&gt;Google Earth&lt;/a&gt;. Not all ROAR repositories are Geo-located and many are very roughly located.&lt;br /&gt;&lt;br /&gt;To add the ROAR overlay (in Google Earth) click the Add menu, Network Link and enter the following URL:&lt;br /&gt;&lt;pre&gt;http://roar.eprints.org/?action=kml&amp;type=institutional&amp;amp;order=recordcount&amp;kml=marker&lt;/pre&gt;Or, to get coloured boxes:&lt;br /&gt;&lt;pre&gt;http://roar.eprints.org/?action=kml&amp;amp;type=institutional&amp;order=recordcount&amp;amp;kml=height&lt;/pre&gt;All repositories (not just institutional):&lt;br /&gt;&lt;pre&gt;http://roar.eprints.org/?action=kml&amp;order=recordcount&amp;amp;kml=height&lt;/pre&gt;etc. Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-193332687816945361?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/193332687816945361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=193332687816945361' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/193332687816945361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/193332687816945361'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/03/roar-google-earth-tours.html' title='ROAR Google Earth Tours'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_sa1flHl-no8/Rf7GTZ6tauI/AAAAAAAAAAU/YmeYesB4twU/s72-c/roar_earth_02.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-979845056519891759</id><published>2007-03-11T18:36:00.000Z</published><updated>2007-03-11T19:50:59.017Z</updated><title type='text'>Hmmm Microsoft Windows Vista</title><content type='html'>I've tried out Vista on my 'leisure' machine but I'm going to have to revert to XP. Which is a shame, as I've found the Flip3D interface a lot nicer than XP's (accelerated windows are great).&lt;br /&gt;&lt;br /&gt;My gripes are (in no particular order) ...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hardware support is patchy: no support for my HP 2600N printer, no support for nForce 4 onboard sound ... not exactly rare or elderly bits of equipment.&lt;/li&gt;&lt;li&gt;Vista is a memory hog: why does it need to gobble 500MB of memory before you do anything? 2GB is now the required amount for a Vista-based gaming platform.&lt;/li&gt;&lt;li&gt;User Account Control spammage: under Unix if you give SUDO your password it'll remember for a period of time. In Vista you want to look in the logs, access Control Panel, access a sub-part of Control Panel, look at what's currently running ... that's a whole lotta 'Continue' clicking. Unless you disable it for a while (but you have to go digging for that).&lt;/li&gt;&lt;li&gt;Save-as no longer defaults to Documents (formerly known as 'My Documents), but to the user's unix-like home directory.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Connecting to VPN is a clickfest - 'Connect to' can't be a menu like XP. Control Panel retains that capability and it can be a menu if you revert to 'classic' start menu.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Medieval Total War doesn't work: ok, minor gripe, but it was the second game I tried running and it didn't work.&lt;/li&gt;&lt;li&gt;Creative X-Fi loses digital out: have to dig into the audio settings to disable/re-enable it to get it to work (audio devices have separate 'Configure' and 'Properties' options - surely you &lt;span style="font-style: italic;"&gt;configure &lt;/span&gt;the &lt;span style="font-style: italic;"&gt;properties &lt;/span&gt;of the device?).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Random freezing: I suspect some drivers aren't stable yet.&lt;/li&gt;&lt;li&gt;Changing the hibernate button to shut down is an &lt;a href="http://www.killernic.com/Support/index.php?_m=knowledgebase&amp;_a=viewarticle&amp;amp;kbarticleid=29"&gt;8-step process&lt;/a&gt; (buried deep inside the Control Panel power settings, nowhere near the button itself). Not exactly green to default to 'sleep'.&lt;/li&gt;&lt;li&gt;Searching the Start Menu: in the beginning there was the command-line, it had auto-complete (unless you were Microsoft). Then there were clickable icons in Windows (3.x). Then there was the Start Menu. Then there was searching the start menu, with auto-complete. Only 20 years to end up where we started. Perhaps it's a different paradigm, but so far it's mostly just annoying.&lt;/li&gt;&lt;/ol&gt;Vista has much improved auditing facilities (performance manager, logging etc.) for those expert enough to understand them or, at least, to glean the clues given. I disabled Shadow Copy (or at least I think I did) to stop the constant post-install disk thrash.&lt;br /&gt; &lt;br /&gt;In conclusion if you don't play games (or at least only play the newest games), have the very latest hardware (&lt;1 year), have oodles of memory (1GB+), want fancy visual effects and have £150 to burn then Vista is for you (NB I accessed Vista through site license).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-979845056519891759?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/979845056519891759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=979845056519891759' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/979845056519891759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/979845056519891759'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/03/hmmm-microsoft-windows-vista.html' title='Hmmm Microsoft Windows Vista'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-2825893411757334187</id><published>2007-03-07T12:11:00.000Z</published><updated>2007-03-07T14:18:10.956Z</updated><title type='text'>The case of the vanishing interoperability</title><content type='html'>So, you have your nice, shiny new repository. You've put a lot of effort into it to encourage your faculty to use it, perhaps even to learn to love it. You've made sure its &lt;a href="http://www.earlham.edu/%7Epeters/fos/googlecrawling.htm"&gt;indexable by Google&lt;/a&gt;, followed the relevant accessibility guidelines and generally made sure it's doing its primary job: making your faculty's work as accessible as possible. You did do that, right?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://espace.library.uq.edu.au/"&gt;UQ eSpace&lt;/a&gt; is the new incarnation of the University of Queensland's (AU) institutional repository which uses &lt;a href="http://sourceforge.net/projects/fez/"&gt;Fez&lt;/a&gt; (a Web interface to &lt;a href="http://www.fedora.info/"&gt;Fedora&lt;/a&gt;). Previously they were using &lt;a href="http://www.eprints.org/"&gt;GNU EPrints 2.&lt;/a&gt; (At this point I should let you know I am an EPrints developer, but right now I'm talking with my &lt;a href="http://roar.eprints.org/"&gt;ROAR&lt;/a&gt; hat on.) I've picked on UQ eSpace as an example, but I think these criticisms hold for a lot of IRs out there.&lt;br /&gt;&lt;br /&gt;What has drawn my attention to UQ eSpace is the disappearance of their OAI interface. In December 2006 it disappeared, resulting in UQ eSpace no longer being trackable in ROAR. I don't keep a proactive eye on these things, so it can take a while for me (or someone else) to notice something's disappeared. Ok, so as the developer of ROAR it's time to go hunting for the OAI interface ...&lt;br /&gt;&lt;br /&gt;But first, a little digression. In EPrints 3 we've added a note to EPrint's home page that gives the (human-readable) location of the OAI interface (e.g. see &lt;a href="http://demoprints3.eprints.org/"&gt;http://demoprints3.eprints.org/&lt;/a&gt;). That makes my life (with ROAR hat on) a whole lot easier. NB EPrints was already the easiest of the repository softwares to locate the OAI interface for because it always resided at /perl/oai2, compared to e.g. DSpace with its combinations of 'request' 'dspace' and 'oai' terms in the OAI URL. When you have an index of 800-odd entries, consistency and obvious descriptive data are the difference between spending 10 seconds or 10 minutes editing an entry. Some people might suggest I should email administrators but that assumes an obvious point of contact is provided (again, rarely the case).&lt;br /&gt;&lt;br /&gt;... back to the hunting. The first step in the trail of the OAI interface is whether its broken or gone. UQ eSpace returns a 404 at the ROAR-registered location (http://espace.library.uq.edu.au/oai). Not so good, but at least its a genuine 404 page. The interface has obviously gone and has been for a while. Next stop, the repository home page (http://espace.library.uq.edu.au/). All very pretty and familiar. Thumbs-up also for putting a clear description on the home page. But a scan of the home page shows no reference to OAI. How about Help? (I've not come across a site yet that provided the OAI interface in help, but one lives in hope)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="default"&gt;Help documentation will be available here soon.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="default"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt; Hmm, not so good. Let's take a look at the software behind UQ eSpace. A search for Fedora and OAI throws up a &lt;a href="http://www.fedora.info/download/2.0/userdocs/server/webservices/oai/index.html"&gt;promising lead&lt;/a&gt; - try accessing /fedora/oai. 404. Oh dear. Perhaps the &lt;a href="http://dev-repo.library.uq.edu.au/wiki/index.php/FAQ"&gt;Wiki for Fez&lt;/a&gt; might help?&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;In Fez 1.2 you have the option of configuring the Fedora OAI provider to provide access to your content.&lt;/blockquote&gt;Uh huh. So it exists, maybe, but where? Strangely enough I can find out the &lt;a href="http://dev-repo.library.uq.edu.au/wiki/index.php/EPrints"&gt;OAI location for EPrints&lt;/a&gt; from that same Wiki. How about &lt;a href="http://dev-fez.library.uq.edu.au/documentation/"&gt;Fez' documentation&lt;/a&gt;? 403 Forbidden. Hurumpf.&lt;br /&gt;&lt;br /&gt;It's at this point I hang up my &lt;a href="http://www.sherlock-holmes.co.uk/"&gt;deerstalker hat and smoking pipe&lt;/a&gt;. Perhaps the UQ eSpace OAI interface doesn't exist yet, but I wouldn't know either way. It's not difficult to help out services that want to promote you, you just need to put some clear guidance on your site: who are you? what do you contain? how do I harvest your content? how do I contact you? In fact, obvious stuff if you think about - it's what scholars having been doing for over a century.&lt;br /&gt;&lt;br /&gt;Ordinarily I'd skip past UQ eSpace without comment but they've triggered another of my pet-hates. A well-designed, modern Web page should consist of well-structured content in HTML/XHTML and one or more style sheets that translate that content into the appearance you want. This enables better accessibility (for poor-sighted/disabled users), cross-browser compatility and cross-device compatibility (screens, printers, hand-held devices etc.). There are many accessibility benefits to this: the page is laid out in its logical structure, allowing screen readers to work, users can increase colour contrast and all text can be scaled by the user (vs. text rendered as images). I use a plugin for Firefox called &lt;a href="https://addons.mozilla.org/firefox/60/"&gt;Web Developer&lt;/a&gt; that with a single keystroke can disable all styling on a Web page. My definition of a well-designed Web page is that when you disable styling, it falls out into a well structured, logical page. That means all the custom layout/colouring/backgrounds should disappear. Let's try my test on UQ eSpace's home page?&lt;br /&gt;&lt;br /&gt;With styling UQ eSpace has a top bar, two columns and a bottom bar. This is a classic layout with high-level, little-used options and branding at the top (links to the institution, user-login functions), content and news in the two columns and technical data at the bottom (but no contact details). Fonts are changed to sans-serif and reduced in size (a little unfriendly to high-res screens). Various title bars have background colouring/images.&lt;br /&gt;&lt;br /&gt;Without styling not a lot changes: the fonts revert to serif, links revert to their default colours. The column layout is generated through tables - which accessibility guidelines will tell you should only be used for data (allowing a screen-reader user to skip over large data sets). The top bar links are rendered as a single mapped image: for our poor-sighted user who can't read the (small) text-as-images, or is using a screen reader lets try disabling images. Unfortunately the university links now disappear completely (no ALT-tags). The backgrounds persist (which makes it difficult to get a high-contrast or printer-friendly version).&lt;br /&gt;&lt;br /&gt;Why does this matter? Fez is being widely implemented in Australia and is promoted as a competitor to existing repository interfaces. I strongly believe that good Web design does not have to take longer or result in poorer interface design when compared to circa Netscape 5 technology. It does however require an appreciation of and adherance to standards - after all, that's what they're there for. Before I'm accused of throwing bricks in glass houses I do acknowledge that accessibility is tough but I've found modern XHTML/CSS Web design isn't difficult and can go a long way towards a better structured Web (if for no other reason than to get pages that are printer-friendly).&lt;br /&gt;&lt;br /&gt;I hope UQ eSpace and the Fez developers will in future address both interoperability (i.e. where the heck is it?) and accessibility. I watch and wait with interest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-2825893411757334187?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/2825893411757334187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=2825893411757334187' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2825893411757334187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/2825893411757334187'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/03/case-of-vanishing-interoperability.html' title='The case of the vanishing interoperability'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-521608289198428679</id><published>2007-02-23T17:39:00.001Z</published><updated>2008-09-17T11:41:15.739+01:00</updated><title type='text'>Removing Duplicate RPM Packages</title><content type='html'>To find a list of packages that have a newer version installed use:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;rpm --last -qa | perl -n -e '/^(\S+)-\S+-\S+/; print "$&amp;amp;\n" if $SEEN{$1}; $SEEN{$1} ||= $_;' | sort | uniq &gt;dupes.txt&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;The &lt;tt&gt;--last&lt;/tt&gt; argument causes RPM to list packages by install date (newest first). We remove any packages with the same name as a more recently installed package.&lt;br /&gt;&lt;br /&gt;To actually remove the packages (as root):&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;for i in $(cat dupes.txt); do rpm -e $i &amp;amp;&amp;amp; echo $i; done&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Depending on dependencies you may need to run this more than once.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-521608289198428679?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/521608289198428679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=521608289198428679' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/521608289198428679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/521608289198428679'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/02/removing-duplicate-rpm-packages.html' title='Removing Duplicate RPM Packages'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-7838612507377546496</id><published>2007-01-07T21:53:00.000Z</published><updated>2007-01-07T22:14:08.712Z</updated><title type='text'>Changing the Starting Frame of a Fluid Animation in Blender</title><content type='html'>I've become somewhat enamoured  with &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt; recently (the open source 3D modeling and ray-tracing program). Once you've got a handle on the interface it's a really functional modeler, at least with my limited experience.&lt;br /&gt;&lt;br /&gt;Anyway, a particularly 'cool' feature in Blender is support for fluid dynamics. This allows you to define some 'fluid' and fling it around inside a three dimensional space. Something I got stuck on however was how to get the fluid animation to start after the first frame. If you know beforehand what frame you want to start the animation at you can set the start-frame and away you go. If, like me, you just dived in there and didn't want to waste the fluid calculation then you need to get your hands a bit dirty.&lt;br /&gt;&lt;br /&gt;The meshes generated from the fluid calculation are stored in a directory with file names like 'project_blah_XXXX.gz' where XXXX is the frame number. So if you want to shift the starting frame you need to rename all these files, changing the numbers to start at your needed frame. Here's a Perl script that'll do this for you (you ought to take a backup before doing this!):&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt; #!/usr/bin/perl&lt;br /&gt;# Copy this to the directory containing your fluid calculation&lt;br /&gt;# files then do: perl rename.pl &lt;starting&gt;&lt;br /&gt;&lt;br /&gt;die "Usage: $0 &lt;starting&gt;\n" unless @ARGV;&lt;br /&gt;my $SFRAME = shift;&lt;br /&gt;&lt;br /&gt;opendir(DIR,".");&lt;br /&gt;my @files = sort { $b cmp $a } grep { $_ !~ /^\./ } readdir(DIR);&lt;br /&gt;closedir(DIR);&lt;br /&gt;foreach(@files)&lt;br /&gt;{&lt;br /&gt;  next unless /_\d{4}\./;&lt;br /&gt;  my $new = $_;&lt;br /&gt;  $new =~ s/(\d+)/sprintf("%04d",$1+$SFRAME)/eg;&lt;br /&gt;  print "$_\t$new\n";&lt;br /&gt;  rename($_,$new);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-7838612507377546496?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/7838612507377546496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=7838612507377546496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7838612507377546496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/7838612507377546496'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2007/01/changing-starting-frame-of-fluid.html' title='Changing the Starting Frame of a Fluid Animation in Blender'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-116369140889724340</id><published>2006-11-16T15:04:00.000Z</published><updated>2006-11-16T15:36:48.963Z</updated><title type='text'>Google CSE added to the Registry of Open Access Repositories</title><content type='html'>A few weeks ago OpenDOAR &lt;a href="http://www.ecs.soton.ac.uk/~harnad/Hypermail/Amsci/5743.html"&gt;announced&lt;/a&gt; the inclusion of a experimental Google CSE ("customised search engine"). Google released their CSE (or 'co-op') tool on the 26th October, and its a testiment to Google's skill at identifying new niches that CSE has already gained such interest.&lt;br /&gt;&lt;br /&gt;Being OpenDOAR's nearest (good natured) competitor its incumbent on me to make sure we don't fall behind in the technical stakes - quality of content is a very subjective issue that I'll leave to others to judge. So, what's involved in setting up a CSE?&lt;br /&gt;&lt;br /&gt;Google CSE is the normal Google web index, but constrained to a human-edited list of web sites. The CSE is identified by a unique (Google-generated) identifier that, when passed to Google co-op with a query, returns matching pages from only those sites. As the creator of a CSE you can either point users at the CSE's virtual home page (at Google) or embed it in your own site. The level of integration into your own site's look and feel depends on how long you're prepared to spend implementing javascript wrappers. There are, however, some constraints made by Google, in particular commercial users must allow advertising to be included, and the "Google Custom Search" line must be included either in the search box or near by (which the Google-supplied code snippets do for you).&lt;br /&gt;&lt;br /&gt;What Google CSE means for us registries is we can now (theoretically) provide full-content searches of registered repositories with a minimal of effort. This is what OpenDOAR have done, and we've followed suit in our own &lt;a href="http://roar.eprints.org/?action=google"&gt;search interface&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In addition to constraining the search to given sites Google CSE provides 'refinements' - editor-provided key terms that either filter the list of sites, or weight certain sites higher in the search results. Refinements allow the CSE creator to provide sub-customised searches to more finely control the search results, the typical example being to create a CSE for a topic area (e.g. tropical diseases) then to provide refinements for different types of users (e.g. medical practitioners).&lt;br /&gt;&lt;br /&gt;To create the Google CSE and refinements for ROAR I created two exports: the &lt;a href="http://roar.eprints.org/?action=tsv"&gt;TSV&lt;/a&gt; and &lt;a href="http://roar.eprints.org/?action=cse"&gt;Context&lt;/a&gt; files. The TSV file contains the URLs of the sites to be included, labels for each site and the site's weighting. A label is an identifier that can be used to refine search results (e.g. Australian repositories are labelled with 'country_au').&lt;br /&gt;&lt;br /&gt;The Context file contains the basic search engine configuration (title, description etc.) and what effect refinements have on the search results. Refinements can change the weighting of sites, alter the query or filter out given sites. In the ROAR CSE I've set all the labels to 'filter' (i.e. only include sites that contain the given label).&lt;br /&gt;&lt;br /&gt;So, that's the theory, but in practise Google CSE refinements don't appear to work like that (or work at all). If you try out the ROAR search, first of all you'll notice you get very few matches back and secondly you actually get more matches the more refinements you use. Hopefully this will be resolved in time, in the meanwhile prepare to be confused!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-116369140889724340?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/116369140889724340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=116369140889724340' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/116369140889724340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/116369140889724340'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/11/google-cse-added-to-registry-of-open.html' title='Google CSE added to the Registry of Open Access Repositories'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115918472004482434</id><published>2006-09-25T12:27:00.002+01:00</published><updated>2009-01-19T10:58:51.688Z</updated><title type='text'>PHP gd and Perl gd segfaulting</title><content type='html'>I make a lot of use of GD (through charts) in my services, which also use a mix of Perl and PHP scripts. Unfortunately PHP defaults to using an internal copy of the GD library that, when used, causes a segfault if GD is also used by mod_perl (which will use the system GD library). The segfault is the result of attemping to use two versions of the GD library at once.&lt;br /&gt;&lt;br /&gt;The solution to this problem is to use the system GD library in PHP. I use RedHat enterprise on my servers and want to use RPMs to allow ease of keeping up to date with bug fixes. Fortunately it's pretty easy to modify the RPM source to fix this isolated problem, without having to install a compiled PHP.&lt;br /&gt;&lt;br /&gt;Download and install the source RPM (NB make sure you install the correct version):&lt;br /&gt;&lt;pre&gt;up2date --get-source php&lt;br /&gt;rpm -ivh /var/spool/up2date/php-*.src.rpm&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Change to the rpm source build directory:&lt;br /&gt;&lt;pre&gt;cd /usr/src/redhat&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Create a new file called 'php.spec.patch' containing this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;--- php.spec.orig       2006-09-25 12:00:23.000000000 +0100&lt;br /&gt;+++ php.spec    2006-09-25 12:00:44.000000000 +0100&lt;br /&gt;@@ -433,7 +433,7 @@&lt;br /&gt;        --with-exec-dir=%{_bindir} \&lt;br /&gt;        --with-freetype-dir=%{_prefix} \&lt;br /&gt;        --with-png-dir=%{_prefix} \&lt;br /&gt;-       --with-gd=shared \&lt;br /&gt;+       --with-gd=shared,/usr \&lt;br /&gt;        --enable-gd-native-ttf \&lt;br /&gt;        --without-gdbm \&lt;br /&gt;        --with-gettext \&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Patch the php.spec file (-l ignores whitespace):&lt;br /&gt;&lt;pre&gt;patch -l SPECS/php.spec &amp;lt;php.spec.patch&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Build the binary RPM (will take a while):&lt;br /&gt;&lt;pre&gt;rpmbuild -bb SPECS/php.spec&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Install the new php-gd rpm:&lt;br /&gt;&lt;pre&gt;rpm -Uvh RPMS/php-gd-*.rpm&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You may want to add php-gd to the skip-list in /etc/sysconfig/rhn/up2date, otherwise if RedHat update php it'll cause your Web server to seg fault.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115918472004482434?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115918472004482434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115918472004482434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115918472004482434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115918472004482434'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/09/php-gd-and-perl-gd-segfaulting.html' title='PHP gd and Perl gd segfaulting'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115815413229032183</id><published>2006-09-13T14:21:00.000+01:00</published><updated>2006-09-13T14:28:52.306+01:00</updated><title type='text'>Javascript Graphs</title><content type='html'>Citebase now has the &lt;a href="http://www.citebase.org/correlation"&gt;Correlation Generator&lt;/a&gt; again, which was always in need of some fixing.&lt;br /&gt;&lt;br /&gt;I've replaced the Java-based charts with Javascript ones, based on Emil A Eklund's &lt;a href="http://webfx.eae.net/dhtml/chart/chart.html"&gt;Chart Widget&lt;/a&gt;. The advantages of the Javascript charts are that they load quicker (not requiring a Java VM) and that it's much easier for me to customize them to my needs.&lt;br /&gt;&lt;br /&gt;While the chart widget is compatible with IE and Safari I haven't bothered to put in all the wrapper code for the AJAX and element searching in my glue code - I figure this is such a specialist tool it's not unreasonable to expect users to download Firefox.&lt;br /&gt;&lt;br /&gt;While I'm happy enough with the implementation for the Generator to be published, the charts could really do with a mechanism to zoom - most of the interesting stuff in citation and download data happens very quickly, hence can be eclipsed by the 'long-tail'.&lt;br /&gt;&lt;br /&gt;Regardless of the current drawbacks, I think it looks and works pretty well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115815413229032183?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115815413229032183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115815413229032183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115815413229032183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115815413229032183'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/09/javascript-graphs.html' title='Javascript Graphs'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115598284639208658</id><published>2006-08-19T11:06:00.000+01:00</published><updated>2006-08-19T11:24:29.576+01:00</updated><title type='text'>NFS Server Gone Away</title><content type='html'>So your servers are happily serving away when somebody knocks over your (inaccessible) NFS server. What happens next seems to be dependent on the mount settings used, but the bottom line is any processes that attempt to open the mounted NFS system will hang in 'D' state (most likely nfs_wai(t)). As far as I can tell 'D' means the process is locked in a kernel call, which means the process itself can't be touched. And you certainly can't unmount (umount -f) the file system because 1) there are files open by those unkillable processes and 2) in order to unmount an NFS mount the NFS server needs to be contacted to let you know there's no file locks open (except it isn't there!).&lt;br /&gt;&lt;br /&gt;How do you recover an NFS client that has been overrun with 'D' state processes? The answer is remarkably quick and simple, if you know how. You can't kill 'D' state processes and you can't restart (because the system will hang while trying to kill them). The reason it hangs is because NFS is trying to contact the NFS server, not getting a response, timing out and trying again. But, bizarrely, if you give the NFS server's IP address to another machine, NFS will connect, find the share is no longer there and give up. So:&lt;br /&gt;&lt;br /&gt;ifconfig eth0 add &amp;lt;NFS server IP address&amp;gt;&lt;br /&gt;&lt;br /&gt;Which should cause all your nfs_wait processes to reset, so you can kill any dead processes and unmount the file system. Removing the IP address requires adding the sub-interface name (because you just added two IP addresses to one interface):&lt;br /&gt;&lt;br /&gt;ifconfig eth0:0 del &amp;lt;NFS server IP address&amp;gt;&lt;br /&gt;&lt;br /&gt;You probably need NFS running on the temporary machine too ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115598284639208658?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115598284639208658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115598284639208658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115598284639208658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115598284639208658'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/08/nfs-server-gone-away.html' title='NFS Server Gone Away'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115331038265430830</id><published>2006-07-19T12:55:00.000+01:00</published><updated>2006-07-19T13:01:18.356+01:00</updated><title type='text'>Managing LDAP Administration</title><content type='html'>Managing LDAP seems like a tool that creates a lot of problems while solving others. One major headache I have with LDAP is making trivial changes to database entries, for example if I've had a bug that hasn't created an entry correctly (me, bugs, never!). The best tool I've found for making tweaks to an LDAP installation is ldapadmin by Tihomir Karlovic:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ldapadmin.sourceforge.net/"&gt;&lt;br /&gt;http://ldapadmin.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Much love to tools that work and do what you want them to do!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115331038265430830?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115331038265430830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115331038265430830' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115331038265430830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115331038265430830'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/07/managing-ldap-administration.html' title='Managing LDAP Administration'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115262648107888436</id><published>2006-07-11T14:51:00.000+01:00</published><updated>2006-07-11T15:01:21.093+01:00</updated><title type='text'>Making Word Documents Public</title><content type='html'>Having been at the sharp end of trying to retrieve information from various file formats I've come to the conclusion that editing formats are easier to get information out of than distribution formats. Or to put that another way, in 99% of cases, give me the Microsoft Word file rather than the Adobe PDF.&lt;br /&gt;&lt;br /&gt;But the trouble with Microsoft Word (being Microsoft) is it has a habit of letting other people use your resources without your wishing them to. In Word this might be exposing sensitive (or embarrassing) comments or providing an edit history through the 'track changes' facility. Fortunately Microsoft heeded the numerous occasions where an organisation has been caught out and produced the Remove Hidden Data tool (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=144E54ED-D43E-42CA-BC7B-5446D34E5360&amp;displaylang=en"&gt;download RHD here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;After you install the RHD tool, open your Word file then click "Remove Hidden Data" to save the document to a new, clean(er) file. Of course, if you're handling very sensitive stuff then you probably want to print-to-PDF and accept your resulting file will be less functional.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115262648107888436?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115262648107888436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115262648107888436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115262648107888436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115262648107888436'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/07/making-word-documents-public.html' title='Making Word Documents Public'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115254737992840828</id><published>2006-07-10T16:45:00.000+01:00</published><updated>2006-07-10T17:03:00.600+01:00</updated><title type='text'>Managing Statistics</title><content type='html'>Citebase provides a number of different analyses of citation and usage (hits/downloads) data. Part of the problem with this is how to provide a reasonable way to access disparate and relatively complex information. In re-designing Citebases interface I've introduced two new features that will hopefully make using its statistical data easier.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6229/3134/1600/citebase_shot1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6229/3134/320/citebase_shot1.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see in the image these two new features are tabbed-navigation of the various citation-based navigations and usage breakdowns (using javascript + iframes). The highlighted (in red) is a "sparkline" that gives a very compact indication of the citation history. I'm not sure if this is the creator of sparklines, but I've borrowed the concept from Edward Tufte - see &lt;a href="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR&amp;topic_id=1&amp;topic="&gt;Ask E.T.: Sparklines&lt;/a&gt;. While my implementation is definitely 'cool' it would be nice to use the final point technique (the little red dot on Tufte's examples) as well, but I've not thought of how to utilise that for citations (where the neighbouring number is the &lt;span style="font-weight:bold;"&gt;total&lt;/span&gt; citations, which would necessitate having a cumulative graph (99% of which would be a straight line on such a small scale). Perhaps when Citebase goes live someone will come up with an inspired suggestion.&lt;br /&gt;&lt;br /&gt;It's surprising just how much better Citebase looks when the spacing is fixed (subscript and superscript as used in formulas ordinarily cause the HTML line spacing to vary). Along with improvements to the abbreviating code and a general increase in images (to make more curved and shadowed space) I think it looks pretty spiffy.&lt;br /&gt;&lt;br /&gt;Now I have the user registration code and statistical graphing stuff left to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115254737992840828?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115254737992840828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115254737992840828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115254737992840828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115254737992840828'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/07/managing-statistics.html' title='Managing Statistics'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115088672445331357</id><published>2006-06-20T18:15:00.000+01:00</published><updated>2006-06-21T11:45:24.496+01:00</updated><title type='text'>Open access and science</title><content type='html'>I've been asked to contribute to a 'focus' section on open access:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;More precisely, do you think that open-access publication speeds up scientific dialog between researchers and, consequently, should be extended to the whole scientific literature as quickly as possible?&lt;br /&gt;Do you really think that Open-Access Articles Have a Greater Research Impact?&lt;br /&gt;If yes, what are, according to you the main consequences on communication between scientists?&lt;br /&gt;&lt;br /&gt;Nico Pitrelli (Deputy editor of JCOM - Journal of Science Communication)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A number of potential and identified benefits have been associated with open access (providing free access to users of research literature). Of foremost interest is whether open access papers receive more citations (and downloads) than papers that are only available through a subscription or similar payment. Eysenbach's work is the latest study to confirm the general finding that open access does increase citation impact. (Obviously, once all research is open access, there can be no citation advantage attributable to the free/non-free comparison.)&lt;br /&gt;&lt;br /&gt;Eysenbach has attempted to measure only the free/non-free variable by comparing articles in a journal with an open access option and has argued that other studies mix up a number of potentially conflated variables (number of authors, chronology issues etc.). Regardless of the finer points I argue that so far the evidence points towards open access articles receiving more citations and, given there is very little cost in providing open access (by author self-archiving the pre-print and/or post-print), the potential benefits outweigh the 'risks'. This isn't to say authors will suddenly see citations where they didn't before - these studies compare averages and also seem to indicate those papers that would already be high impact benefit most from open access.&lt;br /&gt;&lt;br /&gt;There are other potential benefits that open access could provide but perhaps aren't of immediate interest to authors. One of these is that the duration of the research cycle is reduced: an author writes an article, is read by other authors that then cite that article in their own articles. In physics this is the result of rapid pre-printing - authors write an article and simultaneously post the pre-print to the physics arXiv e-print service as well as submit to a journal (several physics publishers even accept submissions direct from the arXiv). Rapid, free access to pre-prints in physics has dramatically improved the rate of communication in that subject. This isn't to say journals have been side-tracked in physics - far from it - as it appears (in studies performed by Michael Kurtz) that authors cite the pre-print, then switch to reading and citing the journal article once published.&lt;br /&gt;&lt;br /&gt;Another potential benefit of open access is that it opens up the market for providing services to researchers. Putting all scholarly research on the web, free to access, will allow it to be indexed by a wide range of services. We have already seen Google move into this area with their Scholar service and there are similar moves afoot by the other big players (Microsoft and Yahoo). There is also considerable interest by funding agencies in using open access to help promote the research they fund (Wellcome Trust in the UK). There are also research tools built by the academic community - Citeseer (for computer science) and my own Citebase (for the arXiv). These tools gain their usefulness from the seamless way a user can move from the service to the full-text, without having to pay access fees. They are also potentially more powerful than existing bibliographic databases, because the full-text is freely accessible hence can be made fully searchable.&lt;br /&gt;&lt;br /&gt;The consequences for scientists are twofold. Firstly as authors they will increasingly be expected or even required to provide free access to their research results, either by publishing in open access journals or by author self-archiving their articles in an institutional or subject-based repository. These mandates may come from their institution, funding agency or even government. As users of research material scientists will find it easier to locate and gain access to the full-text of research articles (I already find a Google web search to be the quickest way to locate a cited paper). They will also increasingly see articles being automatically and autonomously measured and evaluated by third-party services. This is both to serve the needs of research agencies (who need to evaluate the impact of the researchers they fund) but also to provide better search and alerting services.&lt;br /&gt;&lt;br /&gt;Ultimately open access is about using the power of the web - to provide instant, near-free access to information - to maximise the benefit of the investment in research. To do anything else is a betrayal of the public investment in science.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115088672445331357?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115088672445331357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115088672445331357' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115088672445331357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115088672445331357'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/06/open-access-and-science.html' title='Open access and science'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115030387638882498</id><published>2006-06-14T17:27:00.000+01:00</published><updated>2006-06-14T17:53:34.623+01:00</updated><title type='text'>I see data but do you CDATA?</title><content type='html'>For a technology so widely used HTML and family can throw up a lot of roadblocks in the way of progress. I've been working with javascript ('AJAX') with a view to improving the responsiveness of Citebase's web interface. An important requirement is to maintain a 'single-page-interface' but to allow differing analyses and links to be loaded into that page through a menu-like mechanism: ordinarily I'm a fan of keeping-it-simple, which in this case would mean as many different pages as there are functions, but I suspect most users would get lost in the myriad of page reloads.&lt;br /&gt;&lt;br /&gt;One javascript library (the J in AJAX) suggested to me by a colleague was 'DOJO' ( http://www.dojotoolkit.org/), which provides a lot of javascript-based widgets that turn your web page into something more akin to a windows GUI. But, and you'll notice this if you go to that page, it breaks the forward/backward browser history navigation. In which case we're somewhere closer to the entire-web-page in a Macromedia flash file than I'm comfortable with. (I dislike flash-based things because it prevents me using the neat tools that Firefox otherwise provides, like forward/backward navigation on my 5-button mouse, keyboard scrolling/searching/link selection etc.)&lt;br /&gt;&lt;br /&gt;After several days trying different techniques I've ended up back where technology was several years ago: the iframe. Coupled with a bit of javascript to make interactive menus (so we don't have to go to the server to get more options) iframes keep the forward/backward navigation working and can be automatically stretched by javascript so as to fit the content i.e. no scrollbars floating around the middle of a page. Now the question is how I provide hooks in the page for non-javascript, non-iframe users - least I forget how web pages look to web spiders.&lt;br /&gt;&lt;br /&gt;Where does CDATA come into all this? It turns out if you XHTML DOCTYPE a libxml2 DOM then try to add a 'script' element libxml2 decides the text must be a CDATA section, but doesn't render it in a fashion compatible with browser's javascript parsing. Reading around it seems this is because 'script' is defined as containing CDATA (or PCDATA) in the XHTML specs, which strikes me as an unfortunate collision of standards and how things actually end up working (or not, in this case). I can understand why this has come about (mixing of content types within a single document), but 'little' things like this can be really annoying e.g. using DOJO requires setting up a configuration variable, loading its js file, then loading up particular widgets. Putting that into external files would require another two files, with one line in each.&lt;br /&gt;&lt;br /&gt;I've pretty much come to the conclusion AJAX is a really nice technology for some specific areas. AJAX is good for complex user interaction (e.g. form-filling) but bad for simple interaction (e.g. navigation, scrolling and reading). Firefox makes a good job of AJAX (and I suspect Opera is better still), but as long as 80% (?) of users insist on using Microsoft's crippleware we're stuck in the slow lane. Then again, perhaps Internet Explorer 7.0 will solve all AJAX's problems ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115030387638882498?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115030387638882498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115030387638882498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115030387638882498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115030387638882498'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/06/i-see-data-but-do-you-cdata.html' title='I see data but do you CDATA?'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-115002899151453720</id><published>2006-06-11T13:15:00.000+01:00</published><updated>2006-06-11T13:29:51.543+01:00</updated><title type='text'>What the ping?</title><content type='html'>I've been trying to get multicast working on my home ADSL router (a Linux-based PC using a Speedtouch 'frog' USB modem). This is because the BBC and several UK ADSL providers are running multicast trials, including my own ISP Plus.net. While Plus.net seem to have multicast enabled (I see the IGMP messages on the ppp device), getting Linux to actually do something multicast routing wise seems to be one of those "if you're in the club" topics: the preserve of those who find command-line interfaces exciting.&lt;br /&gt;&lt;br /&gt;Out-of-date documentation annoyances - if you've read the incomplete multicast routing howto it ends (before the "to be continued") with pinging the 'all-hosts' group (224.0.0.1) to see who'll respond, except sometime between when that was written circa 1999 and now, responding to broadcast packets was disabled by default. If you want your Linux-kernel machine to respond do:&lt;br /&gt;&lt;br /&gt;echo 0 &gt;/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts&lt;br /&gt;&lt;br /&gt;Now, assuming multicast is alive and well on the Linux router and my Windows XP PC the next step is to get some routing going between the LAN and ADSL. I'm currently battling xorp, which seems to get horribly confused by an interface on an IPv6 enabled machine but which doesn't have an IPv6 address. Like, say, like the ADSL PPP connection? (NB I have IPv6 courtesy of a tunnel to the BT broker service - not that there's much out there in IPv6 land. I'm not even going to go near the kernel patches required to make multicast routing work on IPv6.)&lt;br /&gt;&lt;br /&gt;And the purpose of this fruitless exercise? In the UK the BBC and ITV terrestial stations are broadcasting the World Cup, both of which should be on the multicast ... laptop + multicast TV = portable World Cup!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-115002899151453720?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/115002899151453720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=115002899151453720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115002899151453720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/115002899151453720'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/06/what-ping.html' title='What the ping?'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-114987392928688128</id><published>2006-06-09T18:13:00.000+01:00</published><updated>2006-06-09T18:25:29.296+01:00</updated><title type='text'></title><content type='html'>Chris Gutteridge once commented that Citebase's abstract ('citations' ) page is rather overloaded with information. With that in mind I've been reworking Citebase's display in a similar fashion to Celestial. Of course, with Citebase this is a much bigger job.&lt;br /&gt;&lt;br /&gt;A problem for pretty much any web site is how to provide lots of information while avoiding 'overloading'. I've always thought Citebase had a reasonably clean interface, but that references, citations and co-citations we laid out sequentially on page resulted in a lot of scrolling to navigate around.&lt;br /&gt;&lt;br /&gt;So I've now redesigned the citations page making use of some 'AJAX' to provide buttons that - when selected - load a different chunk of citation data into the page. Looking at the users of Citebase most use Internet Explorer, followed by Firefox etc. In Firefox this loading/reloading is pretty clean and works with forward/backward navigation. With some suitable 'fixes' to get hold of the HTTPRequest object in IE (http://developer.apple.com/internet/webcontent/xmlhttpreq.html) the same sub-pages can be dynamically loaded. However, when navigating back to a page using forward/backward IE shows the original page (and not the one modified by AJAX). So, do I change to a total-page reload (now much easier to do having broken down the page into distinct methods) or find some way to hack IE?&lt;br /&gt;&lt;br /&gt;It's also become apparent IE has a really bad way of handling button padding. It uses a percentage of the text width to pad and ignores any stylesheeting. It turns out the way to fix this is to use "&lt;span style="font-family: courier new;"&gt;* button { overflow: visible; }&lt;/span&gt;", which is a css hack to effect only IE.&lt;br /&gt;&lt;br /&gt;The drip-feed of emails concerning the mismatch of citation-count figures in Citebase continues. This is because the citation counts in some places are taken from the record and in others from the duplicates. I thought I had got this correct, but it seems not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-114987392928688128?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/114987392928688128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=114987392928688128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/114987392928688128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/114987392928688128'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/06/chris-gutteridge-once-commented-that.html' title=''/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-29426273.post-114975958332084543</id><published>2006-06-08T10:14:00.000+01:00</published><updated>2006-06-08T10:57:54.796+01:00</updated><title type='text'>Reinventing the Wheel and Other Exercises</title><content type='html'>So, it looks like the re-write of Celestial is nearing its conclusion. As it was Celestial was getting to be a pain to maintain, as well as being particular user un-friendly. Now the OAI sets membership has been separated into per-repository tables, set-based selection performance is greatly increased (at least until a single repository ends up getting stupidly big). There's now a proper interface for managing &lt;span style="font-style: italic;"&gt;subscriptions&lt;/span&gt; - the ability to register for reports on Celestial's harvesting.&lt;br /&gt;&lt;br /&gt;Internally I've adopted a more-modular approach to the web interface, with each section in its own (lightly wrapped) .pm file. This has made it surprisingly easy (and neat) to add additional outputs. All of the existing functionality is there: the OAI interface, ListFriends, repository listing and editing, but now is all through a common Apache interface.&lt;br /&gt;&lt;br /&gt;So, stuff I've learnt in this exercise (NB this is under Redhat Enterprise 4):&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Apache::RequestIO &lt;span style="font-family:arial;"&gt;is needed to &lt;/span&gt;&lt;/span&gt;enable $r-&gt;read(), otherwise CGI fails on HTTP POST (had similar problems with hashes and requiring APR::Table). The mod_perl use of modules is pretty infuriating.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are some interesting, subtle issues in XML::LibXML when trying to generate SAX events from a sub-tree. Basically, the thing that SAX events are generated from has to be the root node, which means if you want to include a DOM fragment in another structure that generates SAX events the subtree has to be extracted and set as the root node of another DOM. So far, so annoying, but another bug inside LibXML caused me a headache. It seems LibXML segfaults if you try to set a subtree as the documentElement (presumably because it frees() the old root element, clobbering the subtree you just set as the documentElement). If you're wondering why you would ever want to do this, well my OAI library is based on sticking DOM fragments into a perl OO structure that outputs by generating SAX events.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The HTTP connector classes across browsers behave the same, but are called different things and set &lt;span style="font-style: italic;"&gt;self&lt;/span&gt; to different things in the callback. Why does this matter? Well, the different names can be handled using javascript voodoo, but if you want to open up multiple HTTP connectors getting a handle to the particular connector that triggered a callback is impossible (with the exception of Opera, which apparently sets &lt;span style="font-style: italic;"&gt;self&lt;/span&gt; to be the connector object). Instead, for my Celestial AJAX experimentation, I had to store each connector in an array, then interogate each one in turn to spot the one that was in a ready state. More regrettable global-fudges to get around stateless callbacks.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;This is the first post to this blog - if you're reading it, blimey. Essentially this will be my effort to document problems I've grappled with and the general grind of working on the tools I've developed and now support (Citebase, Celestial and ROAR). This blog is aimed at myself - as I'm useless at keeping a lab-book and can't find what I want in them anyway - but if it helps you, that's great.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/29426273-114975958332084543?l=oapeon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oapeon.blogspot.com/feeds/114975958332084543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=29426273&amp;postID=114975958332084543' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/114975958332084543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/29426273/posts/default/114975958332084543'/><link rel='alternate' type='text/html' href='http://oapeon.blogspot.com/2006/06/reinventing-wheel-and-other-exercises.html' title='Reinventing the Wheel and Other Exercises'/><author><name>Tim Brody</name><uri>http://www.blogger.com/profile/11978904433154324587</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
