rubycocoa + rvm + Mavericks = fail

I am very happy with OS X Mavericks, by and large. It’s slightly more refined than Mountain Lion, and noticeably faster.

I also noted with pleasure that it installed Ruby 2.0 by default, instead of maintaining the out of date Ruby 1.8.

However, yesterday I tried running a script that invokes a module which i wrote that uses rubycocoa. It doesn’t work. A little digging reveals that rubycocoa is not (yet?) supported on either ruby 1.9 or 2.0. While there is a Mavericks update for rubycocoa, it just makes it work with versions 1.8. While I could live with that, since rvm does a good job of managing this sort of thing, in the case of rubycocoa, rvm has come up short. If I explicitly invoke the script with


It works, but

rvm use 1.8

#!/usr/bin/env ruby

fails with

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require’: cannot load such file — osx/cocoa (LoadError)
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require’



Goodbye Frederik Pohl

I’m sorry to hear that Fred Pohl died.

I had only just read his latest blog entry, and then, the next day, I heard the news.

As I wrote earlier, Fred was to a large extent my gateway into science fiction. All I had to say then, stands, except than in the interim, he managed to win one more Hugo to add to his list—for Best Fan Writer in 2010, for his blog. Wow!

You will be missed.

Posted in SF

Terry Pratchett + Steeleye Span

The most excellent Peter Knight reports that Steeleye Span are working on a new album: a collaboration with Terry Pratchett based on Wintersmith,

I am taking a quick break from my studio where I am working on another composition for Steeleye’s new album, which will hopefully be released in time for the winter tour.

I am sure that most of you know by now that we are working on a collaboration with Terry Pratchett, a recording based on his novel ‘Wintersmith’.

We included four songs from the album on our recent tour and they were very well received, so it is all looking good.

Peter is no stranger to this, having produced (with Bob Johnson) an adaptation of Lord Dunsany’s The King of Elfland’s Daughter in 1977.

I wait with anticipation.

Nethack Ascension

Goodbye michaeln the Demigoddess…

You went to your reward with 4763818 points,
The Eye of the Aethiopica (worth 4000 zorkmids and 10000 points)
Magicbane (worth 3500 zorkmids and 8750 points)
Werebane (worth 1500 zorkmids and 3750 points)
       9 jet stones (worth 7650 zorkmids),
       8 rubies (worth 28000 zorkmids),
       8 amber stones (worth 8000 zorkmids),
       8 amethyst stones (worth 4800 zorkmids),
       7 jacinth stones (worth 22750 zorkmids),
       7 emeralds (worth 17500 zorkmids),
       6 aquamarine stones (worth 9000 zorkmids),
       6 obsidian stones (worth 1200 zorkmids),
       5 diamonds (worth 20000 zorkmids),
       4 sapphires (worth 12000 zorkmids),
       4 turquoise stones (worth 8000 zorkmids),
       4 chrysoberyl stones (worth 2800 zorkmids),
       3 dilithium crystals (worth 13500 zorkmids),
       3 topaz stones (worth 2700 zorkmids),
       3 opals (worth 2400 zorkmids),
       2 black opals (worth 5000 zorkmids),
       2 citrine stones (worth 3000 zorkmids),
       2 garnet stones (worth 1400 zorkmids),
       2 jasper stones (worth 1000 zorkmids),
       1 agate stone (worth 200 zorkmids),
       4 amulets of ESP (worth 600 zorkmids),
       3 amulets of reflection (worth 450 zorkmids),
       2 amulets of life saving (worth 300 zorkmids),
       2 amulets of change (worth 300 zorkmids),
       1 amulet of strangulation (worth 150 zorkmids),
       1 amulet of restful sleep (worth 150 zorkmids),
       1 amulet versus poison (worth 150 zorkmids),
       1 amulet of unchanging (worth 150 zorkmids),
and 4338 pieces of gold, after 78168 moves.
You were level 24 with a maximum of 168 hit points when you ascended.

