<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Planet GLLUG</title>
	<link>http://planet.gllug.org.uk</link>
	<language>en</language>
	<description>Planet GLLUG - http://planet.gllug.org.uk</description>

<item>
	<title>Rev. Simon Rumble: Sneaky trick to de-obfuscate Omniture JavaScript plugins</title>
	<guid>http://www.rumble.net/blog/De-obfuscate_Omniture_JavaScript_plugins</guid>
	<link>http://www.rumble.net/blog/index.cgi/geek/De-obfuscate_Omniture_JavaScript_plugins.html</link>
	<description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;My current job involves working extensively with &lt;a href=&quot;http://www.omniture.com/&quot;&gt;Omniture&lt;/a&gt;
products.  The company has an annoying habit of secrecy, with documentation only available on
request for many aspects of their products.&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;http://rumble.smugmug.com/Blog/Blog/1940948_TcAiC#807271378_swcjF-O-LB&quot;&gt;&lt;img src=&quot;http://rumble.smugmug.com/Blog/Blog/omnitureobfuscation/807271378_swcjF-L.png&quot; alt=&quot;De-obfuscate Omniture JavaScript plugins&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;They also attempt to obfuscate their JavaScript, despite the fact that a determined viewer
should be able to work it out eventually.  I'm told this is so that people aren't tempted to
play with the code. The obvious methods of deobfuscation are pretty tedious, and because Omniture
don't use standard (minify et al) methods of obfuscation so it seems a little more difficult.
Fortunately I lucked onto a better approach.&lt;/p&gt;
&lt;p&gt;You'll need &lt;a href=&quot;http://getfirebug.com/&quot;&gt;Firebug&lt;/a&gt;, and if you don't have that already
you should anyway.  Go to a page that already has the Omniture &quot;plugin&quot; (function) you want.
Open the Firebug console and run alert(s.functionNameYouWant) and run it.  You'll be shown a
nicely-formatted anonymous function, which will be much easier to read than the line noise
you'll see in the actual s_code.js file.&lt;/p&gt;
&lt;p&gt;In my case I'm after
&lt;a href=&quot;http://blogs.omniture.com/2009/03/09/cross-visit-participation-inside-omniture-sitecatalyst/&quot;&gt;Cross-Visit
Participation&lt;/a&gt;, and that's used on the Omniture site itself (though an older version than
the latest available from Omniture which has a very useful additional feature).&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;http://www.rumble.net/contact/&quot;&gt;Contact me&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 10 Mar 2010 23:06:06 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1388</guid>
	<link>http://rwmj.wordpress.com/2010/03/10/tip-extract-a-filesystem-from-a-disk-image/</link>
	<description>&lt;p&gt;You&amp;#8217;ve got a partitioned disk image, how do you pull out of that just the filesystem(s)?  It&amp;#8217;s easy with &lt;a href=&quot;http://libguestfs.org/&quot;&gt;libguestfs tools&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;
$ &lt;b&gt;virt-list-filesystems -al disk.img&lt;/b&gt;
/dev/sda1 ext4
/dev/vg_f12x32/lv_root ext4
/dev/vg_f12x32/lv_swap swap
$ &lt;b&gt;virt-cat disk.img /dev/sda1 &amp;gt; boot.fs&lt;/b&gt;
$ &lt;b&gt;file boot.fs&lt;/b&gt;
boot.fs: Linux rev 1.0 ext4 filesystem data (extents) (huge files)
$ &lt;b&gt;virt-cat disk.img /dev/vg_f12x32/lv_root &amp;gt; root.fs&lt;/b&gt;
&lt;/pre&gt;
&lt;p&gt;You can also use guestfish to examine the filesystem image:&lt;/p&gt;
&lt;pre&gt;
$ guestfish -a boot.fs -m /dev/sda

Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.

Type: 'help' for help with commands
      'quit' to quit the shell

&amp;gt;&amp;lt;fs&amp;gt; ll /
total 15941
dr-xr-xr-x.  5 root root     1024 Mar  8 19:37 .
dr-xr-xr-x  19 root root        0 Mar  8 13:40 ..
-rw-r--r--.  1 root root  1486532 Nov  7 21:38 System.map-2.6.31.5-127.fc12.i686.PAE
-rw-r--r--.  1 root root   103788 Nov  7 21:38 config-2.6.31.5-127.fc12.i686.PAE
drwxr-xr-x.  3 root root     1024 Mar  8 19:12 efi
drwxr-xr-x.  2 root root     1024 Mar  8 19:49 grub
-rw-r--r--.  1 root root 11253019 Mar  8 19:39 initramfs-2.6.31.5-127.fc12.i686.PAE.img
drwx------.  2 root root    12288 Mar  8 18:45 lost+found
-rwxr-xr-x.  1 root root  3454368 Nov  7 21:38 vmlinuz-2.6.31.5-127.fc12.i686.PAE

&amp;gt;&amp;lt;fs&amp;gt; cat /grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/vg_f12x32-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=0
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.31.5-127.fc12.i686.PAE)
	root (hd0,0)
	kernel /vmlinuz-2.6.31.5-127.fc12.i686.PAE ro root=/dev/mapper/vg_f12x32-lv_root  LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=uk rhgb quiet
	initrd /initramfs-2.6.31.5-127.fc12.i686.PAE.img

&amp;gt;&amp;lt;fs&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1388/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1388/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1388/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1388/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1388/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1388/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1388/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1388/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1388/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1388/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1388&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Wed, 10 Mar 2010 16:05:03 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1384</guid>
	<link>http://rwmj.wordpress.com/2010/03/09/tip-use-systemtap-to-monitor-selinux-changes-to-files/</link>
	<description>&lt;p&gt;Something unknown was &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=571714#c2&quot;&gt;changing the labels on certain devices behind my back&lt;/a&gt;.  We couldn&amp;#8217;t find out what it was using ordinary diagnostics, so I decided to investigate if we could do this with &lt;a href=&quot;http://sourceware.org/systemtap/wiki&quot;&gt;SystemTap&lt;/a&gt;.  I quickly found an existing script to &lt;a href=&quot;http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/html/SystemTap_Beginners_Guide/inodewatch2sect.html&quot;&gt;monitor changes in ordinary file attributes&lt;/a&gt;.  This won&amp;#8217;t work for SELinux labels though because those are stored in &lt;a href=&quot;http://linux.die.net/man/2/setxattr&quot;&gt;ext2/3/4 extended attributes (xattrs)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically I had to modify &lt;a href=&quot;http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/html/SystemTap_Beginners_Guide/inodewatch2sect.html&quot;&gt;that script&lt;/a&gt; to monitor calls to setxattr instead.&lt;/p&gt;
&lt;p&gt;Using the &lt;a href=&quot;http://lxr.linux.no/linux/&quot;&gt;LXR&lt;/a&gt; I found that the call is implemented in Linux in &lt;a href=&quot;http://lxr.linux.no/linux+v2.6.33/fs/xattr.c&quot;&gt;fs/xattr.c, function vfs_setxattr&lt;/a&gt;.  I had to modify the script to probe that kernel function, and the parameters are slightly different too.&lt;/p&gt;
&lt;p&gt;I also had to install the correct kernel-{,PAE-}debuginfo package corresponding to my installed kernel.  This is how SystemTap is able to resolve symbols in the current kernel.&lt;/p&gt;
&lt;pre&gt;
/* Watch changes to xattrs on an inode.
 * http://rwmj.wordpress.com/2010/03/09/tip-use-systemtap-to-monitor-selinux-changes-to-files/
 */

probe kernel.function(&quot;vfs_setxattr&quot;)
{
  dev_nr = $dentry-&amp;gt;d_inode-&amp;gt;i_sb-&amp;gt;s_dev
  inode_nr = $dentry-&amp;gt;d_inode-&amp;gt;i_ino

  if (inode_nr == $1)
    printf (&quot;%s(%d) %s 0x%x/%u %d %s %s\n&quot;,
      execname(), pid(), probefunc(), dev_nr, inode_nr, uid(),
      kernel_string ($name), kernel_string_n ($value, $size))
}
&lt;/pre&gt;
&lt;p&gt;Then run it with:&lt;/p&gt;
&lt;pre&gt;
# stap -v /tmp/inodewatchxattr.stp &lt;i&gt;inodenum&lt;/i&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=571714&quot;&gt;The bug&lt;/a&gt; turned out to be udevd, which I don&amp;#8217;t think anyone was expecting &amp;#8230;&lt;/p&gt;
&lt;pre&gt;
libvirtd(4338) vfs_setxattr 0x5/166267 0 security.selinux system_u:object_r:svirt_image_t:s0:c177,c272
udevd(28299) vfs_setxattr 0x5/166267 0 security.selinux system_u:object_r:fixed_disk_device_t:s0
udevd(28299) vfs_setxattr 0x5/166267 0 security.selinux system_u:object_r:fixed_disk_device_t:s0
udevd(28299) vfs_setxattr 0x5/166267 0 security.selinux system_u:object_r:fixed_disk_device_t:s0
&lt;/pre&gt;
&lt;p&gt;All in all, I&amp;#8217;m impressed with SystemTap.  It&amp;#8217;s a simple, strongly-typed, sane programming language with type inference.  Thankfully Python was not an influence on it.&lt;/p&gt;
&lt;pre&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1384/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1384/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1384/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1384/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1384/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1384/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1384/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1384/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1384/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1384/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1384&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;&lt;/pre&gt;</description>
	<pubDate>Tue, 09 Mar 2010 12:41:21 +0000</pubDate>
</item>
<item>
	<title>Daniel Roseman: Easy create or update</title>
	<guid>http://blog.roseman.org.uk/2010/03/9/easy-create-or-update/</guid>
	<link>http://blog.roseman.org.uk/2010/03/9/easy-create-or-update/</link>
	<description>&lt;p&gt;One common database operation that isn't supported out of the box by Django's ORM is &lt;code&gt;create_or_update&lt;/code&gt; - in other words, given a set of parameters, either update an existing object or create a new one if there isn't one already.&lt;/p&gt;
