Sat, 15 Jul 2017

Setting up windows

Keywords: Windows setup

I needed to set up a new Windows 10 box. In case I need to do it again, I'm making a few notes.



- in chocolatey:
  - 7zip
  - autohotkey
  - clementine
  - Firefox
  - GoogleChrome
  - jdownloader
  - logitechgaming
  - Revo.Uninstaller
  - vim
  - virtualbox
  - VirtualBox.ExtensionPack
  - windirstat

- to swap cpas lock and escape
  - download Interception:
  - as administrator, run install-interception /install
  - add a shortcut to caps2esc.exe to the startup directory
    - Windows-R / shell:startup / add link

[/software/windows] permanent link

Sun, 14 May 2017

Perl Toolchain Summit 2017 - Day 4

I didn't get as much done on the final day of the Perl Toolchain Summit because I needed to get home for work on Monday. But I did manage to enlist others in helping me, which is even better.

Devel::Cover has always had a problem in that top level statements (those not in a sub) in modules cannot be covered. This is because perl throws away the optree as soon as it has executed. My knowledge of the internals has never been good enough to even work out a sensible plan for how to solve this, but fortunately Aaron Crane is a good deal cleverer than me and thinks he might be able to develop a solution. It may need perl to have extra hooks, or it might involve deep magic, or both, but at least the end of the tunnel is not pitch black any more. Thanks Aaron!

Then I was discussing how to improve cpancover with Olaf and mentioned that a queue for newly uploaded modules would help to reduce latency for the coverage reports. Joel Berger was sitting right there too, and he knows something about Minion, the job queue for Mojolicious. Joel kindly offered to put together a queue system to replace my naïve shell script. Thanks Joel!

I took part in the discussion about the future of the PTS (spolier - we like it, and have a few ideas on how to make it better still) and then it was time to head back home.

Thanks to Neil, BooK, and Laurent for organising such a great event. Thanks to Wendy to keeping us all healthily fed (or not so healthily, if desired). Thanks to everyone who attended and helped make the event such a success. And, as ever, thanks to the sponsors:, ActiveState, cPanel, FastMail, MaxMind, Perl Careers, MongoDB, SureVoIP, Campus Explorer, Bytemark, CAPSiDE, Charlie Gonzalez, Elastic, OpusVL, Perl Services, Procura, Oetiker+Partner.

[/software/perl/pts] permanent link

Perl Toolchain Summit 2017 - Day 3

My third day at the Perl Toolchain Summit (PTS) was primarily spent in trying to make the cpancover server and infrastructure into more of a production-ready system and less of a Devel::Cover playground. The first step in this direction was supposed to be easy - I made a login for the metacpan group with the idea that they could regularly rsync the coverage results for backup purposes. Unfortunately, this lead me down a yak shaving path I wasn't planning on travelling until later.

When setting up cpancover, I decided to take the easy option and chuck all the results into a single directory. I made the filesystem ext4 so I wouldn't have to worry about hitting limits. Unfortunately, the metacpan box doing the rsync is set up on ext3 and won't support more that 32k subdirectories. So I need to fix up the way that results are stored. I knew this would come sooner or later, even if only because I would surely one day get sufficiently tired of typing ls and immediately regretting it.

In order to make such a change, I need a proper development area to test it. Cpancover has basically just been running since I set it going about three years ago, when I pretty much built it in place. So before making such a large change I need to be able to control things like the docker image being used and the directories being written to. This is also important to be able to allow anyone else to work on the system. So much of the day was spent on this.

Two people separately came to me with the problem that some of their tests require extra modules to be installed and so, by default, these tests aren't run and the coverage suffers accordingly. Four years ago, at the QA Hackathon in Lancaster, a number of clever people got together, and I was there too. We thrashed out The Lancaster Consensus which, thankfully, included a solution to this problem. The environment variable $EXTENDED_TESTING can be set to indicate that the user or process running tests is willing to run optional tests that may take extra time or resources to complete. So I make cpancover set that environment variable, and Graham and Tux altered Moo and Spreadsheet::Read respectively to pay attention to it. I mention this in detail for such a simple change (for me) just to point out (again) the value of the summit, not just for the work which takes place at the time, but also for how it smooths subsequent work, even years later.