At last! That was fun, and satisfying. I had Ogresmasher and Trollbane as well, but the weight wasn’t worth it, so they, along with 70kzm, were left behind in my last stash.


f – an uncursed amulet of life saving (being worn)
h – the blessed Eye of the Aethiopica
q – the rustproof +2 Magicbane (weapon in hand)
b – a blessed fireproof +5 cloak of magic resistance (being worn)
r – a blessed +5 T-shirt (being worn)
u – a blessed rustproof +3 pair of gauntlets of power (being worn)
v – a blessed rustproof +5 helm of brilliance (being worn)
z – a blessed +4 silver dragon scale mail (being worn)
J – a blessed fireproof +4 pair of speed boots (being worn)
o – an uncursed lizard corpse
G – a blessed potion of full healing
d – an uncursed +5 ring of protection
O – an uncursed ring of levitation
P – an uncursed ring of conflict (on left hand)
R – an uncursed ring of slow digestion
W – an uncursed ring of free action (on right hand)
X – an uncursed ring of searching
x – a wand of cold (0:1)
B – a wand of magic missile (0:3)
D – a wand of teleportation (1:3)
E – a wand of lightning (0:5)
S – a wand of death (1:4)
c – an uncursed stethoscope
k – an uncursed rusty skeleton key
C – an uncursed sack named sack with WAND OF CANCELLATION
I – a blessed fireproof bag of holding
U – a blessed +0 unicorn horn
Y – an uncursed towel
s – a blessed luckstone
Contents of the sack named sack with WAND OF CANCELLATION:
                                                 a wand of cancellation (0:8)
Contents of the bag of holding:

a blessed wand of polymorph (0:0)
a wand of slow monster (0:0)
a wand of teleportation (0:0)
a wand of magic missile (0:4)
a wand of magic missile (0:1)
a wand of digging (0:3)
an uncursed potion of invisibility
an uncursed potion of full healing
2 uncursed jasper stones
8 uncursed amber stones
9 uncursed jet stones
2 uncursed black opals
4 uncursed chrysoberyl stones
7 uncursed emeralds
6 uncursed aquamarine stones
3 uncursed opals
6 uncursed obsidian stones
an uncursed touchstone
3 uncursed dilithium crystals
3 uncursed topaz stones
4 uncursed sapphires
2 uncursed garnet stones
8 uncursed rubies
8 uncursed amethyst stones
7 uncursed jacinth stones
2 uncursed citrine stones
5 uncursed diamonds
4 uncursed turquoise stones
an uncursed agate stone
an uncursed amulet of ESP
an uncursed amulet of reflection
an uncursed amulet of restful sleep
an uncursed amulet of ESP
an uncursed amulet of change
an uncursed amulet of strangulation
an uncursed amulet of reflection
an uncursed amulet of unchanging
an uncursed amulet versus poison
an uncursed amulet of change
an uncursed amulet of ESP
an uncursed amulet of reflection
a blessed scroll of genocide
13 potions of holy water
a blessed scroll of blank paper
an uncursed scroll of stinking cloud
a blessed scroll of earth
12 +5 daggers
the blessed +6 Werebane
a blessed wand of locking (0:3)
a wand of secret door detection (0:8)
a blessed potion of healing
a wand of create monster (0:15)
an uncursed scroll of magic mapping
a wand of speed monster (0:7)
an uncursed amulet of ESP
a wand of lightning (0:4)
a wand of locking (0:4)
a wand of cold (0:5)
a wand of cold (0:5)
a wand of magic missile (0:5)
a wand of cold (0:5)
an uncursed potion of object detection
4338 gold pieces
a +0 pick-axe
an uncursed potion of enlightenment
an uncursed lembas wafer
a blessed scroll of remove curse
a wand of cold (0:4)
a wand of magic missile (0:4)
a wand of fire (0:6)
a wand of magic missile (0:5)
a wand of magic missile (0:2)
a wand of digging (0:6)
2 blessed potions of object detection
4 uncursed potions of healing
5 uncursed potions of extra healing
7 blessed potions of full healing
a +0 unicorn horn
2 uncursed candy bars
7 uncursed K-rations
11 uncursed C-rations
a +0 unicorn horn
a +0 unicorn horn
a +0 unicorn horn
a wand of magic missile (0:7)
a crystal ball (0:5)
an uncursed amulet of life saving
a wand of death (0:7)
a wand of digging (0:6)
a wand of fire (0:4)
a blessed wand of magic missile (0:4)
12 uncursed food rations
3 uncursed cram rations
a wand of lightning (0:4)
a +0 unicorn horn
a wand of death (0:7)
3 uncursed carrots
a wand of fire (0:3)
a blessed wand of sleep (0:5)
an uncursed orange
a wand of speed monster (0:7)
a rusty wand of cold (0:6)
a wand of secret door detection (0:15)
11 uncursed lumps of royal jelly

