Can anyone recommend some videos to me which explain the ins-and-outs of the chef and puppet configuration management tools? I have some familiarity with configuration management, having worked on cfengine (version 2) for a few years. However I haven't managed to evaluate the newer tools effectively. The barrier to entry (setting up at least a master and a slave VM...) has been too high (or I haven't given it enough time!)
If there are any good screencasts/videos that cover not just how they work but their individual advantages, that would be excellent: I have some upcoming time in which I can absorb material like that (but not the kind of time in which I could get hands-on).
I'm planning on transcoding some of the Debconf 10 event videos in order to watch them on my phone (and other devices). Most likely to an MPEG container, H264 codec or similar. Subject to a license check, I could stick the results up somewhere for others if there is any interest. Let me know via comment or email.
Google Chrome ![]() | Firefox ![]() | Internet Explorer ![]() |
About six years ago, I spent a chunk of my very first salary on a portable music player, the iRiver H140, a relatively bulky and large hard-disk based player, with a capacity of 40G. Uniquely for music players before or since, the iRiver features both digital and analogue line ins and outs. It also has (more common) recording facilities and an FM tuner, the latter of which I used a great deal (and rules out just about all the iPods).
This remarkable player has lasted nearly six years of moderate daily use. For the majority of that time, I've ran the rockbox open source firmware on the player, which has provided me with really wide codec support and excellent recording facilities.
In the last month I finally had to replace the iRiver. I bought a Sansa Fuze player, featuring 8G of flash storage and a microsd expansion slot. The Fuze is also capable of running rockbox. This year, 32G microsd cards have arrived. Adding one of those brings the capacity of the new player right back up to 40G.
For those who are curious: yes, a Sandisk 32G microsd does work in the Fuze, at least with rockbox, for playback. At the moment, rockbox cannot write to storage on the Fuze, so you need to either use the original firmware or an external reader/writer to manipulate the contents of the microsd. However, I am not sure how well the original firmware can handle the 32G. Whenever I boot it, I see a "refreshing your media" message which lasts longer than my patience. I will write an update once I've established further the degree of support.
I kept a canonical copy of my music library on a desktop computer and used rsync to keep the iRiver up-to-date. I can use almost exactly the same procedure for the new player (with some small changes to cope with the split-storage)
I now have a 40G player running rockbox exactly as I had before, albeit at a fraction of the size and weight (and cost: approximately half as expensive), and with a nicer display including colours, album art, etc.
They both can even play doom (although the controls are even more awkward than iPhone Doom).
I'm in the process of setting up a mail server, which will eventually accept mail for a given domain. I am also changing name servers for said domain (to make use of zoneedit.com).
So far, I have the new server accepting mail for the domain, and the new name server serving records for the domain, including an MX pointing at the new server. However, I haven't updated the domain record, so the authorative nameservers haven't changed.
Despite this, somehow, spammers are already attempting to submit mail for the domain in question to the new MX server. Not only that, but it's targetted at particular users with non-obvious local parts.
The new MX advertises itself as "a-sub-domain.example.org", for values of "example.org", so it's possible in theory to derive "example.org" from the banner. But unlikely.
Are they psychic? Or is a spammer somehow getting notified of new MX records hosted at zoneedit (no matter whether glue records point at them)?
I've just finished reading — and thoroughly enjoying — Transition by Iain Banks. Despite a terrible writeup in the Guardian, I found the book to concentrate just as strongly on character as world-building, but I wouldn't be surprised if a sequel was on the cards.
The novel is, in part, an exploration of the many worlds theory of quantum mechanics. Or at least that's it's setting. In the UK, it has been published without the traditional 'M' infix denoting Science Fiction, although it is undeniably so: It's not even pretending to be anything else.
The book reminded me of Quarantine, and to a lesser extend Permutation City, both by Greg Egan; and another book I've read recently which I can't reveal without spoiling this one.
Whilst re-organising offices, I found a collection of ancient X programming books. They seem like perfect book shelf ornaments for a (former?) UNIX hacker.
I was pointed today at the EVE Online Dev Blog, where they are apparently using zsync as a backup system for repairing incomplete downloads or corrupted files. It sounds like that are not using zsync itself but have probably taken the idea and/or parts of the code and built it into their own repair tool.
It seems like an odd application to me. Incomplete downloads are a rather easy case and do not require the rsync algorithm (there are plenty of HTTP and of course FTP clients that will resume partial downloads). And corrupt files - well I'm surprised if having corrupted parts of files are so common that they have to optimise for it. But I don't know anything more about their problem than is in their blog post. zsync does have the advantage that it combines downloading with verification of what you have, and it does it with minimal work for the central servers (as I guess EVE have the common problem of a high ratio of users to servers).
I'm changing jobs!
From June 1st, I will be team leader of the Computing Support team for the School of Computing Science at Newcastle University.
I will be leaving my current job as a Computing Officer within the central IT department's UNIX infrastructure team (ISS). My professional career began within ISS nearly 6 years ago. I have made many friends and will miss working with them as closely as I have.
I am really looking forward to getting stuck into my new role. Working within a school means I will be a lot closer to the University's business of teaching and learning. As a Computing Science graduate I've always had an interest in computing research and my new role will have me up close and personal with world-class researchers.
Tesco Car Insurance (and most likely their other financial products) operate a commercial email system which is populated by anyone who submits their address to them as part of searching for a car insurance quote.
That's not particularly unusual. Each mail that Tesco sends includes unsubscribe instructions - standard industry practise. However Tesco's instructions do not work. I have followed them at least three times since January this year to no avail. Despite this I have continued to receive unsolicitied commercial email (spam) from Tesco.
Tesco do not answer mail to their postmaster or abuse addresses, and do not accept mail for those local parts at many of their domains (they use more than one domain for their business: tescofinance.com, tesco.com, tescocompare.com, contact.tescocompare.com, tescoinsurance.com).
I would advise that nobody ever submit their details to a Tesco-affiliated company for these reasons. I have given up and blacklisted them on the mail servers which I control.
Based on the unrelated experiences of a friend of mine, I would have strong reservations regarding the quality of the services they offer, too - in particular their home insurance products.
A new release of Kye! No major changes in this release ‒ this is mostly an update to fix issues running Kye with newer versions of GTK and librsvg. In particular, my standard tileset no longer rendered correctly with the latest librsvg. There are also minor interface improvements.
You can get the latest version and installation help from the download page (or direct links: tgz, rpm ).
While I'm here, I was playing some levels to test the release and so I will throw out some level recommendations. Crowds is good fun. And my own level HOLD UP (from Problem.kye) remains the best of my own levels. And, um, yes I can't link to the other level set I liked because the site is down. I'll put up a few more recommendations with the next release, anyway.
I'll do a stable 1.0 release soon, once Robert's Kye page is back up (it's temporarily down while at the moment), and assuming there are no issues reported with this release.
Someone drew my attention to Ubuntu using zsync to distribute ISOs (thanks Jon). Cool — that's one of the use cases that I was testing with many years ago.
The Royal Crescent, where I am often to be found on a sunny Sunday morning.
[[!img Error: Image::Magick is not installed]]
14:31:33$ rake
(in /home/jon/wd/web/sup)
rake aborted!
no such file to load -- rubygems
/home/jon/wd/web/sup/Rakefile:33:in `require'
(See full trace by running task with --trace)
So I identify which package is necessary and install it. Then:
14:31:52$ rake
(in /home/jon/wd/web/sup)
rake aborted!
no such file to load -- gettext
/home/jon/wd/web/sup/Rakefile:35
(See full trace by running task with --trace)
So I identify which package is necessary and install it. Then:
14:32:11$ rake
(in /home/jon/wd/web/sup)
rake aborted!
no such file to load -- lockfile
/home/jon/wd/web/sup/Rakefile:35
(See full trace by running task with --trace)
So I identify which package is necessary and install it. Then:
14:32:31$ rake
(in /home/jon/wd/web/sup)
rake aborted!
no such file to load -- mime/types
/home/jon/wd/web/sup/Rakefile:35
(See full trace by running task with --trace)
So I identify which package is necessary and install it. Then:
14:32:39$ rake
(in /home/jon/wd/web/sup)
rake aborted!
no such file to load -- ncurses
/home/jon/wd/web/sup/Rakefile:35
(See full trace by running task with --trace)
So I identify which package is necessary and install it. Then:
14:33:08$ rake
(in /home/jon/wd/web/sup)
rake aborted!
no such file to load -- net/ssh
/home/jon/wd/web/sup/Rakefile:35
(See full trace by running task with --trace)
So I identify which package is necessary and install it. Then:
14:33:19$ rake
(in /home/jon/wd/web/sup)
rake aborted!
no such file to load -- ferret
/home/jon/wd/web/sup/Rakefile:35
(See full trace by running task with --trace)
So I identify which package is necessary and install it. Then:
4:33:31$ rake
(in /home/jon/wd/web/sup)
rake aborted!
Don't know how to build task 'default'
(See full trace by running task with --trace)
Well, at least that's the dependencies sorted! This is how I would have preferred things to have worked:
14:31:33$ rake
(in /home/jon/wd/web/sup)
rake aborted!
missing dependencies:
rubygems
gettext
lockfile
mime/types
ncurses
net/ssh
ferret
Once I've resolved which rake target I want (rake tarball gave me an
installation tree I could use), I'm finally in a position to run the thing:
14:38:12$ sup-config
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no
such file to load -- highline/import (LoadError)
from /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
from /home/jon/wd/web/sup/pkg/sup-999/bin/sup-config:4
Ah.


How about implementing parts of the Application Kit with GTK?
Yes and No - The GNUstep architecture provides a single, platform-independent, API for handling all aspects of GUI interaction (implemented in the gstep-gui library), with a backend architecture that permits you to have different display models (display postscript, X-windows, win32, berlin ...) while letting you use the same code for printing as for displaying. Use of GTK in the frontend gui library would remove some of those advantages without adding any.
There seems to be a lot of confusion about zsync's custom embedded version of zlib. I had not documented the exact reason for the patches very well; so I have now committed an explanation of the changes to my own repo. As I may not make another release for a little while yet, I am posting the explanation here also.
I have started a discussion with the zlib maintainer about what sort of API changes could be made such that I could use the standard zlib, but so far no-one other than me understands the requirements and I'm not actually bothered about it (it's the Fedora people who are worked up about it). So, absent anyone else stepping in to do the work, it may take me a while to get to it.
There are two different modes of operation that zsync supports that these patches are designed to support:
Changes to the deflate code: Compressing a file in a way that is optimised for zsync's block-based rsync algorithm ‒ starting a new zlib block for each 1024 byte (for example) block in the source file. cf http://zsync.moria.org.uk/paper/ch03s04.html . This is used by makegz.c in the zsync source.
Changes to the inflate code: Working with files compressed with the standard gzip(1). To enable people to get started with zsync, I want it to work with existing compressed content. To achieve optimal results with standard gzip files, I made zsync capable of starting decompression in the middle of a block. In these cases it has to download the block header, then skips forward to the part of the block that gives it the data that it wants. cf http://zsync.moria.org.uk/paper/ch03s02.html
Contrary to some internet discussion, the changes are not related to rsync's changes nor to rsync compatibility (zsync isn't compatible with rsync - whatever that would mean ‒ nor do these changes relate in any way to the rsyncable gzip patch).
Essentially, I hijacked Z_PARTIAL_FLUSH to mean something new ‒ I want to start a new zlib block, but unlike Z_PARTIAL_FLUSH I don't need to emit a whole byte between blocks, so I took that out. Correctly this ought to be implemented by adding a Z_NEWBLOCKONLY_FLUSH or something like that instead of repurposing an existing state.
(If this were the only issue preventing the use of a standard zlib, distros could change it to use Z_PARTIAL_FLUSH with only a slight loss of compression efficiency.)
zsync uses the rsync algorithm to construct a desired file from an (e.g.) older local version of the file and then downloading any new/needed blocks from a server; the aim being to minimise the amount of data downloaded to construct the target file. It supports downloading those blocks from a gzipped version of the file on the server. If I want e.g. bytes 4096-8192 of the file from inside the gzipped file, I could download the whole zlib block (using a map of the compressed file that I construct beforehand and is downloaded first) containing the range 4096-8192 (zsync 0.1.0 used this method); but it can do better (fewer bytes downloaded) than that, by downloading just the block header and then downloading the bytes within that compressed block that correspond to bytes 4096-8192 of the contained data.
To do that, I need: a) to be able to start inflating at the start of "any length/literal/eob code in any dynamic or fixed block, or at any stored byte in a stored block.". That is what additional function inflate_advance() and the export of updatewindow() allow me to do.
b) make a map of the gzip file that lets me know what points I should start downloading at in order to inflate particular byte ranges of the contained content. To do this, I can decompress each byte range into a buffer of that size and then quiz zlib for the position in the stream; but I need to know that the position in the stream does correspond to the start of a code or the middle of a stored block (not, e.g., that we have just read a backref and the backref expands to span the boundary; in that case, I would need to know that position where the backref started and the lib doesn't give me a way to find that out).
This is given by inflateSafePoint(), by the modification to cause the inflator to return to the caller at each code in a dynamic block (the LENDO change), and the implicit guarantee provided by using my own copy of the library that I know how the library behaves around internal states and stream position (I need a guarantee that the library won't read ahead more than it needs to, and I need to access certain member variables directly to get the bit position in the stream).
I also removed inflate_fast as I did not want to spend the time working out if it was compatible with these changes.
Bath is looking quite picturesque at the moment under an inch of snow.
Photos taken yesterday:
The Circus: [[!img Error: Image::Magick is not installed]]
Generally speaking, I like Google and I like Google products. I like the web, and I’m glad there’s a company such as Google who are so invested in it as a platform, and determined to push it forward. And yet, sometimes I’m baffled by Google’s seemingly half-hearted commitment to developing some of their flagship products, especially when it seems to be hurting the arrival of the web-centric world they want and need.
Google Docs is, I think, a particularly standout example. It was launched in late 2006 and initially consisted of a web-based word processor and spreadsheet that had been acquired from a couple of startups. This, it appeared, was Google’s big play to break Microsoft’s Windows/Office symbiotic stranglehold, and prove that the web was a viable platform that could compete with the desktop. The future looked very interesting indeed. And then… what happened? Presentations were added mid-2007, again taken from a startup, and a form builder was added somewhere along the way. New features and enhancements occasionally trickled out, but major improvements and game-changing innovations just never occurred. It’s telling that in the wikipedia article on Google Docs the two most recent items in the history section are:
On September 17, 2007, Google released their presentation program product for Google Docs.
On July 6th, 2009, Google announced on their official blog that Google Docs along with other Google Apps would be taken out of beta.
That’s it. In the two years after adding presentations, the only change anybody thought worthy of putting into Wikipedia was that Google had dropped the beta label. And this was something they did on most of their products as a way to encourage their adoption by businesses, not a reflection of any great change to the underlying products themselves.
Meanwhile, Microsoft were hardly standing still. The 2007 release of Office tore up the rulebook to deliver a new look and feel and a radically different ribbon-based user interface. The entire product was overhauled to provide a far slicker and attractive experience, and to bring previously hidden functionality to the fore. 2010 will see another new version of Office, and while its changes will not be as monumental as 2007′s were, having used the beta I can say that the enhancements still put to shame the miniscule improvements there has been to Google Docs in the same period.
Now, Google Docs may never be able to compete on a feature for feature basis with a desktop product like Microsoft Word, at least not while still having to maintain compatibility with older browsers like IE6 and 7, but it seems to me like they’re not even really trying, and that’s what’s really disturbing. Google should be the setting the pace for complex, bleeding-edge web development. Their engineers should be making the most of the web deployment model to push out major enhancements to users at a rate Microsoft can only dream of. They should be paying graphic designers to reinvent the interface of Google Docs, combining the lessons of the Microsoft’s ribbon interface, with the natural flows of the web, and their own innovations, to produce a revolutionary user experience. You should be checking Google products every day to see what marvels they have delivered, and pinching yourself and going ‘that’s a web application!?’ every time. Instead, every time you load up Google Docs you get the same lame imitation of a 1990s desktop word processor, and nothing ever changes.
At this point, you may be screaming ‘Google Wave!’ And sure, Wave is an exciting product, and a great showcase for what web apps can be, but it’s one product, amongst the hundreds that Google develop. Wave is exceptional, when it shouldn’t be exceptional at all. Google has almost 20,000 employees, many of whom (we’re told) are some of the smartest programmers on the planet, is this really the best the can do? It seems to point to either an under-resourcing of important product teams or, more worryingly, a real lack of vision and ambition that has infected the whole company. Whatever it is, I hope they fix it, and Google starts to push its products along much harder and much more quickly.