&lt;p&gt;The naive implementation is to do a &lt;code&gt;get()&lt;/code&gt; on the model, catching the &lt;code&gt;DoesNotExist&lt;/code&gt; exception if there's no match and instantiating a new object, then updating the attributes and saving. (You wouldn't want to use &lt;code&gt;get_or_create&lt;/code&gt; here, as that doesn't allow you to update the instance if it already exists, so you'd have some duplication of code and db queries).&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DoesNotExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;field1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value2&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The only problem with this is that it creates multiple queries: one to get the existing row, and then &lt;em&gt;two&lt;/em&gt; to save it - Django checks to see if it should do an insert or an update when you save, which costs another query. Most of the time, this doesn't massively matter: creating and updating is usually done outside of the standard page rendering flow, so it's not a huge problem if it's a tiny bit slower.&lt;/p&gt;
&lt;p&gt;But there are times when you do want to optimise this. One, which we recently ran into at work, is when you want to log items to the database in the course of normal page rendering. We do this to let users of our CMS know when they've put items on a page that aren't rendering how they should be, usually because they don't have the right selection of image assets. (There are good operational reasons as to why we can't stop them from entering them in the first place: I won't go into that here.) A further wrinkle for us is that we want to ensure each error only gets one entry in the log table, but should always record the most recent time that particular error scenario was encountered. So, an ideal case for &lt;code&gt;create_or_update&lt;/code&gt;, if only it existed.&lt;/p&gt;
&lt;p&gt;Of course I can't stand to see unnecessary db queries, so here's an implementation that uses &lt;code&gt;QuerySet.update&lt;/code&gt; to do the initial getting and updating if a match exists. The trick is to realise that &lt;code&gt;update&lt;/code&gt; returns the number of rows affected by the query - which has been true more or less ever since queryset-refactor landed nearly two years ago, but which was wrongly and explicitly denied in the documentation until recently (and still is denied in the 1.1 docs, even though it's true). We can use this number to tell if a matching row existed - and if it doesn't, we can then simply call &lt;code&gt;create&lt;/code&gt; with the same arguments. Simple.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;n&quot;&gt;attrs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'field1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'value1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'field2'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'value2'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;filter_attrs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'filter_field'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'filtervalue'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rows&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filter_attrs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attrs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;attrs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filter_attrs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attrs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;attrs&lt;/code&gt; dictionary contains the field names/values to use to update the object, and &lt;code&gt;filter_attrs&lt;/code&gt; is the filter names/values to find the object to update. If we're creating a new object, it will of course need to set both the &lt;code&gt;attrs&lt;/code&gt; values &lt;em&gt;and&lt;/em&gt; the &lt;code&gt;filter_attrs&lt;/code&gt;, so we update one dictionary from the other.&lt;/p&gt;
&lt;p&gt;Now, note that this will always call a db UPDATE, and if no match exists, it will additionally call an INSERT. Compare this with the original version, which always calls a SELECT, plus another SELECT and an UPDATE if the match exists, but just an INSERT if there's no match. So whether this is more efficient will depend on the use case - if you expect more updates than create, this version should be better (a single UPDATE versus SELECT+UPDATE), but if the reverse is true the original implementation will probably be better.&lt;/p&gt;</description>
	<pubDate>Tue, 09 Mar 2010 10:38:44 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1381</guid>
	<link>http://rwmj.wordpress.com/2010/03/09/virt-inspector-now-works-better-with-windows-guests/</link>
	<description>&lt;p&gt;Yesterday we &lt;a href=&quot;http://git.annexia.org/?p=libguestfs.git;a=commit;h=ebfcb7f23df4546977628dc718982730682a68c0&quot;&gt;improved&lt;/a&gt; &lt;a href=&quot;http://libguestfs.org/virt-inspector.1.html&quot;&gt;virt-inspector&lt;/a&gt; so it can now fetch information about Windows guests by reading their &lt;a href=&quot;http://rwmj.wordpress.com/2010/02/18/why-the-windows-registry-sucks-technically/&quot;&gt;Registries&lt;/a&gt;.  In the XML output, this provides the &lt;a href=&quot;http://rwmj.wordpress.com/2009/10/29/virt-win-reg-get-at-the-windows-registry-in-your-windows-guests/&quot;&gt;ProductName&lt;/a&gt; and Windows internal version:&lt;/p&gt;
&lt;pre&gt;
$ virt-inspector --xml Win2003x32
[...]
    &amp;lt;name&amp;gt;windows&amp;lt;/name&amp;gt;
    &lt;b&gt;&amp;lt;product_name&amp;gt;Microsoft Windows Server 2003&amp;lt;/product_name&amp;gt;&lt;/b&gt;
    &amp;lt;arch&amp;gt;i386&amp;lt;/arch&amp;gt;
    &lt;b&gt;&amp;lt;major_version&amp;gt;5&amp;lt;/major_version&amp;gt;
    &amp;lt;minor_version&amp;gt;2&amp;lt;/minor_version&amp;gt;&lt;/b&gt;
[...]
&lt;/pre&gt;
&lt;p&gt;In the raw output you get even more details from the Registry:&lt;/p&gt;
&lt;pre&gt;
$ virt-inspector --perl Windows7x64
[...]
'arch' =&amp;gt; 'x86_64',
'windows_registered_owner' =&amp;gt; 'rjones',
'windows_current_type' =&amp;gt; 'Multiprocessor Free',
'windows_system_hive' =&amp;gt; '/Windows/System32/config/SYSTEM',
'windows_installation_type' =&amp;gt; 'Client',
'os_major_version' =&amp;gt; '6',
'os_minor_version' =&amp;gt; '1',
'systemroot' =&amp;gt; '/Windows',
'windows_software_hive' =&amp;gt; '/Windows/System32/config/SOFTWARE',
'windows_software_type' =&amp;gt; 'System',
'windows_registered_organization' =&amp;gt; '',
'windows_current_build' =&amp;gt; '7600',
'windows_edition_id' =&amp;gt; 'Enterprise',
'product_name' =&amp;gt; 'Windows 7 Enterprise',
[...]
&lt;/pre&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1381/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1381/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1381/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1381/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1381/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1381/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1381/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1381/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1381/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1381/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1381&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 09 Mar 2010 10:16:13 +0000</pubDate>
</item>
<item>
	<title>Martin A. Brooks: &lt;b&gt;Game review: Assassin's Creed 2&lt;/b&gt;</title>
	<guid>http://blog.hinterlands.org/2010/03/08#20100308</guid>
	<link>http://blog.hinterlands.org/2010/03/08#20100308</link>
	<description>&lt;p&gt;

Following my original review of the first &lt;a href=&quot;http://blog.hinterlands.org/2008/04/14#20080414&quot;&gt;Assassin's Creed&lt;/a&gt; game, I was dearly looking forward to reviewing the new episode in the series.  Alas Ubisoft have taken the skull-smackingly stupid decision of making a single-player game need access to the Internet to work.

&lt;p&gt;

Don't buy this game, you will be funding idiocy if you do.

&lt;p&gt;

What next, Ubisoft, will you be making me not buy the upcoming Splinter Cell, too?&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 08 Mar 2010 20:23:00 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1378</guid>
	<link>http://rwmj.wordpress.com/2010/03/08/incompetent-spammers/</link>
	<description>&lt;p&gt;From the spam folder of this blog today:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
The layout for %BLOGURL% is a bit off in iCab. However I like your site. I may have to install a “normal” browser just to enjoy it.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;
I usually don’t usually post on many Blogs, yet I just has to say thank you for %BLOGTITLE%… keep up the amazing work. Ok regrettably its time to get to school.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Even more incompetently, neither of the spammy URLs they were trying to add actually worked (checked using &amp;#8216;wget&amp;#8217;, not a real browser of course).&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1378/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1378/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1378/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1378/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1378/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1378/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1378/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1378/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1378/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1378/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1378&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Mon, 08 Mar 2010 17:02:05 +0000</pubDate>
</item>
<item>
	<title>Rev. Simon Rumble: UI fail from Exetel</title>
	<guid>http://www.rumble.net/blog/Exetel_UI_fail</guid>
	<link>http://www.rumble.net/blog/index.cgi/geek/Exetel_UI_fail.html</link>
	<description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;img src=&quot;http://rumble.smugmug.com/Blog/Blog/Exeteluserinterfacefail/804826382_2NYng-O.png&quot; alt=&quot;Cancel&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Work is providing me a mobile, so I went to cancel my phone with
Exetel.  Unfortunately this is the UI you see.  So first of all, you
can helpfully cancel it in the past.  But then the button is labelled
&quot;Cancel&quot;.  So does that means clicking it will cancel my service, or
cancel the request to disconnect?&lt;/p&gt;
&lt;p align=&quot;right&quot;&gt;&lt;img src=&quot;http://rumble.smugmug.com/Blog/Blog/Exeteluserinterfacefail2/804827088_c37UQ-O.png&quot; alt=&quot;Submit&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The resulting page is even more confusing.  Does that mean my &quot;Cancel&quot;
was successful?  Or do I now need to &quot;Submit&quot; to make it happen?  Terribly
confused.&lt;/p&gt;&lt;p align=&quot;right&quot;&gt;&lt;a href=&quot;http://www.rumble.net/contact/&quot;&gt;Contact me&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 08 Mar 2010 01:12:12 +0000</pubDate>
</item>
<item>
	<title>www.DavidPashley.com/blog: Mod_fastcgi and external PHP</title>
	<guid>http://www.davidpashley.com/blog/2010/03/07#mod_fastcgi</guid>
	<link>http://www.davidpashley.com/blog/2010/03/07#mod_fastcgi</link>
	<description>&lt;div&gt;
   &lt;p&gt;Has anyone managed to get a standard version of mod_fastcgi work
correctly with &lt;tt&gt;FastCGIExternalServer&lt;/tt&gt;? There seems to be a
complete lack of documentation on how to get this to work. I have
managed to get it working by removing some code which appears to
completely break &lt;tt&gt;AddHandler&lt;/tt&gt;. However, people on the FastCGI
list told me I was wrong for making it work. So, if anyone has managed
to get it to work, please show me some working config. &lt;/p&gt;

      &lt;div&gt;&lt;a href=&quot;http://www.davidpashley.com/blog/systems-administration/apache/mod_fastcgi&quot; title=&quot;Permalink&quot;&gt;Read Comments (1)&lt;/a&gt; &lt;/div&gt;
   &lt;/div&gt;</description>
	<pubDate>Sun, 07 Mar 2010 23:02:49 +0000</pubDate>
</item>
<item>
	<title>Martin A. Brooks: &lt;b&gt;Filesystem-based greylisting for Exim&lt;/b&gt;</title>
	<guid>http://blog.hinterlands.org/2010/03/07#20100307</guid>
	<link>http://blog.hinterlands.org/2010/03/07#20100307</link>
	<description>&lt;p&gt;

I have written a filesystem-based greylisting engine for Exim.  See &lt;a href=&quot;http://hinterlands.org/wiki/index.php/EximFilesystemGreylist&quot;&gt;here&lt;/a&gt; for details.&lt;/p&gt;</description>
	<pubDate>Sun, 07 Mar 2010 18:47:00 +0000</pubDate>
</item>
<item>
	<title>davblog - Dave Cross: Gigs for Old Gits</title>
	<guid>tag:blog.dave.org.uk,2010://1.1648</guid>
	<link>http://blog.dave.org.uk/2010/03/gigs-for-old-gits.html</link>
	<description>It's been a busy couple of weeks for gigs. On the assumption that at least some of my readers have similar tastes to me, here are brief reviews of the three gigs I've seen in the last couple of weeks.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fairport Convention, Union Chapel, 20th Feb&lt;/b&gt;&lt;br /&gt;This is the second year running that I've seen Fairport Convention on their &quot;Wintour&quot; at the Union Chapel. Last year was the first time I had seen them (which is bizarre for a band I've been a fan of for over thirty years). I can't quite put my finger on it, but this year's show wasn't as enjoyable as last year's. I suspect it was down to the number of songs taken from later Fairport albums that I'm not at all familiar with. Oh, and the arrangement of Matty Groves was very strange. The long instrumental that ends the song was unrecognisable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thomas Dolby and Friends, Union Chapel, 28th Feb&lt;/b&gt;&lt;br /&gt;Something a little more up to date. This was Thomas Dolby bringing back together the band who had recorded and toured his second album, The Flat Earth. As an extra twist, the band (who haven't played together for over twenty-five years) didn't rehearse at all. They met on stage and worked the songs out in a two-hour &quot;live rehearsal&quot;. They then went of for a brief break before returning to play a half-hour set.&lt;br /&gt;&lt;br /&gt;The rehearsal was fun. And the band sounded great for a band eho hadn't played together for so long. There were also a few guest stars - including Trevor Horn who played bass on &quot;Airwaves&quot;. The only slight disappointment was that the rehearsal overran so the final set had to be cut short.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;John Cale, Royal Festival Hall, 5th March&lt;/b&gt;&lt;br /&gt;I'm not a huge John Cale fan. I generally like the stuff of his that I hear, but I haven't really heard much of it. This concert had him playing the whole of hist album &quot;Paris 1919&quot; (from 1973). This isn't an album that I'd heard at all until I started to listen to it in preparation for this show and it's really not that representative of the rest of his music. But it's a great album and it was interesting to hear it all played live. It is, however, a rather short album (many were back in the early 70s) and that part of the show only lasted forty minutes. After a short break (and it was really short) the band returned to play another forty minutes of &quot;the best of John Cale&quot;. I was pretty surprised to realise that I recognised most of these songs. All in all, a great night out.&lt;br /&gt;</description>
	<pubDate>Sun, 07 Mar 2010 12:21:20 +0000</pubDate>