Final Attributes:

                                                                        You were piously aligned.
                                                                        You were fire resistant.
                                   ---------                            You were cold resistant.
                                   |...[...|                            You were sleep resistant.
            -----                  |.......|                  -----     You were disintegration-resistant.
             ...|                  |..._...|                  |..4      You were shock resistant.
     ---------..--   ---------     |..*....|                 --..------ You were poison resistant.
     |.....%.|...-- --...... -- |  |...%...|  |    .....    --...|..... You were magic-protected.
     |.....%.|....---..I..... --|. ----|---- .|   ....... ---....|.A... You were telepathic.
     |..._..%%%....-...I...... ||.............|  ...@...a. %..@A.-...@@ You were warned.
     |......%|....---....I.!..-----...II....---  .........---.544|.@... You had infravision.
     |.......|...-- --...%%. --   -----%-----      ..$).    --...|..... You were stealthy.
     ---------..--    ---|----     -.......-        -%-      --..------ You caused conflict.
             ...|      |...--------.........--------.%.|      |...    5 You had teleport control.
            -----      |.........|....%......|.....%...|      -----     You were protected.
                       -------...--......%..--..)-------                You were very fast.
                             | ...--...+...--....|                      You had reflection.
                             ---...----|----...-                        You had free action.
                               |......%........|                        Your life would have been saved.
                               -----------------                        You were extremely lucky.
Michaeln the Necromancer  St:25 Dx:17 Co:16 In:25 Wi:23 Ch:16  Chaotic  You had extra luck.
Astral Plane $:0  HP:146(168) Pw:42(338) AC:-35 Xp:24/40066132 T:78168  Good luck did not time out for you.
                                                                        You survived.

Vanquished creatures:

The Wizard of Yendor (7 times)
Pestilence (twice)
Famine (4 times)
2 arch-liches
a high priest
8 mastodons
6 krakens
13 iron golems
5 master liches
2 storm giants
a titan
a glass golem
2 balrogs
16 purple worms
3 gray dragons
2 silver dragons
11 red dragons
3 white dragons
an orange dragon
14 black dragons
10 blue dragons
5 green dragons
6 yellow dragons
17 minotaurs
6 jabberwocks
The Dark One
8 baluchitheria
8 Angels
6 demiliches
Vlad the Impaler
7 stone golems
9 master mind flayers
25 Olog-hai
6 Nazguls
11 pit fiends
2 sandestins
11 hell hounds
10 titanotheres
7 trappers
a baby white dragon
a baby blue dragon
2 guardian nagas
11 disenchanters
30 vampire lords
5 skeletons
23 aligned priests
5 captains
6 shades
11 liches
3 clay golems
12 nurses
14 ice devils
5 nalfeshnees
11 lurkers above
an Aleax
a frost giant
15 ettins
3 golden nagas
6 black puddings
35 vampires
7 lieutenants
42 ghosts
3 queen bees
15 winged gargoyles
3 mind flayers
11 giant mimics
16 zruties
15 fire giants
6 ogre kings
an ice troll
25 rock trolls
16 umber hulks
4 flesh golems
5 Elvenkings
3 doppelgangers
23 hezrous
11 bone devils
15 large mimics
5 wumpuses
14 fire vortices
a baby long worm
2 baby purple worms
12 long worms
4 couatls
16 stalkers
6 air elementals
17 fire elementals
10 earth elementals
8 water elementals
a hill giant
4 giant mummies
2 black nagas
26 xorns
20 giant zombies
6 elf-lords
25 sergeants
9 barbed devils
18 vrocks
10 salamanders
29 wargs
2 winter wolves
7 hell hound pups
24 small mimics
8 glass piercers
8 warhorses
14 steam vortices
25 xans
9 ettin mummies
5 ogre lords
12 quantum mechanics
41 trolls
2 sasquatches
8 wood golems
3 erinyes
7 mariliths
4 sharks
7 electric eels
4 gelatinous cubes
11 pyrolisks
8 large dogs
4 freezing spheres
8 flaming spheres
10 shocking spheres
7 large cats
6 tigers
11 gargoyles
4 dwarf kings
11 tengu
27 ochre jellies
25 leocrottas
8 energy vortices
3 mountain centaurs
6 stone giants
8 elf mummies
6 human mummies
a red naga
7 green slimes
11 pit vipers
4 pythons
23 cobras
54 wraiths
12 carnivorous apes
15 ettin zombies
9 leather golems
2 Grey-elves
47 soldiers
14 horned devils
10 succubi
5 incubi
6 chameleons
5 crocodiles
20 giant beetles
10 quivering blobs
31 cockatrices
18 wolves
7 winter wolf cubs
7 lynxes
7 panthers
13 gremlins
12 spotted jellies
31 leprechauns
7 orc-captains
8 iron piercers
10 mumakil
19 giant spiders
12 scorpions
5 horses
an ice vortex
14 black lights
44 vampire bats
4 forest centaurs
6 gnome kings
7 orc mummies
6 dwarf mummies
5 ogres
7 brown puddings
18 rust monsters
18 owlbears
9 yetis
6 gold golems
4 werewolves
3 Green-elves
2 piranhas
13 giant eels
21 lizards
10 chickatrices
6 dogs
2 dingos
4 housecats
11 jaguars
5 dwarf lords
9 blue jellies
7 white unicorns
8 gray unicorns
12 dust vortices
34 ravens
9 plains centaurs
3 gnome mummies
17 snakes
5 apes
26 human zombies
5 rope golems
2 Woodland-elves
20 soldier ants
23 fire ants
2 bugbears
5 imps
10 lemures
6 quasits
4 wood nymphs
6 water nymphs
8 mountain nymphs
40 Mordor orcs
an Uruk-hai
3 orc shamans
14 rock piercers
2 rock moles
9 ponies
7 fog clouds
21 yellow lights
2 shriekers
2 violet fungi
20 gnome lords
11 gnomish wizards
6 kobold mummies
2 black naga hatchlings
a guardian naga hatchling
14 gray oozes
7 barrow wights
16 elf zombies
18 ghouls
7 straw golems
9 paper golems
5 jellyfish
2 baby crocodiles
82 giant ants
3 little dogs
7 floating eyes
2 kittens
25 dwarves
7 homunculi
6 kobold lords
2 kobold shamans
18 hill orcs
33 rothes
3 rabid rats
5 centipedes
24 giant bats
3 monkeys
14 orc zombies
21 dwarf zombies
5 wererats
4 werejackals
12 iguanas
111 killer bees
6 acid blobs
2 gas spores
6 hobbits
32 manes
5 large kobolds
5 hobgoblins
17 giant rats
4 cave spiders
4 brown molds
10 yellow molds
a green mold
2 red molds
52 gnomes
13 garter snakes
15 gnome zombies
9 geckos
23 jackals
6 foxes
4 kobolds
7 goblins
10 sewer rats
25 grid bugs
8 bats
14 lichens
8 kobold zombies
14 newts