I did a few other bits and bobs, and ended up watching an Italian dancing gorilla and a horse on a ladder from Azerbaijan whilst waiting for some modules to install, which can't be bad. (Thanks Eurovision.)

Thanks again to all the sponsors who made this possible:, ActiveState, cPanel, FastMail, MaxMind, Perl Careers, MongoDB, SureVoIP, Campus Explorer, Bytemark, CAPSiDE, Charlie Gonzalez, Elastic, OpusVL, Perl Services, Procura, Oetiker+Partner.

[/software/perl/pts] permanent link

Sat, 13 May 2017

Perl Toolchain Summit 2017 - Day 2

My first day at the Perl Toolchain Summit (PTS) was largely spent coding, or dealing with pull requests, tickets, and releasing. The second day had far less of that sort of stuff, and a lot more of the sort of stuff that it's much harder to do away from the summit.

But it started off with a new pull request from Todd Rinaldo resurrecting a closed RT ticket. There is a whole class of problems Devel::Cover has to del with which stem from the program being exercised changing the environment as it runs. The most obvious, perhaps, is changing directory, which is also something I looked at again yesterday. But this time it has to do with dropping permissions during the run. Todd and I had a discussion about it and, with the principles in place we'll deal with the technical matters in the coming days.

Then I had a productive discussion with Leo and Olaf regarding cpancover. With a bus number of somewhat less than one, we want to make more resilient. As a first step, the coverage data will simply be backed up to the metacpan infrastructure, meaning that in the event of hardware failure, or a mistaken rm -r, we can get ourselves back up again with the historical data.

Then I spent some time reviewing the way in which the cpancover server is set up, and improving and documenting the process, with the idea that it should be fairly simple for anyone to be able to reprovision the server, or set up a new one.

I should note here that the cpancover server is generously provided by Bytemark. I also have a personal server there and they provide an excellent service.

After dinner, Leo and Lee helped me through the process of setting up metacpan locally, using vagrant and virtualbox. The process was painless due to the fine work they had done in automating it.

I also managed to process a few odd tickets here and there during the day and do other bits and bobs. All in all, it was the type of day that is only really possible at an event such as this, so thanks again to all the sponsors for making it possible:, ActiveState, cPanel, FastMail, MaxMind, Perl Careers, MongoDB, SureVoIP, Campus Explorer, Bytemark, CAPSiDE, Charlie Gonzalez, Elastic, OpusVL, Perl Services, Procura, Oetiker+Partner.

[/software/perl/pts] permanent link

Thu, 11 May 2017

Perl Toolchain Summit 2017 - Day 1

This year the Perl QA Hackathon has been rebranded as the Perl Toolchain Summit on the advice of the marketing team. This is the tenth year that the event has been held and, after missing the first few due to scheduling conflicts with my (then young) children's birthdays, I suppose I have now become something of a regular. This year the event is being held in sunny^W rainy Lyon - a shortish train and car (thanks Lee) ride for me.

The Perl Toolchain Summit (hereafter PTS) has become the most important Perl event of the year for me. It's a chance to get together in one room (two actually) as many of the people as possible who work on the Perl infrastructure. This is not the perl core, but the entire toolchain that fits around the core - primarily focussed on CPAN, the archive of Perl modules. CPAN was one of the first such archives, and the infrastructure around it - especially with regard to CPAN Testers and the MetaCPAN architecture, is generally regarded as without peer.

PTS brings together about 35 Perl developers from around the globe to work on this infrastructure together, and to thrash out the sort of problem in which five or six people can sit together and find a good solution which might otherwise have taken months of discussion to reach.

These discussions often mean that people leave with longer TODO lists than when they arrive, which is probably as it should be. But apart from the discussions, there's also a lot of hacking work that takes place, and it's remarkably efficient, when working on code that uses someone else's module, to be able to lean over and ask them a specific question about that module.

In short, if you or your company cares about Perl, you should probably care about PTS.

PTS started on Wednesday afternoon for me. On the train I was able to merge a pull request for Devel::Cover that I had been putting off for too long. I carried on merging pull requests on Thursday, the first full day of the PTS, and fixed various problems and closed a number of tickets. Then I released Devel::Cover 1.25.