</item>
<item>
	<title>Martin A. Brooks: &lt;b&gt;Automatic email archiving&lt;/b&gt;</title>
	<guid>http://blog.hinterlands.org/2010/03/06#20100306</guid>
	<link>http://blog.hinterlands.org/2010/03/06#20100306</link>
	<description>&lt;p&gt;

If you're on as many mailing lists as I am, you might find &lt;a href=&quot;http://bit.ly/axamTe&quot;&gt;this&lt;/a&gt; to be handy.&lt;/p&gt;</description>
	<pubDate>Sat, 06 Mar 2010 11:22:00 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1371</guid>
	<link>http://rwmj.wordpress.com/2010/03/05/tech-talk-pse-now-a-bit-usable/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://rwmj.files.wordpress.com/2010/03/techtalk.png?w=500&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can run arbitrary commands, shells, editors etc during your presentation.  Here, I run a gnome-terminal with a prepopulated command history:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://rwmj.files.wordpress.com/2010/03/run.png?w=500&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Download it from &lt;a href=&quot;http://git.annexia.org/?p=techtalk-pse.git;a=summary&quot;&gt;my git repository&lt;/a&gt;.  The requirements are fairly light: perl, perl-Gtk2 and perl-Gtk2-MozEmbed (all in Fedora).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rwmj.wordpress.com/2010/03/03/presentation-software-sucks-introducing/&quot;&gt;Previous angry rant&lt;/a&gt; about presentation software.&lt;/p&gt;
&lt;p&gt;The diagram in the first slide was done using &lt;a href=&quot;http://sourceforge.net/projects/pgf/&quot;&gt;PGF and Tikz 2.00&lt;/a&gt; &lt;a href=&quot;http://www.texample.net/tikz/examples/&quot;&gt;(examples)&lt;/a&gt; &lt;a href=&quot;http://www.ctan.org/tex-archive/graphics/pgf/base/doc/generic/pgf/pgfmanual.pdf&quot;&gt;(manual)&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1371/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1371/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1371/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1371/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1371/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1371/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1371/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1371/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1371/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1371/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1371&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Fri, 05 Mar 2010 10:28:52 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1343</guid>
	<link>http://rwmj.wordpress.com/2010/03/03/presentation-software-sucks-introducing/</link>
	<description>&lt;p&gt;How many dull presentations have you been to where the presenter simply reads bullet points off slides?&lt;/p&gt;