3084 creatures vanquished.

Posted in d20

Things I’d like to see from Apple, part 5

My first musings on what I’d like to see from Apple were basically a home server edition of Mac OS X Server, and suitable hardware, which, as I said was “pretty much a Mac Mini, with the exception of the 802.11n.”.

That was in 2008. Since then, the Mac Mini has moved on, with the addition of 802.11n, plus Thunderbolt and USB 3.0.

Mac OS X Server has also moved on, and in many way what Apple is now delivering is a home server, with, if not a Squid cache, at least App store caching, mail server, Time Machine, etc.. There are excellent reviews of Mac OS X Server (Mountain Lion) at Ars Technica (updated in Jan 2013 when new features were released).

Significantly, the price has plummeted to to being eminently affordable. It’s basically US$20.00—the same price as Mountain Lion itself.

That being the case, I’ve installed it as the home server, and I’m happy with it in that mode. I’ve repurposed my Mac Mini that was running as the Time Machine server (that function has gone to another machine) and it happily acts as the family mail server together with some other functions such as providing a VPN (so we can check our mail on the road).

Mac OS X Server is now basically just, with all the server components hidden away inside the App bundle. It is also very encouraging to see Apple adding new functionality, like the Caching server which appeared as a new feature in the first Server update.

That leads to a little list of things I’d like to see added (or fixed):

  • Cache Server reporting. At the moment there is no display of what things are in the cache (which I’d like to know for curiosity’s sake).
  • More caching. At the moment, iTunes purchases are not cached, nor is general web browsing.
  • Fetchmail support. I pull mail onto the server for all the family members off multiple ISP accounts. Among other things, this keeps GB—and years—of mail on a local server which is not subject to merger, change of terms of service, bankruptcy or pre-emptive shutdown by foreign powers. It may be antediluvian and I should probably have the mail SMTP direct to my own domain, but in the meanwhile it suits me quite well and I surely can’t be alone in this.
  • The Mail server stops. Well, actually, it doesn’t. says that it has, but the server is really running quite happily.
  • Documentation. Really, the Apple documentation is inadequate. In transition from an enterprise product to a home product the documentation got left behind. I bought Server because I figured the price was low enough that if it wasn’t useful to me I would not have wasted much. I couldn’t figure out how useful it would be from reading the documentation. In the end, the web provided more useful how to and advice than the Apple documentation ever did.

Adventures with ZFS and Time Machine part 3

Well, really just adventures with ZFS this time.

About a year ago I had a disk fail—just a couple of weeks within the 5 year warranty—and when I got the replacement, ZFS dutifully resilvered the RAIDZ set. Then, recently, I had another disk (even older) fail, in another machine. And then I had another (different) disk fail in the RAIDZ disk. I was beginning to wonder what was going on (the computers are on a filtered power supply by the way).Well, to cut a long story short, it was actually the USB enclosure that failed (as far as I can tell). This led be to become acquainted with just how slow USB is.

Everyone says not to use USB for ZFS, mostly because a number of USB controllers lie about write integrity, which can cause even ZFS’s bullet-proof write system to fail. However, there are other reasons to be concerned about USB, namely performance, especially with scrub.

Given this, why use USB? Well, price and availability. A few years ago, USB + FireWire enclosures were reasonably common. Now, USB is just about all that is available unless you go to high end RAID—and I’m trying to let ZFS do the job here, rather than buy a RAID controller, so I would end up paying a lot more for something I don’t need. Of course, if I had a tower case with lots of drive bays I could just plug them in there, but I don’t. At the moment the ZFS machine is a Mac Mini, a splendid little machine, but one with FW800 and USB 2.0 only, and with its form-factor, no space for extra internal drives.