In the evening we had a joint meal at an Ethiopian restaurant, sponsored by cPanel (thanks!) and Lyon almost beat Ajax by enough to get to the Europa League final, but just missed out.

Looking forward to day 2 being as productive.

Many thanks to all the sponsors without whom this event would simply not be possible:, ActiveState, cPanel, FastMail, MaxMind, Perl Careers, MongoDB, SureVoIP, Campus Explorer, Bytemark, CAPSiDE, Charlie Gonzalez, Elastic, OpusVL, Perl Services, Procura, Oetiker+Partner.

[/software/perl/pts] permanent link

Sat, 22 Oct 2016

Swapping caps lock and esc keys

Keywords: Windows capslock escape control caps2esc

On almost all modern keybaords the useless capslock key is right where something useful should be. Initially the control key would have been there. On some keyboards the escape key was there and this influenced the design of vi.

The escape key and the control key can actually be combined such that if you press the key on its own then you get an escape, and if you press it with something else you get the control key. Then you need to put this key where the capslock key is now and move the capslock to the escapse key.

On Windows the Interception library can be used to do this. The steps for Windows 7 are:

- Download and install the Windows Driver Kit from
- Set WDK to C:/WinDDK/7600.16385.1 (or wherever it was installed)
- git clone
- run buildit.cmd in the library directory
- run buildit.cmd in the samples/caps2esc directory
- copy caps2esc/objfre_wxp_x86/i386/caps2esc.exe and library/objfre_wxp_x86/i386/interception.dll into a new directory (I use C:/caps2esc)
- add a shortcut to c:/caps2esc/caps2esc.exe to the startup directory

For linux use caps2esc, but this won't work well inside a VM.

I suppose you could download the version I compiled for Windows 7. I have no idea whether it will work for anything else, amd you will need to make sure you are within the licence.

For Windows 10 tihngs are somewhat simpler:

- download Interception:
- as administrator, run install-interception /install
- add a shortcut to caps2esc.exe to the startup directory
  - Windows-R / shell:startup / add link

[/software/windows] permanent link

Sat, 27 Jul 2013

Installing rvm

Keywords: rvm ruby 1.9.3 tmuxinator zsh

In order to upgrade tmuxinator I needed to run Ruby 1.9.3. So I installed rvm as follows:

$ bash -s stable < <(curl -s

and added the following to my .zshrc:

if [[ -e ~/.rvm/scripts/rvm ]] then
    . ~/.rvm/scripts/rvm
    .  ~/.rvm/gems/ruby-1.9.3-p448/gems/tmuxinator-0.6.2/completion/tmuxinator.zsh


$ rvm install 1.9.3
$ rvm use 1.9.3 --default
$ gem install tmuxinator

I also had up change my tmuxinator config files:

$ cd ~/.tmuxinator
$ perl -pi.bak -e 's/cli_args/tmux_options/' *.yml
$ perl -pi.bak -e 's/tabs/windows/' *.yml
$ perl -pi.bak -e 's/^project_//' *.yml
$ perl -pi.bak -e 's/-2$/-l -2/' *.yml

The last change there is because with just the "-2" in tmux_options I got the error:

in `tmux_options': undefined method `strip' for -2:Fixnum (NoMethodError)

[/software/ruby] permanent link

Fri, 28 Oct 2011

Shrinking disks in VirtualBox

Keywords: Virtualbox shrink disk size minimise

Update - 20.10.2020

Rather than messing about with single user mode the easiest way to run zerofree is by attaching the disks to another VM and running zerofree there.

Update - 19.07.2014

This is actually a little easier now. Or I know better, perhaps.

Again, there should be no snapshots.

1. On the VM install zerofree:

# aptitude install zerofree

2. Boot into single user mode.

3. Run zero free on each virtual disk:

# zerofree /dev/sda1
# zerofree /dev/sdb1

4. Power down the VM

(On a Windows guest, for steps 1-4 just download and run sdelete -z)

5. On Windows, compact each virtual disk:

> "c:\Program Files\Oracle\VirtualBox\VBoxManage" modifyhd root.vdi --compact

And you're done.

If you've been using VirtualBox for a while with dynamically allocated disks, you've probably found that the size of the virtual disk exceeds that of the data stored therein. Sometimes by quite some ammount. Once used, the disk space is never returned.

I recently bought an SSD and wanted to put one of my Ubuntu virtual machines on it, that being where I do most of my work. However, the three virtual disks being used by that VM had grown quite large - too large to store on my SSD. There were also snapshots in use, despite the VM apparently not using any. This, I suspect, may have been due to mounting a virtual disk from another VM which had snapshots. Or it might not. In any case, things were a little bit of a mess and I wanted to sort them out too.

The first thing I did was to clear out as much of the disks as I could that was just being used for storage. Then we get to the complicated part of trying to reduce their size. I have seen suggestions to use zerofree or resize2fs but it wasn't clear to me whether they worked with ext4. So here is the method I used.

1. Using VirtualBox 4.1.x, clone the VM. This removes all the problems with the snapshots and makes a single definitive copy of all the virtual disks. If you have more than one virtual disk, you could remove those disks beforehand, since copies of those disks are not actually required, though a copy of the disk containing the root filesystem is required.

2. Create new, empty virtual disks for each of your original disks.

3. Add these new empty disks to your VM, along with at least the copy of the root filesystem.

4. Start your VM, run fdisk and mkfs.ext4 or mkswap to create the filesystems.

5. Create mountpoints and mount your new and cloned disks.

6. For all filesystems except the root filesystem, run cp -a to populate the new disk either from the clone, if you made one, or just from wherever they are mounted on the VM.

7. For the root filesystem do the same, but this must be done from the clone.

8. Assume your new root filesystem is mounted as /mnt/root. Run:

# mount -o bind /proc /mnt/root/proc
# mount -o bind /dev /mnt/root/dev
# mount -o bind /dev/pts /mnt/root/dev/pts
# mount -o bind /sys /mnt/root/sys

Edit /etc/fstab to reflect your new disk layout. If possible, it might be easier if you just mount the root filesytem at first and don't use the UUID format.

# chroot /mnt/root
# grub-install --root-directory=/ /dev/hda

Replace hda with whichever device you are booting from.

# update-grub
# exit

9. Create a new virtual machine, use your cloned one, or reuse your old one. Attach the appropriate disks and start the VM. If you are lucky, grub will be set up and the VM will boot.

10. Find out the UUIDs of your partitions by running blkid. Edit /etc/fstab appropriately and reboot.

11. Copy averything to where you want it to be. (My SSD.)

And that's all there is too it!

[/software/virtualbox] permanent link

Mon, 18 Oct 2010

Ubuntu 10.10 crashes running under VirtualBox 3.2.10.

Keywords: Virtualbox Ubuntu 10.10 crashes timer noapictimer nohz=off highres=off grub

I recently bought myself a new laptop. It's a rather nice HP Envy 14. Unfortunately no linux distribution properly supports it yet and so I run a Ubuntu guest virtual machine on it under VirtualBox with Windows 7 as the host.

Recently the VM started crashing. It would stop accepting keyboard input, and wouldn't shut itself down nicely using the mouse either from within Ubuntu or from VirtualBox. The only solution was to get VirtualBox to poweroff the VM. I upgraded Ubuntu to 10.10 and VirtualBox to 3.2.10, hoping to fix the problem, but it didn't help.

What did help though, was adding the following startup options:

noapictimer nohz=off highres=off

These can be added to the GRUB_CMDLINE_LINUX_DEFAULT line in /etc/default/grub, then run update-grub and the problem seems to be fixed.

Although sound under a VM isn't really the best idea, I just can't find any music players that I like which run under windows, and so I use Amarok 1.4. (No, I don't like Amarok 2.) Previously I was getting more frequent crashes whilst playing music. With this fix I've not had any crashes, even when playing flac files. Looking at the solution, this makes sense.

[/software/virtualbox] permanent link

Sun, 10 Oct 2010

Installing VirtualBox guest additions on a Ubuntu 10.10 guest

Keywords: Virtualbox Ubuntu 10.10 X server guest additions

Adding VirtualBox guest additions to a Ubuntu 10.10 guest fails for the X server, since 10.10 includes a later version than the guest additions are expecting.

The solution:

$ sudo aptitude install virtualbox-ose-guest-x11

[/software/virtualbox] permanent link

November 2022
Sun Mon Tue Wed Thu Fri Sat