&lt;div&gt;
FrobSoft Express 2.0 is:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt; up to 5% faster
&lt;li&gt; supports Windows
&lt;li&gt; XML enabled!
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;m &lt;a href=&quot;http://www.gllug.org.uk/&quot;&gt;giving a talk about libguestfs on 18th March&lt;/a&gt; and I hate reading out slides to people as much as I hate listening to presenters reading out slides to me.  In every talk I&amp;#8217;ve given in the last few years I have tried to keep my notes separate (written on paper in front of me, or memorized) from what is on the slides.  Presentation software, such as the mighty, all-pervasive &lt;a href=&quot;http://www.openoffice.org/&quot;&gt;OpenOffice&lt;/a&gt;, doesn&amp;#8217;t make this easy.  Nor does it make it easy to demonstrate software in the middle of your talk.  You end up having to switch away to another virtual desktop, where (hopefully) you&amp;#8217;ve remembered to set up some xterms &amp;#8220;su&amp;#8221;&amp;#8216;d to root and &amp;#8220;cd&amp;#8221;&amp;#8216;d into the right directory.  I usually need several virtual desktops set up like this so I can demonstrate different parts of the software, so I&amp;#8217;m standing in front of an audience using [Alt][←] and [Alt][→] while I hastily try to remember which virtual desktop has the next stage of the talk.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Enough!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Introducing &amp;#8220;Tech Talk&amp;#8221;.  Actually, &lt;a href=&quot;http://www.google.co.uk/search?q=tech+talk&quot;&gt;Tech Talk&lt;/a&gt; is too generic in Google, so we brainstormed adding extra words on the end until it became unique:  Introducing &lt;b&gt;&amp;#8220;Tech Talk Platinum Supreme Edition!&amp;#8221; (Tech Talk PSE)&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;The concept is simple.  You create a directory and drop a mixture of HTML files and shell scripts in there:&lt;/p&gt;
&lt;pre&gt;
$ &lt;b&gt;ls&lt;/b&gt;
10-hello.html
20-shell.sh
30-goodbye.html
$ &lt;b&gt;techtalk-pse&lt;/b&gt;
&lt;/pre&gt;
&lt;p&gt;When Tech Talk PSE runs, it sorts the files numerically, and then displays the HTML ones (using &lt;a href=&quot;http://www.mozilla.org/projects/embedding/&quot;&gt;Mozilla embedding&lt;/a&gt;) as slides and runs the shell script ones.  Next and previous keys move through the slides, ensuring that your demonstrations [the shell scripts] run automatically at the right place in the talk.&lt;/p&gt;
&lt;p&gt;Only files matching ^\d+(-.*)\.(html|sh)$ are considered, everything else is ignored.  So you can style your HTML using stylesheets, include READMEs and Makefiles, and move common shell functionality into sourced shell files:&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash -
# Source common functions and variables.
source functions
# Pre-populate the shell history.
cat &amp;gt; $HISTFILE &amp;lt;&amp;lt;EOF
guestfish -a vm.img
EOF
# Open gnome-terminal.
exec $TERMINAL --geometry=+100+100
&lt;/pre&gt;
&lt;p&gt;Tech Talk PSE itself doesn&amp;#8217;t have to deal with rendering, which is pushed off to a browser, making it far more flexible, powerful and simpler than existing presentation software.  This means you can show figures or play video in your presentation, or use Javascript to make your slides resolution-independent or to add animations.  Additionally you can use any existing tool you want to write HTML.  (If you&amp;#8217;re like me, that tool will be emacs.)&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll be able to download Tech Talk PSE after my talk in two weeks time, or get early previews from &lt;a href=&quot;http://git.annexia.org/&quot;&gt;my git repository&lt;/a&gt;.  Requirements are Perl, Perl Gtk2 and &lt;a href=&quot;http://search.cpan.org/dist/Gtk2-MozEmbed/&quot;&gt;Gtk2::MozEmbed&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1343/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1343&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Wed, 03 Mar 2010 17:41:44 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1340</guid>
	<link>http://rwmj.wordpress.com/2010/03/03/lxc-howto/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://blog.kagesenshi.org/2010/03/howto-linux-container-lxc-on-fedora-12.html#7569034800567268281&quot;&gt;KageSenshi&amp;#8217;s HOWTO use Linux Containers (LXC) on Fedora 12 with libvirt&lt;/a&gt; is interesting.  I discovered that they&amp;#8217;re using &lt;a href=&quot;http://people.redhat.com/~rjones/febootstrap/&quot;&gt;febootstrap&lt;/a&gt; (see &lt;a href=&quot;http://rwmj.wordpress.com/?s=febootstrap&quot;&gt;earlier postings&lt;/a&gt;) to &lt;a href=&quot;http://blog.bodhizazen.net/linux/lxc-configure-fedora-containers/&quot;&gt;build the Fedora root filesystem for the containers&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1340/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1340/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1340/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1340/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1340/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1340/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1340/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1340/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1340/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1340/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1340&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Wed, 03 Mar 2010 15:46:51 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1324</guid>
	<link>http://rwmj.wordpress.com/2010/03/03/what-is-a-watchdog/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2061/3003049458_1990c44fa8_m.jpg&quot; /&gt;&lt;br /&gt;
&lt;i&gt;Watchdog, by &lt;a href=&quot;http://www.flickr.com/photos/raildecom/3003049458/&quot;&gt;Emmanuel Tabard&lt;/a&gt;, used with permission from Flickr&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;In a physical server, a watchdog is a simple piece of hardware which is supposed to restart the server if it hangs without needing any administrator intervention.  Watchdogs used to come as separate cards, but nowadays the feature is found in many chipsets, often integrated with other useful bits of server / remote access functionality like &lt;a href=&quot;http://en.wikipedia.org/wiki/Out-of-band_management&quot;&gt;remote serial port, wake-on-LAN, hardware event monitoring etc.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So how does the watchdog work?  &amp;#8220;Is the machine hung?&amp;#8221; is a tricky question to answer if you just look at the hardware level.  In a &amp;#8220;hung&amp;#8221; machine, the CPU is most likely still running, and the kernel might still be up and responding to pings.&lt;/p&gt;
&lt;p&gt;Hardware watchdogs instead rely on a piece of software running on the machine which must &amp;#8220;tickle&amp;#8221; a particular port, say every 10 seconds.  If the watchdog doesn&amp;#8217;t get &amp;#8220;tickled&amp;#8221; after, say, 60 seconds (so 6 missed events), then it asserts the &lt;span&gt;RESET&lt;/span&gt; line which results in a hard reboot.  (Of course, how often you must tickle the hardware varies from watchdog device to watchdog device, and is usually configurable.  Some hardware watchdogs have more elaborate states &amp;#8212; for example, they can deliver a &amp;#8220;second chance&amp;#8221; interrupt shortly before they deal the final death blow to the machine.  In reality no one uses anything but the basic tickle/reset function.)&lt;/p&gt;
&lt;p&gt;So the hardware defers to some software which has to keep tickling the hardware, or else face reboot.  But how does this software work?  In Linux we use the venerable &lt;a href=&quot;http://watchdog.sourceforge.net/&quot;&gt;watchdog daemon&lt;/a&gt; project.  This is an unusual case where you actually want the software to do lots of &amp;#8220;useless&amp;#8221; work.  So the daemon will typically ping a remote network address, do a process listing, maybe write something to disk and access the service, and run some custom scripts, and &lt;i&gt;only&lt;/i&gt; if all those succeed will it tickle the watchdog port.  Every 10 seconds.&lt;/p&gt;
&lt;p&gt;If you think about some ways in which a server can &amp;#8220;hang&amp;#8221; you can see why this works.  &lt;i&gt;Example (1)&lt;/i&gt;: Hard disk drive stops sending back interrupts.  Processes begin to go into the uninterruptible &amp;#8220;D&amp;#8221; state, and don&amp;#8217;t come out.  Watchdog daemon itself enters the D state when it writes to the disk, hence the watchdog port is never tickled and the server gets rebooted.  &lt;i&gt;Example (2)&lt;/i&gt;: Web server parent process segfaults.  Existing and some new requests are still being serviced, so the server appears to be working from the outside, but less reliably, at least for a little while.  The watchdog daemon lists out the processes in the system and notices that the web server parent process is gone (because of a custom test).  As a result, it doesn&amp;#8217;t tickle the watchdog port, and so the machine is rebooted.  &lt;i&gt;Example (3)&lt;/i&gt;: A large SQL request results in an important database table getting locked.  The watchdog daemon periodically fetches a database-backed web page from the web server.  The watchdog daemon&amp;#8217;s request hangs.  The watchdog port isn&amp;#8217;t tickled.  The web server reboots.&lt;/p&gt;
&lt;p&gt;What does this have to do with virtualization?  Virtual machines can also hang in various unpredictable ways, and for the same reasons I outlined above, it&amp;#8217;s hard to know whether a VM is hanging, overloaded or just slow.  And for all the same reasons, you might want to reboot a wedged VM without administrator intervention.  For this reason I wrote a virtual watchdog device for qemu and KVM.  It&amp;#8217;s simple to &lt;a href=&quot;http://libvirt.org/formatdomain.html#elementsWatchdog&quot;&gt;configure the watchdog using libvirt&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;
# virsh edit domname
&lt;/pre&gt;
&lt;p&gt;and add &lt;code&gt;&amp;lt;watchdog&amp;nbsp;model='i6300esb'/&amp;gt;&lt;/code&gt; into the devices section of the XML.&lt;/p&gt;
&lt;p&gt;That will create a virtual &lt;a href=&quot;http://developer.intel.com/design/chipsets/embedded/6300esb.htm&quot;&gt;Intel 6300 ESB&lt;/a&gt; (just the watchdog part of this multi-function Intel chipset).  You&amp;#8217;ll see this PCI device appear when the VM boots:&lt;/p&gt;
&lt;pre&gt;
$ dmesg | grep 6300
i6300ESB timer: initialized (0xffffc20000016000). heartbeat=30 sec (nowayout=0)
$ /sbin/lspci | grep 6300
00:05.0 System peripheral: Intel Corporation 6300ESB Watchdog Timer
&lt;/pre&gt;
&lt;p&gt;In the guest, install the &lt;a href=&quot;http://watchdog.sourceforge.net/&quot;&gt;watchdog daemon&lt;/a&gt;.  Linux contains a driver already for the i6300ESB, and for Windows you can download drivers from Intel&amp;#8217;s website.&lt;/p&gt;
&lt;p&gt;Configure &lt;code&gt;/etc/watchdog.conf&lt;/code&gt; and perhaps write a few custom tests.  Make sure the watchdog service is set to start at boot.  Once the watchdog service is started, it will tickle the (virtual) hardware watchdog.  If qemu / KVM notices that the software is no longer tickling the virtual port, it will hard reboot the VM.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1324/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1324/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1324/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1324/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1324/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1324/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1324/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1324/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1324/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1324/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1324&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Wed, 03 Mar 2010 15:31:31 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1319</guid>
	<link>http://rwmj.wordpress.com/2010/03/02/is-ext234-faster-on-lvm/</link>
	<description>&lt;p&gt;This question arose at work &amp;#8212; is LVM a performance penalty compared to using straight partitions?  To save you the trouble, the answer is &amp;#8220;not really&amp;#8221;.  There is a very small penalty, but as with all benchmarks it does depend on what the benchmark measures versus what your real workload does.  In any case, here is a small &lt;a href=&quot;http://libguestfs.org/guestfish.1.html&quot;&gt;guestfish&lt;/a&gt; script you can use to compare the performance of various filesystems with or without LVM, with various operations.  Whether you trust the results is up to you, but I would advise caution.&lt;/p&gt;
&lt;pre&gt;
#!/bin/bash -

tmpfile=/tmp/test.img

for fs in ext2 ext3 ext4; do
    for lvm in off on; do
        rm -f $tmpfile
        if [ $lvm = &quot;on&quot; ]; then
            guestfish &amp;lt;&amp;lt;EOF
              sparse $tmpfile 1G
              run
              part-disk /dev/sda efi
              pvcreate /dev/sda1
              vgcreate VG /dev/sda1
              lvcreate LV VG 800
              mkfs $fs /dev/VG/LV
EOF
            dev=/dev/VG/LV
        else # no LVM
            guestfish &amp;lt;&amp;lt;EOF
              sparse $tmpfile 1G
              run
              part-disk /dev/sda efi
              mkfs $fs /dev/sda1
EOF
            dev=/dev/sda1
        fi
        echo &amp;quot;fs=$fs lvm=$lvm&amp;quot;
        sync
        guestfish -a $tmpfile -m $dev &amp;lt;&amp;lt;EOF
          time fallocate /file1 200000000
          time cp /file1 /file2
EOF
    done
done
&lt;/pre&gt;
&lt;pre&gt;
fs=ext2 lvm=off
elapsed time: 2.74 seconds
elapsed time: 4.52 seconds
fs=ext2 lvm=on
elapsed time: 2.60 seconds
elapsed time: 4.24 seconds
fs=ext3 lvm=off
elapsed time: 2.62 seconds
elapsed time: 4.31 seconds
fs=ext3 lvm=on
elapsed time: 3.07 seconds
elapsed time: 4.79 seconds

# notice how ext4 is much faster at fallocate, because it
# uses extents

fs=ext4 lvm=off
elapsed time: 0.05 seconds
elapsed time: 3.54 seconds
fs=ext4 lvm=on
elapsed time: 0.05 seconds
elapsed time: 4.16 seconds
&lt;/pre&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1319/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1319&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 02 Mar 2010 21:21:11 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1313</guid>
	<link>http://rwmj.wordpress.com/2010/03/02/guestfish-supports-267-commands/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://libguestfs.org/FAQ.html#api&quot;&gt;FAQ entry: The API has hundreds of methods, where do I start?&lt;/a&gt; A: Start with the &lt;a href=&quot;http://libguestfs.org/guestfs.3.html#api_overview&quot;&gt;API overview in the manual page&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;
$ guestfish -h
    Command              Description
help                 display a list of commands or help on a command
quit                 quit guestfish
alloc                allocate an image
echo                 display a line of text
edit                 edit a file in the image
lcd                  local change directory
glob                 expand wildcards in command
more                 view a file in the pager
reopen               close and reopen libguestfs handle
sparse               allocate a sparse image file
time                 measure time taken to run command
add-cdrom            add a CD-ROM disk image to examine
add-drive            add an image to examine or modify
add-drive-ro         add a drive in snapshot mode (read-only)
add-drive-ro-with-if add a drive read-only specifying the QEMU block emulation to use
add-drive-with-if    add a drive specifying the QEMU block emulation to use
aug-close            close the current Augeas handle
aug-defnode          define an Augeas node
aug-defvar           define an Augeas variable
aug-get              look up the value of an Augeas path
aug-init             create a new Augeas handle
aug-insert           insert a sibling Augeas node
aug-load             load files into the tree
aug-ls               list Augeas nodes under augpath
aug-match            return Augeas nodes which match augpath
aug-mv               move Augeas node
aug-rm               remove an Augeas path
aug-save             write all pending Augeas changes to disk
aug-set              set Augeas path to value
available            test availability of some parts of the API
blockdev-flushbufs   flush device buffers
blockdev-getbsz      get blocksize of block device
blockdev-getro       is block device set to read-only
blockdev-getsize64   get total size of device in bytes
blockdev-getss       get sectorsize of block device
blockdev-getsz       get total size of device in 512-byte sectors
blockdev-rereadpt    reread partition table
blockdev-setbsz      set blocksize of block device
blockdev-setro       set block device to read-only
blockdev-setrw       set block device to read-write
case-sensitive-path  return true path on case-insensitive filesystem
cat                  list the contents of a file
checksum             compute MD5, SHAx or CRC checksum of file
chmod                change file mode
chown                change file owner and group
command              run a command from the guest filesystem
command-lines        run a command, returning lines
config               add qemu parameters
cp                   copy a file
cp-a                 copy a file or directory recursively
dd                   copy from source to destination using dd
debug                debugging and internals
df                   report file system disk space usage
df-h                 report file system disk space usage (human readable)
dmesg                return kernel messages
download             download a file to the local machine
drop-caches          drop kernel page cache, dentries and inodes
du                   estimate file space usage
e2fsck-f             check an ext2/ext3 filesystem
echo-daemon          echo arguments back to the client
egrep                return lines matching a pattern
egrepi               return lines matching a pattern
equal                test if two files have equal contents
exists               test if file or directory exists
fallocate            preallocate a file in the guest filesystem
fgrep                return lines matching a pattern
fgrepi               return lines matching a pattern
file                 determine file type
filesize             return the size of the file in bytes
fill                 fill a file with octets
find                 find all files and directories
find0                find all files and directories, returning NUL-separated list
fsck                 run the filesystem checker
get-append           get the additional kernel options
get-autosync         get autosync mode
get-direct           get direct appliance mode flag
get-e2label          get the ext2/3/4 filesystem label
get-e2uuid           get the ext2/3/4 filesystem UUID
get-memsize          get memory allocated to the qemu subprocess
get-path             get the search path
get-pid              get PID of qemu subprocess
get-qemu             get the qemu binary
get-recovery-proc    get recovery process enabled flag
get-selinux          get SELinux enabled flag
get-state            get the current state
get-trace            get command trace enabled flag
get-verbose          get verbose mode
getcon               get SELinux security context
getxattrs            list extended attributes of a file or directory
glob-expand          expand a wildcard path
grep                 return lines matching a pattern
grepi                return lines matching a pattern
grub-install         install GRUB
head                 return first 10 lines of a file
head-n               return first N lines of a file
hexdump              dump a file in hexadecimal
initrd-cat           list the contents of a single file in an initrd
initrd-list          list files in an initrd
inotify-add-watch    add an inotify watch
inotify-close        close the inotify handle
inotify-files        return list of watched files that had events
inotify-init         create an inotify handle
inotify-read         return list of inotify events
inotify-rm-watch     remove an inotify watch
is-busy              is busy processing a command
is-config            is in configuration state
is-dir               test if file exists
is-file              test if file exists
is-launching         is launching subprocess
is-ready             is ready to accept commands
kill-subprocess      kill the qemu subprocess
launch               launch the qemu subprocess
lchown               change file owner and group
lgetxattrs           list extended attributes of a file or directory
list-devices         list the block devices
list-partitions      list the partitions
ll                   list the files in a directory (long format)
ln                   create a hard link
ln-f                 create a hard link
ln-s                 create a symbolic link
ln-sf                create a symbolic link
lremovexattr         remove extended attribute of a file or directory
ls                   list the files in a directory
lsetxattr            set extended attribute of a file or directory
lstat                get file information for a symbolic link
lstatlist            lstat on multiple files
lvcreate             create an LVM volume group
lvm-remove-all       remove all LVM LVs, VGs and PVs
lvremove             remove an LVM logical volume
lvrename             rename an LVM logical volume
lvresize             resize an LVM logical volume
lvs                  list the LVM logical volumes (LVs)
lvs-full             list the LVM logical volumes (LVs)
lxattrlist           lgetxattr on multiple files
mkdir                create a directory
mkdir-mode           create a directory with a particular mode
mkdir-p              create a directory and parents
mkdtemp              create a temporary directory
mke2fs-J             make ext2/3/4 filesystem with external journal
mke2fs-JL            make ext2/3/4 filesystem with external journal
mke2fs-JU            make ext2/3/4 filesystem with external journal
mke2journal          make ext2/3/4 external journal
mke2journal-L        make ext2/3/4 external journal with label
mke2journal-U        make ext2/3/4 external journal with UUID
mkfifo               make FIFO (named pipe)
mkfs                 make a filesystem
mkfs-b               make a filesystem with block size
mkmountpoint         create a mountpoint
mknod                make block, character or FIFO devices
mknod-b              make block device node
mknod-c              make char device node
mkswap               create a swap partition
mkswap-L             create a swap partition with a label
mkswap-U             create a swap partition with an explicit UUID
mkswap-file          create a swap file
modprobe             load a kernel module
mount                mount a guest disk at a position in the filesystem
mount-loop           mount a file using the loop device
mount-options        mount a guest disk with mount options
mount-ro             mount a guest disk, read-only
mount-vfs            mount a guest disk with mount options and vfstype
mountpoints          show mountpoints
mounts               show mounted filesystems
mv                   move a file
ntfs-3g-probe        probe NTFS volume
part-add             add a partition to the device
part-disk            partition whole disk with a single primary partition
part-get-parttype    get the partition table type
part-init            create an empty partition table
part-list            list partitions on a device
part-set-bootable    make a partition bootable
part-set-name        set partition name
ping-daemon          ping the guest daemon
pread                read part of a file
pvcreate             create an LVM physical volume
pvremove             remove an LVM physical volume
pvresize             resize an LVM physical volume
pvs                  list the LVM physical volumes (PVs)
pvs-full             list the LVM physical volumes (PVs)
read-file            read a file
read-lines           read file as lines
readdir              read directories entries
readlink             read the target of a symbolic link
readlinklist         readlink on multiple files
realpath             canonicalized absolute pathname
removexattr          remove extended attribute of a file or directory
resize2fs            resize an ext2/ext3 filesystem
rm                   remove a file
rm-rf                remove a file or directory recursively
rmdir                remove a directory
rmmountpoint         remove a mountpoint
scrub-device         scrub (securely wipe) a device
scrub-file           scrub (securely wipe) a file
scrub-freespace      scrub (securely wipe) free space
set-append           add options to kernel command line
set-autosync         set autosync mode
set-direct           enable or disable direct appliance mode
set-e2label          set the ext2/3/4 filesystem label
set-e2uuid           set the ext2/3/4 filesystem UUID
set-memsize          set memory allocated to the qemu subprocess
set-path             set the search path
set-qemu             set the qemu binary
set-recovery-proc    enable or disable the recovery process
set-selinux          set SELinux enabled or disabled at appliance boot
set-trace            enable or disable command traces
set-verbose          set verbose mode
setcon               set SELinux security context
setxattr             set extended attribute of a file or directory
sfdisk               create partitions on a block device
sfdiskM              create partitions on a block device
sfdisk-N             modify a single partition on a block device
sfdisk-disk-geometry display the disk geometry from the partition table
sfdisk-kernel-geometry display the kernel geometry
sfdisk-l             display the partition table
sh                   run a command via the shell
sh-lines             run a command via the shell returning lines
sleep                sleep for some seconds
stat                 get file information
statvfs              get file system statistics
strings              print the printable strings in a file
strings-e            print the printable strings in a file
swapoff-device       disable swap on device
swapoff-file         disable swap on file
swapoff-label        disable swap on labeled swap partition
swapoff-uuid         disable swap on swap partition by UUID
swapon-device        enable swap on device
swapon-file          enable swap on file
swapon-label         enable swap on labeled swap partition
swapon-uuid          enable swap on swap partition by UUID
sync                 sync disks, writes are flushed through to the disk image
tail                 return last 10 lines of a file
tail-n               return last N lines of a file
tar-in               unpack tarfile to directory
tar-out              pack directory into tarfile
tgz-in               unpack compressed tarball to directory
tgz-out              pack directory into compressed tarball
touch                update file timestamps or create a new file
truncate             truncate a file to zero size
truncate-size        truncate a file to a particular size
tune2fs-l            get ext2/ext3/ext4 superblock details
umask                set file mode creation mask (umask)
umount               unmount a filesystem
umount-all           unmount all filesystems
upload               upload a file from the local machine
utimens              set timestamp of a file with nanosecond precision
version              get the library version number
vfs-type             get the Linux VFS type corresponding to a mounted device
vg-activate          activate or deactivate some volume groups
vg-activate-all      activate or deactivate all volume groups
vgcreate             create an LVM volume group
vgremove             remove an LVM volume group
vgrename             rename an LVM volume group
vgs                  list the LVM volume groups (VGs)
vgs-full             list the LVM volume groups (VGs)
wc-c                 count characters in a file
wc-l                 count lines in a file
wc-w                 count words in a file
write-file           create a file
zegrep               return lines matching a pattern
zegrepi              return lines matching a pattern
zero                 write zeroes to the device
zerofree             zero unused inodes and disk blocks on ext2/3 filesystem
zfgrep               return lines matching a pattern
zfgrepi              return lines matching a pattern
zfile                determine file type inside a compressed file
zgrep                return lines matching a pattern
zgrepi               return lines matching a pattern
    Use -h  / help  to show detailed help for a command.
&lt;/pre&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1313/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1313/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1313/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1313/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1313/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1313/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1313/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1313/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1313/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1313/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1313&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 02 Mar 2010 19:08:46 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1309</guid>
	<link>http://rwmj.wordpress.com/2010/03/02/virt-tools-on-debian/</link>
	<description>&lt;p&gt;A shout out to Debian packaging genius Guido Gunther who &lt;a href=&quot;http://honk.sigxcpu.org/con/Libguestfs__Detecting_Debian_kernels_and_packages.html&quot;&gt;demonstrates how to use virt-inspector, virt-df, virt-edit and guestfish on Debian virtual machines&lt;/a&gt;.  You can download the Debian packages via this link on our &lt;a href=&quot;http://libguestfs.org/FAQ.html#binaries&quot;&gt;FAQ page&lt;/a&gt; or &lt;a href=&quot;http://pkg-libvirt.alioth.debian.org/packages/&quot;&gt;direct from alioth&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1309/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1309/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1309/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1309/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1309/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1309/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1309/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1309/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1309/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1309/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1309&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 02 Mar 2010 19:03:14 +0000</pubDate>
</item>
<item>
	<title>GLLUG: 18th March - Greater London LUG Meeting</title>
	<guid>http://www.gllug.org.uk/index.php?/archives/47-guid.html</guid>
	<link>http://www.gllug.org.uk/index.php?/archives/47-18th-March-Greater-London-LUG-Meeting.html</link>
	<description>Date: Thursday, March 18, 2010&lt;br /&gt;
Time:  7:30pm - 9:30pm&lt;br /&gt;
Location: Univ of Westminster Campus&lt;br /&gt;
Street:	New Cavendish Street&lt;br /&gt;
City/Town: London&lt;br /&gt;
&lt;br /&gt;
Map: &lt;img src=&quot;http://www.gllug.org.uk/uploads/uwncs.png&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;a href=&quot;http://www.openstreetmap.org/index.html?mlat=51.520918&amp;mlon=-0.140103&amp;zoom=14&quot;&gt;View Larger Map&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
There will be a talk for the GLLUG by Richard Jones on libguestfs[1] on Thursday 18th March at 1930. It will be held at the Cavendish campus of the University of Westminster, in the Large Lecture Theatre. I will try and get a more accurate description of the lecture theatre's location and post it to the mailing list and website. If people could arrive at 1900 to make sure we are ready to begin at 1930. After the talk I suggest we go to a decent local pub for a social.&lt;br /&gt;
&lt;br /&gt;
Please email &lt;a href=&quot;mailto:general.mooney@googlemail.com&quot;&gt;general.mooney-at-googlemail.com&lt;/a&gt; if you are attending in order to get an idea of the expected number of people.&lt;br /&gt;
&lt;br /&gt;
Ciaran Mooney&lt;br /&gt;
&lt;br /&gt;
[1] &lt;a href=&quot;http://libguestfs.org&quot;&gt;http://libguestfs.org&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
	<pubDate>Tue, 02 Mar 2010 12:42:11 +0000</pubDate>
</item>
<item>
	<title>davblog - Dave Cross: OLB Non Enrolled Non Endorsed 1</title>
	<guid>tag:blog.dave.org.uk,2010://1.1647</guid>
	<link>http://blog.dave.org.uk/2010/03/olb-non-enrolled-non-endorsed-.html</link>
	<description>&lt;p&gt;When communicating with your customers, it's important to look at the information that you're sending from their point of view. Are they really going to be interested in the information that you send?&lt;/p&gt;
&lt;p&gt;Earlier today I finally got round to unsubscribing from the MBNA marketing emails that have been annoying me for months. To confirm my unsubscription they sent me an email which started with this:&lt;/p&gt;
&lt;blockquote&gt;We are sorry that you unsubscribed from the newsletter OLB Non Enrolled Non Endorsed 1&lt;/blockquote&gt;
&lt;p&gt;Is there really any customer who is going to be even slightly interested in that level of detail? I don't care what your internal name for the newsletter is. I just want to stop seeing it in my inbox.&lt;/p&gt;</description>
	<pubDate>Mon, 01 Mar 2010 15:27:02 +0000</pubDate>
</item>
<item>
	<title>davblog - Dave Cross: The Learning Guitar</title>
	<guid>tag:blog.dave.org.uk,2010://1.1646</guid>
	<link>http://blog.dave.org.uk/2010/03/the-learning-guitar.html</link>
	<description>I don't play the guitar very well at all. I'll sometimes say that I play it better than average, but that's a claim that can only be justified by pointing out that the vast majority of people don't play guitar at all so anyone who knows two or three chords is already well above average.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have, however, been playing guitar (for some loose definition of the word &quot;playing&quot;) for a rather long time. Just how long was brought home to me this weekend.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're having a lot of building work done in our house over the next few months and as a precursor to that we have had to clear pretty much everything out of the first floor. A lot of stuff has gone into storage, but we also took a lot of stuff to our local tip on Saturday. That load included three guitars and one of them was &quot;The Learning Guitar&quot;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Learning Guitar was (as its name suggests) the guitar that I first learnt to play on. It was a cheap nylon-stringed Spanish guitar that my parents bought me when I started to take lessons. That was very soon after I started at secondary school in September 1974. There was an after school class which I joined. I think I stopped going after only a couple of months as we were learning boring stuff like &quot;When The Saints Go Marching In&quot; when I wanted to be playing stuff by Slade or David Bowie. At the time I assumed that we weren't learning that stuff because it was too difficult for beginners. Later I realised that a lot of the music I enjoyed was actually just as simple as the stuff we were taught - it was just that the teachers were a bit old-fashioned.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I carried on teaching myself though. I bought a Mel Bay book and spent hours practicising in my bedroom. Of course I had no real idea what I was doing and I picked up a number of bad habits that hamper my playing even now. But I was enjoying myself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Soon after moving to London to go to university I got another guitar. It was a Fender F3. A much nicer-sounding guitar. My original guitar was somewhat ignored. For a year I shared a flat with someone who played guitar really well and by watching him my playing improved a lot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But the Learning Guitar still had some life in it. Over the next fifteen or twenty years I took to lending it to friends who wanted to learn guitar. The story was always the same. Someone borrowed it for a couple of years and when they thought the time was right, they'd buy a better guitar and give the Learning Guitar back to me. It was during this period that the guitar acquired its nickname. The last person to borrow it like this was my step-daughter who took it with her when she went to university. As always, i came back after a couple of years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Over the last ten years, I've played guitar a lot less. I couldn't really justify storing the four guitars that I had cluttering up my study. So this weekend they all went except the Fender. We loaded up a van and took them to the Wandsworth Council dump. Of all of the things that I threw away on Saturday, the Learning Guitar was the thing that I felt most guilty about. I threw it high up on a mountain of rubbish at the dump. At one point I considered trying to retrieve it, but it was too far away.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was never a particularly good guitar. But a lot of people have strummed their first tentative chords on that guitar. It's a shame to see it go.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Later this week, I hope to get rid of my collection of records. That has sat in a cupboard unused for over ten years. There's really no reason to keep it. But if you think I have got needlessly sentimental about an old guitar, you haven't seen anything yet. I'll be getting far more nostalgic about the records.&lt;/div&gt;</description>
	<pubDate>Mon, 01 Mar 2010 12:21:37 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1300</guid>
	<link>http://rwmj.wordpress.com/2010/02/27/densha-de-gone/</link>
	<description>&lt;p&gt;&lt;img src=&quot;http://www.cookingwithrichard.com/wp-content/uploads/2009/02/densha.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I enjoyed playing a Japanese import of &lt;a href=&quot;http://en.wikipedia.org/wiki/Densha_de_Go!&quot;&gt;Densha De Go&lt;/a&gt; (an accurate &lt;a href=&quot;http://en.wikipedia.org/wiki/Shinkansen&quot;&gt;Shinkansen&lt;/a&gt; train simulator) on my old Nintendo Wii.  I played this legally (albeit expensively) imported game using some other software called &lt;a href=&quot;http://en.wikipedia.org/wiki/Wii_Freeloader&quot;&gt;Wii Freeloader&lt;/a&gt;.  Since Nintendo does not like people using software from outside the &lt;a href=&quot;http://en.wikipedia.org/wiki/Regional_lockout&quot;&gt;&amp;#8220;right&amp;#8221; places&lt;/a&gt;, &amp;#8220;Freeloader&amp;#8221; had to exploit a bug in the firmware to allow Densha de Go to play.&lt;/p&gt;
&lt;p&gt;Today I upgraded the firmware on my Wii console.&lt;/p&gt;
&lt;p&gt;I am no longer able to play Densha De Go at all.  Nintendo have successfully covered all options and there is no way to play my legally purchased and imported software from other &amp;#8220;regions&amp;#8221; of the world.&lt;/p&gt;
&lt;p&gt;So today I learned my lesson.  Never &lt;i&gt;absolutely never&lt;/i&gt; buy or get involved in proprietary software.  Never buy anything ever again from Nintendo.  Never buy another phone from Apple, or Microsoft, or any computer with proprietary software no matter how convenient it may seem in the short term.&lt;/p&gt;
&lt;p&gt;Enough is enough.&lt;/p&gt;
&lt;p&gt;If I bought the hardware, I want to do whatever I want with it.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1300/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1300&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Sat, 27 Feb 2010 21:59:50 +0000</pubDate>
</item>
<item>
	<title>www.DavidPashley.com/blog: Reducing Coupling between modules</title>
	<guid>http://www.davidpashley.com/blog/2010/02/25#reducing-coupling</guid>
	<link>http://www.davidpashley.com/blog/2010/02/25#reducing-coupling</link>
	<description>&lt;div&gt;
   &lt;p&gt;In the past, several of my &lt;a href=&quot;http://reductivelabs.com/products/puppet/&quot;&gt;Puppet&lt;/a&gt; modules have
been tightly coupled. A perfect example is &lt;a href=&quot;http://httpd.apache.org&quot;&gt;Apache&lt;/a&gt; and &lt;a href=&quot;http://munin.projects.linpro.no/&quot;&gt;Munin&lt;/a&gt;. When I
install Apache, I want munin graphs set up. As a result my apache class
has the following snippet in it:&lt;/p&gt;
&lt;pre&gt;
munin::plugin { &quot;apache_accesses&quot;: }
munin::plugin { &quot;apache_processes&quot;: }
munin::plugin { &quot;apache_volume&quot;: }
&lt;/pre&gt;
&lt;p&gt;This should make sure that these three plugins are installed and that
munin-node is restarted to pick them up. The define was implemented like
this:&lt;/p&gt;
&lt;pre&gt;
define munin::plugin (
      $enable = true,
      $plugin_name = false,
      ) {

   include munin::node

   file { &quot;/etc/munin/plugins/$name&quot;:
      ensure =&amp;gt; $enable ? {
         true =&amp;gt; $plugin_name ? {
            false =&amp;gt; &quot;/usr/share/munin/plugins/$name&quot;,
            default =&amp;gt; &quot;/usr/share/munin/plugins/$plugin_name&quot;
         },
         default =&amp;gt; absent
      },
      links =&amp;gt; manage,
      require =&amp;gt; Package[&quot;munin-node&quot;],
      notify =&amp;gt; Service[&quot;munin-node&quot;],
   }
}
&lt;/pre&gt;
&lt;p&gt;(Note: this is a slight simplification of the define). As you can
see, the define includes &lt;tt&gt;munin::node&lt;/tt&gt;, as it needs the definition of the
munin-node service and package. As a result of this, installing Apache
drags in munin-node on your server too. It would be much nicer if the
apache class only installed the munin plugins if you also install munin
on the server.&lt;/p&gt;

&lt;p&gt;It turns out that is is possible, using &lt;a href=&quot;http://reductivelabs.com/trac/puppet/wiki/VirtualResources&quot;&gt;virtual
resources&lt;/a&gt;. Virtual resources allow you to define resources in one
place, but not make them happen unless you realise them. Using this, we
can make the file resource in the &lt;tt&gt;munin::plugin&lt;/tt&gt; virtual and realise it
in our &lt;tt&gt;munin::node&lt;/tt&gt; class. Our new &lt;tt&gt;munin::plugin&lt;/tt&gt; looks like:&lt;/p&gt;
&lt;pre&gt;
define munin::plugin (
      $enable = true,
      $plugin_name = false,
      ) {

   &lt;b&gt;# removed &quot;include munin::node&quot;&lt;/b&gt;

   &lt;b&gt;# Added @ in front of the resource to declare it as virtual&lt;/b&gt;
   &lt;b&gt;@&lt;/b&gt;file { &quot;/etc/munin/plugins/$name&quot;:
      ensure =&amp;gt; $enable ? {
         true =&amp;gt; $plugin_name ? {
            false =&amp;gt; &quot;/usr/share/munin/plugins/$name&quot;,
            default =&amp;gt; &quot;/usr/share/munin/plugins/$plugin_name&quot;
         },
         default =&amp;gt; absent
      },
      links =&amp;gt; manage,
      require =&amp;gt; Package[&quot;munin-node&quot;],
      notify =&amp;gt; Service[&quot;munin-node&quot;],
      &lt;b&gt;tag =&amp;gt; munin-plugin,&lt;/b&gt;
   }
}
&lt;/pre&gt;
&lt;p&gt;We add the following line to our &lt;tt&gt;munin::node&lt;/tt&gt; class:&lt;/p&gt;
&lt;pre&gt;
File&amp;lt;| tag == munin-plugin |&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The odd syntax in the &lt;tt&gt;munin::node&lt;/tt&gt; class realises all the
virtual resources that match the filter, in this case, any that is
tagged &lt;tt&gt;munin-plugin&lt;/tt&gt;. We've had to define this tag ourself, as
the auto-generated tags don't seem to work. You'll also notice that
we've removed the &lt;tt&gt;munin::node&lt;/tt&gt; include from the
&lt;tt&gt;munin::plugin&lt;/tt&gt; define, which means that we no longer install
munin-node just by using the plugin define. I've used a similar
technique for logcheck, so additional rules are not installed unless
I've installed logcheck. I'm sure there are several other places where I
can use it to reduce such tight coupling between classes.&lt;/p&gt;

      &lt;div&gt;&lt;a href=&quot;http://www.davidpashley.com/blog/systems-administration/puppet/reducing-coupling&quot; title=&quot;Permalink&quot;&gt;Read Comments (2)&lt;/a&gt; &lt;/div&gt;
   &lt;/div&gt;</description>
	<pubDate>Thu, 25 Feb 2010 09:30:18 +0000</pubDate>
</item>
<item>
	<title>davblog - Dave Cross: Homeopathy Petition</title>
	<guid>tag:blog.dave.org.uk,2010://1.1645</guid>
	<link>http://blog.dave.org.uk/2010/02/homeopathy-petition.html</link>
	<description>&lt;p&gt;We're all, of course, very happy about the &lt;a href=&quot;http://blog.dave.org.uk/2010/02/nhs-money-wasted-on-homeopathy.html&quot;&gt;results of the House of Commons Science and Technology committee's evidence check on homeopathy&lt;/a&gt;. But it's important to realise exactly what has happened. This is a House of Commons committee which has produced a list of recommendations. The government is under no obligation at all to take any notice of those recommendations. Unfortunately, &lt;a href=&quot;http://twitter.com/RichardWiseman/status/9472482710&quot;&gt;Richard Wiseman's tweet&lt;/a&gt;, &quot;yipppeeee it's official, NHS will no longer give people smarties&quot;, is likely to be somewhat premature.&lt;/p&gt;
&lt;p&gt;So that's why I've set up &lt;a href=&quot;http://petitions.number10.gov.uk/nohomeopathy/&quot;&gt;a petition on the number 10 web site&lt;/a&gt;. The petition says:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We the undersigned petition the Prime Minister to Implement the recommendations of the House Commons Science and Technology committee evidence check on Homeopathy.&lt;/p&gt;
&lt;p&gt;The House Commons Science and Technology committee has recently undertaken an evidence check on the usefulness of homeopathy and has now published its report.&lt;/p&gt;
&lt;p&gt;The conclusions are unequivocal. They say &quot;To maintain patient trust, choice and safety, the Government should not endorse the use of placebo treatments, including homeopathy. Homeopathy should not be funded on the NHS and the MHRA should stop licensing homeopathic products.&quot;&lt;/p&gt;
&lt;p&gt;The government should implement these recommendations as soon as possible.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If we can get enough people to sign this petition I hope we can send a message to the government letting them know that we support the committee's findings and don't want the NHS's money wasted on nonsense like homeopathy.&lt;/p&gt;
&lt;p&gt;Of course, this close to an election, the government is likely to be very wary of making any kind of a statement that might lose them support amongst the woo-mongers. We need to persuade them that skeptical (and rational) voters outnumber the idiots. At the very least, we should be able to get more signatures than &lt;a href=&quot;http://petitions.number10.gov.uk/Homeopathy1/&quot;&gt;this ridiculous petition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://petitions.number10.gov.uk/nohomeopathy/&quot;&gt;So please sign the petition.&lt;/a&gt; And please pass the details on to anyone else who might be interested. The battle has not been won yet.&lt;/p&gt;</description>
	<pubDate>Thu, 25 Feb 2010 09:09:48 +0000</pubDate>
</item>
<item>
	<title>Karanbir Singh: London Devops mailing list, googlegroups and google accounts</title>
	<guid>http://www.karan.org/blog/xmlsrv/299@http://www.karan.org/blog/</guid>
	<link>http://www.karan.org/blog/index.php/2010/02/24/london-devops-mailing-list-googlegroups-and-google-accounts</link>
	<description>&lt;p&gt;Just signed upto the &lt;a href=&quot;http://londondevops.org/&quot;&gt;London Devops&lt;/a&gt; &lt;a href=&quot;http://groups.google.com/group/london-devops/&quot;&gt;mailing lis&lt;/a&gt;t, and thought I'd just point out that one does not need a google account to join a google groups hosted list. Just send an email to the &amp;lt;list-name&amp;gt;+subscribe@googlegroups.com with 'subscribe' in the subject line of the email, and their list managment software will sign you up.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;So in this case, sending an email with:&lt;/p&gt;
&lt;pre&gt;&lt;br /&gt;To: london-devops+subscribe@googlegroups.com&lt;br /&gt;Subject: Subscribe&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;.. would be all thats needed to get you on there.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Google groups has a &lt;a href=&quot;http://groups.google.com/support/bin/answer.py?hl=en&amp;answer=46438&quot;&gt;help page&lt;/a&gt; with details on what all services they host which &lt;a href=&quot;http://groups.google.com/support/bin/answer.py?hl=en&amp;answer=46438&quot;&gt;dont need a google account&lt;/a&gt; to use.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.karan.org/blog/index.php/2010/02/24/london-devops-mailing-list-googlegroups-and-google-accounts&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 25 Feb 2010 01:49:45 +0000</pubDate>
</item>
<item>
	<title>davblog - Dave Cross: NHS Money Wasted on Homeopathy</title>
	<guid>tag:blog.dave.org.uk,2010://1.1643</guid>
	<link>http://blog.dave.org.uk/2010/02/nhs-money-wasted-on-homeopathy.html</link>
	<description>&lt;p&gt;Don't have time to go into the detail that it deserves, but the House of Commons science and technology committee has published the &lt;a href=&quot;http://www.publications.parliament.uk/pa/cm200910/cmselect/cmsctech/45/45.pdf&quot;&gt;results of its evidence check on homeopathy&lt;/a&gt;. The results won't, of course, come as any surprise to anyone who has been following the debate. But I have to admit to be impressed by the lack of ambiguity in their conclusions. This is paragraph 157:&lt;/p&gt;
&lt;blockquote&gt;By providing homeopathy on the NHS and allowing &lt;abbr title=&quot;Medicine and Healthcare products Regulatory Agency&quot;&gt;MHRA&lt;/abbr&gt; licensing of products which subsequently appear on pharmacy shelves, the Government runs the risk of endorsing homeopathy as an efficacious system of medicine. To maintain patient trust, choice and safety, the Government should not endorse the use of placebo treatments, including homeopathy. Homeopathy should not be funded on the NHS and the MHRA should stop licensing homeopathic products.&lt;/blockquote&gt;
&lt;p&gt;Absolutely no equivocation there.&lt;/p&gt;
&lt;p&gt;So what's the next step? When to the homeopathic &quot;hospitals&quot; get closed down? When does the NHS get that money back for real medicine?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; The Woo-mongers in the House of Commons don't plan to take this laying down. They've proposed an Early Day Motion criticising the committee's report. Of course, only MPs with no grasp of science will be signing it. If your &lt;a href=&quot;http://www.edms.org.uk/edms/2009-2010/908.htm&quot;&gt;MP is on this list&lt;/a&gt;, then I suggest a strongly worded email might be in order.&lt;/p&gt;</description>
	<pubDate>Wed, 24 Feb 2010 14:59:04 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1296</guid>
	<link>http://rwmj.wordpress.com/2010/02/23/virt-top-is-in-debian/</link>
	<description>&lt;p&gt;I just discovered that &lt;a href=&quot;http://people.redhat.com/~rjones/virt-top/&quot;&gt;virt-top&lt;/a&gt; is now in Debian.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://rwmj.files.wordpress.com/2010/02/virt-top.png?w=500&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.redhat.com/~rjones/virt-top/&quot;&gt;virt-top&lt;/a&gt; (which I wrote) is the far superior alternative to &amp;#8220;xentop&amp;#8221;.  I wrote it after having to manage some servers with only xentop available.  I wrote it because xentop was so crap.&lt;/p&gt;
&lt;p&gt;Why is virt-top better?  It supports more statistics.  It works with libvirt so it works with almost every hypervisor not just Xen.  It has a much nicer UI and documentation.  And it has advanced logging modes so you can leave it running in the background and capture information for your website/database/stats/monitoring.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1296/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1296/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1296/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1296/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1296/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1296/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1296/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1296/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1296/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1296/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1296&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 23 Feb 2010 21:46:48 +0000</pubDate>
</item>
<item>
	<title>Richard WM Jones: rich</title>
	<guid>http://rwmj.wordpress.com/?p=1290</guid>
	<link>http://rwmj.wordpress.com/2010/02/23/libguestfs-1-0-84-for-debian/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://honk.sigxcpu.org/con/&quot;&gt;Guido Günther&lt;/a&gt; has built the very latest libguestfs 1.0.84 &lt;a href=&quot;http://honk.sigxcpu.org/con/Libguestfs__Virtual_Machine_Image_Swiss_Army_Knife.html&quot;&gt;official packages for Debian&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;a href=&quot;http://rwmj.wordpress.com/2010/02/15/ubuntu-9-10-packages-for-libguestfs/&quot;&gt;Previously&lt;/a&gt; Ubuntu packages &amp;#8230;&lt;/i&gt;&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rwmj.wordpress.com/1290/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rwmj.wordpress.com/1290/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rwmj.wordpress.com/1290/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rwmj.wordpress.com/1290/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rwmj.wordpress.com/1290/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rwmj.wordpress.com/1290/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rwmj.wordpress.com/1290/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rwmj.wordpress.com/1290/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rwmj.wordpress.com/1290/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rwmj.wordpress.com/1290/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rwmj.wordpress.com&amp;blog=6840703&amp;post=1290&amp;subd=rwmj&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 23 Feb 2010 10:06:40 +0000</pubDate>
</item>
<item>
	<title>davblog - Dave Cross: Homeopathic Dilutions</title>
	<guid>tag:blog.dave.org.uk,2010://1.1644</guid>
	<link>http://blog.dave.org.uk/2010/02/homeopathic-dilutions.html</link>
	<description>&lt;p&gt;Like many press outlets, the Daily Mail pre-empted the &lt;a href=&quot;http://blog.dave.org.uk/2010/02/nhs-money-wasted-on-homeopathy.html&quot;&gt;publication of the Science and Technology committee report&lt;/a&gt; and &lt;a href=&quot;http://www.dailymail.co.uk/news/article-1252683/Homeopathy-funded-NHS-say-MPs.html&quot;&gt;published a story&lt;/a&gt; yesterday summing up the MPs' findings. Of course the Daily Mail is the home of the gullible reader and a good number of the comments on that story are attempting to defend the woo-mongers.&lt;/p&gt;
&lt;p&gt;The Mail often stop taking comments on their stories after about a day (giving no indication that they've done so) and the number of comments on this story has stuck at eighteen since I first saw it last night so we must assume that they won't publish any more.&lt;/p&gt;
&lt;p&gt;This is a shame as there's quite a lot of unchallenged nonsense there. In particular, the most recent comment published is from Dave in Basingstoke. Someone previously in the discussion had mentioned the ludicrous amount of dilution in homeopathic solutions. Dave replies with this:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;But scientists point to the fact that the 'cures' are so diluted that the cannot possibly contain even a single molecule of the original substance.&quot;&lt;/p&gt;
&lt;p&gt;Ha! Maybe a climate change pseudo-scientist would say that, but a chemist never would because it isn't true. If you dilute a solution of anything by a million to one, there will still be thousands of molecules of the substance present in the diluted solution. The body can detect that amount, and work on it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Let's ignore his childish dig at climate change and get to the meat of his argument. Dave thinks that is you dilute something by a factor of a million then there will still be molecules of the original substance in the solution. And he's right there. No one will argue with that fact at all. But homeopathic remedies aren't million to one dilutions.&lt;/p&gt;
&lt;p&gt;Homepathic dilutions are given a number on the &quot;C scale&quot;. Each time you dilute something by a factor of a hundred, you get another point on the C scale. A dilution of a hundred to one would be called 1C. Dilute that solution be another hundred to one (that's now ten thousand to one from the original solution) and you get to 2C. Another step to 3C gives us a dilution of a million to one from the original solution. That's about the level of dilution that Dave is talking about.&lt;/p&gt;
&lt;p&gt;But homeopaths don't stop there. 3C dilutions are nothing. Remember a key tenet of homeopathy is that the weaker the dilution, the stronger the effect. Homeopaths carry on diluting their solutions again and again and again. Next time you're in Boots have a look at the numbers on the tubes of &lt;a href=&quot;http://www.boots.com/en/Pharmacy-Health/Complementary-Therapies/Homeopathy/&quot;&gt;homeopathic remedies&lt;/a&gt; that they sell. You'll see that 30C is a really common dilution. That solution has been diluted by a factor of a hundred to one thirty times. The original solution has been diluted by a factor of one to a number which is one followed by sixty zeroes. That's a huge number. With numbers like that involved, it's perfectly reasonable to say that there is none of the original material left.&lt;/p&gt;
&lt;p&gt;Here's an example to help you get to grips with those numbers. The number of water molecules in a swimming pool is going to be around a one followed by thirty two zeroes. One molecule of something else in that pool will be equivalent to a 16C homeopathic remedy. See the &lt;a href=&quot;http://en.wikipedia.org/wiki/Homeopathic_dilutions&quot;&gt;Wikipedia entry on homeopathic dilutions&lt;/a&gt; for more examples like this.&lt;/p&gt;
&lt;p&gt;This is why the slogan for the &lt;a href=&quot;http://www.1023.org.uk/&quot;&gt;10:23 campaign&lt;/a&gt; is &quot;There's nothing in it&quot;. It's literally true. There is no active ingredient left in any homeopathic remedy that you find.&lt;/p&gt;
&lt;p&gt;I'd love it it if Dave from Basingstoke found this entry. It would be great if he could see just how misinformed he is.&lt;/p&gt;</description>
	<pubDate>Mon, 22 Feb 2010 17:00:42 +0000</pubDate>
</item>

</channel>
</rss>