USB speed

So, after that diversion, back to my ‘discoveries’ about USB. USB 2.0 is nominally 480Mbps. Except that this is nowhere near the actual rate. The web informs me that normal USB 2.0 disk performance is 20-25MBps (160-220Mbps), or around 40% of the theoretical speed of USB 2.0. I knew that USB was slower than FireWire, but I had not realised quite how slow.

In fact, my measured speed on my current disks seems to be about 20MBps sustained. Note that this is only about 10% of the speed of even a consumer SATA disk. That has serious consequences for a number of operations

Disk Formatting

It’s quite a good idea to write zeros to every block of even a new disk. This causes the disk firmware to check every sector (and allocate spare sectors if necessary). This is also a way to check an older disk. With current disk sizes of 1, 2 and 3TB, this is going to take a long time using USB.

Time to format (hours)
USB 2.0 14.5 29 44
SATA 1.5 3 4.4

That’s also the amount of time it’s going to take to copy that much information to or from the disk.


From the above, it’s obvious that a resilver is also going to take a very long time, although assuming that the ZFS pool is not full, it will take proportionally less time. A RAIDZ that is 75% full will take 22 hours to replace a 2TB drive.

That leads us to scrub. Normal ZFS best practice is to zpool scrub once a week for consumer grade drives, which should catch any errors while there is still time to do something about it. What scrub does is read every in-use block, on every disk in the pool, and compare it to a calculated checksum. If there is a mismatch zpool reports the error and tries to rewrite the block (which has a good chance of fixing the problem if the disk firmware remaps an ailing sector). That means, for a RAIDZ pool, a scrub will take (capacity used)/(disks in pool)/(sustained read speed). For USB 2.0, that means a long time. By comparison, SATA attached disks will be done in 1/10 the time.

There is an extra gotcha. If you are using MacZFS, there is a bug (fixed in later versions of ZFS) that restarts the scrub/resilver if you do a snapshot on the pool during said scrub/resilver. If, for instance, you take hourly snapshots…your scrub is never going to finish.

That being the case, it is a really good idea to modify any automatic scripts to check to see if a scrub or resilver is in progress and refrain from snapshotting if it is. The following Ruby fragment may prove useful.

Ruby fragment to check if a ZFS filesystem is busy

BIN_DIR = ‘/usr/sbin/’
ZPOOL_CMD = “#{BIN_DIR}zpool”

def busy?(name)
pool = name.match(‘^[^/]+’)[0]
IO.popen(“#{ZPOOL_CMD} status #{pool}”).any? { |l| l[‘scrub in progress’] or l[‘resilver in progress,’]}

Hello WordPress

As I mentioned before

At this point, you might wonder why I am using iWeb. So am I.

As you can see, I for one welcome our new WordPress overlords.

It seems easier at this point to simply retain the old iWeb pages with a link to them off the WordPress entries rather than try to move them across. I have duplicated one entry, the d20 Coinage entry, since it was the apparent inability of Google and Bing to find the page that finally prompted me to change.

Coinage in d20 Games

In my D&D campaigns, I got sick of everything being a multiple of 10, when historically coins were multiples of 12, 4, 6 etc. Just consider the British penny; half-penny; farthing (four to the penny); threepence; groat (four pence); sixpence; shilling (equal to twelve pennies); florin (two shillings); half-crown (2 shillings and sixpence); crown; pound (20 shillings) and guinea (21 shillings).

There is also the oft remarked upon fact that in the D&D world, everyday items are greatly inflated in price, with every thing being held to the d20 ‘gold’ standard.

To that end, I created a more varied system. The campaign that uses this is set in Middle-Earth, and for the currency of the North (the ancient realm of Arnor), I created a system with more reasonable values (a standard working wage of a penny a day) and a wide variety of coins, from different races (Human, Elf and Dwarf) and regions.


Posted in d20