Wherein I Move a Lot of Words Around

A Nice Story about Steam on Linux

Once upon a time I had a Linux box acting as a home server. It was nice.

Then I wanted a home internet gateway/router and put it at the network edge. That, too was nice.

Then it was slow. Given where it was, that made everything slow. So, I rebuilt it as something bigger than it needed to be and put a SATA RAID in it, a dual Intel server NIC card, and installed Plex server on it. Then it was very nice.

Since it was serving AFP for my Macs, I chose XFS for the RAID filesystem. That, too was very nice.

Then I realized that when I was messing around with it and had to reboot it because of changes to the file or media server bits, the home internet was down. This made the lady unhappy, which made me unhappy. This was not nice.

So I took all the old parts out of the junk box and rebuilt the original machine and made it the internet gateway. That left the beefy machine doing media and files and general stuff I threw at it. For a long time, that was perfect.

Then one day I realized that the very nice CPU was idle more often than not, and that was a shame. So I got an Nvidia GTX 750 Ti card and a nice display and made a Linux desktop out of it. A Linux desktop with an 8TB internal RAID and an SSD boot drive. A machine more than powerful enough to play some games, really. To do so, however, would mean booting out of Linux and into Windows (generally) which I did not have a full copy of and generally did not want to. Which is when I remembered all my games are in Steam and Steam runs on Linux — and now I have a nice video card. This could be nice.

Could be. But there's always one thing, and this time was no exception.

I installed Steam from the website and after many progress bars I pulled down Portal 2 to test with (because it's nice). It wouldn't start. Says it couldn't find and other random Steam shared libraries that, confusingly, were exactly where it said it couldn't find them. I played with ldd and friends for a while and realized that Steam was simply insane because the World was in Order and Steam was confused.

So, I searched. Then I found. Staring at the screen, I sighed. Then I laughed. Then I made an annoyed grunt. doesn't exist on large non-ext4 file systems

XFS support: Source games need to use stat64/64-bit ints or be compiled for 64-bit.

Warning to XFS users on linux.

Steam games won't run from a separate hard disk. "I only have two XFS drives and this Ext4 SSD. The games work if I install them on the SSD."

Steam on Linux: Many games won't start? Read this!

It turns out that many games on Steam are still 32-bit games. I have a 64-bit CPU, OS, and — as luck would have it — a large enough filesystem that it's using 64 bits for inode values (file IDs). Well, that's generally not a problem when the disk is young and not full of files, but on a server RAID that's had quite the long-standing history mine has, those file IDs are out of the 32-bit range. When code that's using 32-bit inode values gets that large number it's not valid, so it can't open the file.

The solution was fairly simple. I went to Steam's preferences and created a library on the ext4-formatted SSD boot drive (it had plenty of space for my small games) and installed the games there.

They run like a charm now. It's nice.

What Insanity Looks Like

Op-ed: How I gave up alternating current | Ars Technica:

I have not set foot in a grocery store in years. Nevermore will I bumble through endless confusing aisles like a pack-donkey searching for feed while the smell of rotting flesh fills my nostrils and fluorescent lights sear my eyeballs and sappy love songs torture my ears. Grocery shopping is a multisensory living nightmare. There are services that will make someone else do it for me but I cannot in good conscience force a fellow soul through this gauntlet.


Everything about this piece reads like someone with significant mental health issues who is being taken seriously.


Swift is kind of like when you’re a kid and you fill the bag of jelly beans with all your favorite flavors and then reach in and have a handful all at once. Each was a good idea, but together it lacks anything that made any single piece good.

WWDC and IPv6

This WWDC marks the first time I've ever seen more IPv6 devices on the LAN than IPv4. That's kind of cool. I'm sure a lot of it is due to NDP, but that's fine. Also, I appear to have a global address assigned as well (and I've subsequently disconnected from that interface, so 😛). Very nice to see the adoption is rolling out well.

Routing tables

Destination        Gateway            Flags        Refs      Use   Netif Expire
default         UGSc           15        0     en6
default           UGScI           1        0     en0
10.102/16          link#4             UCS             0        0     en0      link#4             UCS             3        0     en0         link#4             UHLWIi          1       12     en0    link#4             UCS             0        0     en0
127                UCS             0        0     lo0          UH              5    24864     lo0
169.254            link#13            UCS             0        0     en6
169.254            link#4             UCSI            0        0     en0
198.183.28/22      link#13            UCS             6        0     en6    link#13            UCS             2        0     en6       0:0:c:9f:f0:1      UHLWIir        11        0     en6   1155   link#13            UCS             1        0     en6      68:5b:35:c5:1a:cd  UHLWI           0        2     lo0     0:1:a:a:d4:d1      UHLWI           0        0     en6   1185     68:5b:35:c8:33:e2  UHLWI           0        0     en6   1189     68:5b:35:cf:fe:5c  UHLWI           0        0     en6   1197      ac:87:a3:37:f0:7c  UHLWI           0        0     en6   1192      68:5b:35:bf:b0:f9  UHLWI           0        0     en6   1184     a0:ce:c8:2:c9:f4   UHLWI           0        0     en6   1198

Destination                             Gateway                         Flags         Netif Expire
default                                 fe80::1ae7:28ff:feae:321f%en6   UGc             en6
::1                                     ::1                             UHL             lo0
2620:0:????:111::/64                    link#13                         UC              en6
2620::????:111:6a5b:35ff:fec5:????      68:5b:35:c5:1a:cd               UHL             lo0
2620::????:111:bde4:9cb6:3e40:????      68:5b:35:c5:1a:cd               UHL             lo0
fd53:????:f8d5:141b::/64                fe80::f9c4:522:ff91:9dc9%utun0  Uc            utun0
fd53:????:f8d5:141b:f9c4:522:ff91:????  link#10                         UHL             lo0
fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
fe80::1%lo0                             link#1                          UHLI            lo0
fe80::%en0/64                           link#4                          UCI             en0
fe80::1610:9fff:fee4:9b23%en0           14:10:9f:e4:9b:23               UHLI            lo0
fe80::%awdl0/64                         link#8                          UCI           awdl0
fe80::ac9b:3fff:fe09:673%awdl0          ae:9b:3f:9:6:73                 UHLI            lo0
fe80::%utun0/64                         fe80::f9c4:522:ff91:9dc9%utun0  UcI           utun0
fe80::f9c4:522:ff91:9dc9%utun0          link#10                         UHLI            lo0
fe80::%en6/64                           link#13                         UCI             en6
fe80::20e:c6ff:fefe:4bc6%en6            0:e:c6:fe:4b:c6                 UHLWI           en6
fe80::223:32ff:fecb:6980%en6            0:23:32:cb:69:80                UHLWI           en6
fe80::2e0:4cff:fe68:178%en6             0:e0:4c:68:1:78                 UHLWI           en6
fe80::e4d:e9ff:fea0:b3b7%en6            c:4d:e9:a0:b3:b7                UHLWI           en6
fe80::e4d:e9ff:feb0:4957%en6            c:4d:e9:b0:49:57                UHLWI           en6
fe80::e4d:e9ff:feb0:eeb5%en6            c:4d:e9:b0:ee:b5                UHLWI           en6
fe80::e4d:e9ff:fece:ac28%en6            c:4d:e9:ce:ac:28                UHLWI           en6
fe80::129a:ddff:fe6f:98d%en6            10:9a:dd:6f:9:8d                UHLWI           en6
fe80::12dd:b1ff:fed4:21c9%en6           10:dd:b1:d4:21:c9               UHLWI           en6
fe80::12dd:b1ff:fede:84e4%en6           10:dd:b1:de:84:e4               UHLWI           en6
fe80::12dd:b1ff:fede:881e%en6           10:dd:b1:de:88:1e               UHLWI           en6
fe80::12dd:b1ff:fede:bf4e%en6           10:dd:b1:de:bf:4e               UHLWI           en6
fe80::12dd:b1ff:fee7:bdce%en6           10:dd:b1:e7:bd:ce               UHLWI           en6
fe80::1610:9fff:fee4:9b23%en6           link#13                         UHLWI           en6
fe80::1ae7:28ff:feae:321f%en6           18:e7:28:ae:32:1f               UHLWIir         en6
fe80::2a37:37ff:fe02:3ae5%en6           28:37:37:2:3a:e5                UHLWI           en6
fe80::2a37:37ff:fe03:acc4%en6           28:37:37:3:ac:c4                UHLWI           en6
fe80::3e07:54ff:fe11:1273%en6           3c:7:54:11:12:73                UHLWI           en6
fe80::3e07:54ff:fe33:a785%en6           3c:7:54:33:a7:85                UHLWI           en6
fe80::3e07:54ff:fe39:5ef%en6            3c:7:54:39:5:ef                 UHLWI           en6
fe80::426c:8fff:fe35:939c%en6           40:6c:8f:35:93:9c               UHLWI           en6
fe80::426c:8fff:fe35:a53d%en6           40:6c:8f:35:a5:3d               UHLWI           en6
fe80::426c:8fff:fe35:aee4%en6           40:6c:8f:35:ae:e4               UHLWI           en6
fe80::426c:8fff:fe35:b5ac%en6           40:6c:8f:35:b5:ac               UHLWI           en6
fe80::426c:8fff:fe35:be92%en6           40:6c:8f:35:be:92               UHLWI           en6
fe80::426c:8fff:fe35:e3bf%en6           40:6c:8f:35:e3:bf               UHLWI           en6
fe80::426c:8fff:fe37:ae78%en6           40:6c:8f:37:ae:78               UHLWI           en6
fe80::426c:8fff:fe37:c6bf%en6           40:6c:8f:37:c6:bf               UHLWI           en6
fe80::426c:8fff:fe3b:9f0%en6            40:6c:8f:3b:9:f0                UHLWI           en6
fe80::426c:8fff:fe4d:ee77%en6           40:6c:8f:4d:ee:77               UHLWI           en6
fe80::6a5b:35ff:fe95:b12%en6            68:5b:35:95:b:12                UHLWI           en6
fe80::6a5b:35ff:fe9a:78a6%en6           68:5b:35:9a:78:a6               UHLWI           en6
fe80::6a5b:35ff:feb8:898e%en6           68:5b:35:b8:89:8e               UHLWI           en6
fe80::6a5b:35ff:febe:5914%en6           68:5b:35:be:59:14               UHLWI           en6
fe80::6a5b:35ff:febf:b0f9%en6           68:5b:35:bf:b0:f9               UHLWI           en6
fe80::6a5b:35ff:febf:cb6d%en6           68:5b:35:bf:cb:6d               UHLWI           en6
fe80::6a5b:35ff:fec0:71ba%en6           68:5b:35:c0:71:ba               UHLWI           en6
fe80::6a5b:35ff:fec1:2841%en6           68:5b:35:c1:28:41               UHLWI           en6
fe80::6a5b:35ff:fec1:6b5e%en6           68:5b:35:c1:6b:5e               UHLWI           en6
fe80::6a5b:35ff:fec1:e970%en6           68:5b:35:c1:e9:70               UHLWI           en6
fe80::6a5b:35ff:fec3:72f%en6            68:5b:35:c3:7:2f                UHLWI           en6
fe80::6a5b:35ff:fec3:8f7%en6            68:5b:35:c3:8:f7                UHLWI           en6
fe80::6a5b:35ff:fec3:3344%en6           68:5b:35:c3:33:44               UHLWI           en6
fe80::6a5b:35ff:fec3:697a%en6           68:5b:35:c3:69:7a               UHLWI           en6
fe80::6a5b:35ff:fec3:8c35%en6           68:5b:35:c3:8c:35               UHLWI           en6
fe80::6a5b:35ff:fec3:cf8f%en6           68:5b:35:c3:cf:8f               UHLWI           en6
fe80::6a5b:35ff:fec4:4cbb%en6           68:5b:35:c4:4c:bb               UHLWI           en6
fe80::6a5b:35ff:fec4:5e76%en6           68:5b:35:c4:5e:76               UHLWI           en6
fe80::6a5b:35ff:fec4:c1be%en6           68:5b:35:c4:c1:be               UHLWI           en6
fe80::6a5b:35ff:fec4:c861%en6           68:5b:35:c4:c8:61               UHLWI           en6
fe80::6a5b:35ff:fec4:d642%en6           68:5b:35:c4:d6:42               UHLWI           en6
fe80::6a5b:35ff:fec4:d744%en6           68:5b:35:c4:d7:44               UHLWI           en6
fe80::6a5b:35ff:fec4:e541%en6           68:5b:35:c4:e5:41               UHLWI           en6
fe80::6a5b:35ff:fec4:eb94%en6           68:5b:35:c4:eb:94               UHLWI           en6
fe80::6a5b:35ff:fec4:f3ad%en6           68:5b:35:c4:f3:ad               UHLWI           en6
fe80::6a5b:35ff:fec5:10f5%en6           68:5b:35:c5:10:f5               UHLWI           en6
fe80::6a5b:35ff:fec5:1311%en6           68:5b:35:c5:13:11               UHLWI           en6
fe80::6a5b:35ff:fec5:1acd%en6           68:5b:35:c5:1a:cd               UHLI            lo0
fe80::6a5b:35ff:fec5:571b%en6           68:5b:35:c5:57:1b               UHLWI           en6
fe80::6a5b:35ff:fec5:652e%en6           68:5b:35:c5:65:2e               UHLWI           en6
fe80::6a5b:35ff:fec5:735a%en6           68:5b:35:c5:73:5a               UHLWI           en6
fe80::6a5b:35ff:fec5:c33b%en6           68:5b:35:c5:c3:3b               UHLWI           en6
fe80::6a5b:35ff:fec5:caf2%en6           68:5b:35:c5:ca:f2               UHLWI           en6
fe80::6a5b:35ff:fec5:d32a%en6           68:5b:35:c5:d3:2a               UHLWI           en6
fe80::6a5b:35ff:fec5:dc91%en6           68:5b:35:c5:dc:91               UHLWI           en6
fe80::6a5b:35ff:fec5:f31b%en6           68:5b:35:c5:f3:1b               UHLWI           en6
fe80::6a5b:35ff:fec6:a70%en6            68:5b:35:c6:a:70                UHLWI           en6
fe80::6a5b:35ff:fec6:1d59%en6           68:5b:35:c6:1d:59               UHLWI           en6
fe80::6a5b:35ff:fec6:254a%en6           68:5b:35:c6:25:4a               UHLWI           en6
fe80::6a5b:35ff:fec6:64a5%en6           68:5b:35:c6:64:a5               UHLWI           en6
fe80::6a5b:35ff:fec6:fa8f%en6           68:5b:35:c6:fa:8f               UHLWI           en6
fe80::6a5b:35ff:fec7:3b05%en6           68:5b:35:c7:3b:5                UHLWI           en6
fe80::6a5b:35ff:fec7:54ad%en6           68:5b:35:c7:54:ad               UHLWI           en6
fe80::6a5b:35ff:fec7:8e45%en6           68:5b:35:c7:8e:45               UHLWI           en6
fe80::6a5b:35ff:fec7:ce02%en6           68:5b:35:c7:ce:2                UHLWI           en6
fe80::6a5b:35ff:fec7:d1e5%en6           68:5b:35:c7:d1:e5               UHLWI           en6
fe80::6a5b:35ff:fec7:d30a%en6           68:5b:35:c7:d3:a                UHLWI           en6
fe80::6a5b:35ff:fec7:ef87%en6           68:5b:35:c7:ef:87               UHLWI           en6
fe80::6a5b:35ff:fec7:f3cd%en6           68:5b:35:c7:f3:cd               UHLWI           en6
fe80::6a5b:35ff:fec7:f428%en6           68:5b:35:c7:f4:28               UHLWI           en6
fe80::6a5b:35ff:fec8:3104%en6           68:5b:35:c8:31:4                UHLWI           en6
fe80::6a5b:35ff:fec8:33e2%en6           68:5b:35:c8:33:e2               UHLWI           en6
fe80::6a5b:35ff:fec8:3422%en6           68:5b:35:c8:34:22               UHLWI           en6
fe80::6a5b:35ff:fec8:4781%en6           68:5b:35:c8:47:81               UHLWI           en6
fe80::6a5b:35ff:fec8:4971%en6           68:5b:35:c8:49:71               UHLWI           en6
fe80::6a5b:35ff:fec8:4c68%en6           68:5b:35:c8:4c:68               UHLWI           en6
fe80::6a5b:35ff:fec8:4e1e%en6           68:5b:35:c8:4e:1e               UHLWI           en6
fe80::6a5b:35ff:fec8:4e2b%en6           68:5b:35:c8:4e:2b               UHLWI           en6
fe80::6a5b:35ff:fec8:4e71%en6           68:5b:35:c8:4e:71               UHLWI           en6
fe80::6a5b:35ff:fec9:f87c%en6           68:5b:35:c9:f8:7c               UHLWI           en6
fe80::6a5b:35ff:feca:4c96%en6           68:5b:35:ca:4c:96               UHLWI           en6
fe80::6a5b:35ff:feca:4d71%en6           68:5b:35:ca:4d:71               UHLWI           en6
fe80::6a5b:35ff:fecc:cc2c%en6           68:5b:35:cc:cc:2c               UHLWI           en6
fe80::6a5b:35ff:fecf:24cc%en6           68:5b:35:cf:24:cc               UHLWI           en6
fe80::6a5b:35ff:fecf:f89c%en6           68:5b:35:cf:f8:9c               UHLWI           en6
fe80::6a5b:35ff:fecf:fc4d%en6           68:5b:35:cf:fc:4d               UHLWI           en6
fe80::6a5b:35ff:fecf:fcb5%en6           68:5b:35:cf:fc:b5               UHLWI           en6
fe80::6a5b:35ff:fecf:fe5c%en6           68:5b:35:cf:fe:5c               UHLWIi          en6
fe80::6a5b:35ff:fed0:2196%en6           68:5b:35:d0:21:96               UHLWI           en6
fe80::6a5b:35ff:fed0:21c6%en6           68:5b:35:d0:21:c6               UHLWI           en6
fe80::6a5b:35ff:fed0:249f%en6           68:5b:35:d0:24:9f               UHLWI           en6
fe80::6a5b:35ff:fed0:32f9%en6           68:5b:35:d0:32:f9               UHLWI           en6
fe80::6a5b:35ff:fed0:3570%en6           68:5b:35:d0:35:70               UHLWI           en6
fe80::6a5b:35ff:fed0:366b%en6           68:5b:35:d0:36:6b               UHLWI           en6
fe80::6a5b:35ff:fed0:3928%en6           68:5b:35:d0:39:28               UHLWI           en6
fe80::6a5b:35ff:fed0:3d21%en6           68:5b:35:d0:3d:21               UHLWI           en6
fe80::6a5b:35ff:fed0:4149%en6           68:5b:35:d0:41:49               UHLWI           en6
fe80::6a5b:35ff:fed0:45eb%en6           68:5b:35:d0:45:eb               UHLWI           en6
fe80::6a5b:35ff:fed0:4c8c%en6           68:5b:35:d0:4c:8c               UHLWI           en6
fe80::6a5b:35ff:fed0:a382%en6           68:5b:35:d0:a3:82               UHLWI           en6
fe80::6a5b:35ff:fed0:f683%en6           68:5b:35:d0:f6:83               UHLWI           en6
fe80::6a5b:35ff:fed0:f980%en6           68:5b:35:d0:f9:80               UHLWI           en6
fe80::6a5b:35ff:fed1:5b60%en6           68:5b:35:d1:5b:60               UHLWI           en6
fe80::6a5b:35ff:fed2:8eb1%en6           68:5b:35:d2:8e:b1               UHLWI           en6
fe80::6a5b:35ff:fed2:9ebc%en6           68:5b:35:d2:9e:bc               UHLWI           en6
fe80::6a5b:35ff:fed2:b3b4%en6           68:5b:35:d2:b3:b4               UHLWI           en6
fe80::6a5b:35ff:fed2:b3ed%en6           68:5b:35:d2:b3:ed               UHLWI           en6
fe80::6a5b:35ff:fed4:e7a9%en6           68:5b:35:d4:e7:a9               UHLWI           en6
fe80::6a5b:35ff:fed4:f350%en6           68:5b:35:d4:f3:50               UHLWI           en6
fe80::6a5b:35ff:fed4:f3cd%en6           68:5b:35:d4:f3:cd               UHLWI           en6
fe80::6c40:8ff:fec9:ab64%en6            6e:40:8:c9:ab:64                UHLWI           en6
fe80::7626:acff:fe16:23b7%en6           74:26:ac:16:23:b7               UHLWI           en6
fe80::7a31:c1ff:fef2:a3b9%en6           78:31:c1:f2:a3:b9               UHLWI           en6
fe80::7ec3:a1ff:fe87:27a%en6            7c:c3:a1:87:2:7a                UHLWI           en6
fe80::7ec3:a1ff:fe87:1683%en6           7c:c3:a1:87:16:83               UHLWI           en6
fe80::7ec3:a1ff:fe87:4e0c%en6           7c:c3:a1:87:4e:c                UHLWI           en6
fe80::8249:71ff:fe12:156e%en6           80:49:71:12:15:6e               UHLWI           en6
fe80::9a5a:ebff:fec6:dcfb%en6           98:5a:eb:c6:dc:fb               UHLWI           en6
fe80::9eeb:e8ff:fe1e:f138%en6           9c:eb:e8:1e:f1:38               UHLWI           en6
fe80::aa20:66ff:fe1c:ca1f%en6           a8:20:66:1c:ca:1f               UHLWI           en6
fe80::aa20:66ff:fe29:e46c%en6           a8:20:66:29:e4:6c               UHLWI           en6
fe80::aa20:66ff:fe2a:fa82%en6           a8:20:66:2a:fa:82               UHLWI           en6
fe80::aa20:66ff:fe2b:24a3%en6           a8:20:66:2b:24:a3               UHLWI           en6
fe80::aa20:66ff:fe39:d631%en6           a8:20:66:39:d6:31               UHLWI           en6
fe80::aa20:66ff:fe3c:7098%en6           a8:20:66:3c:70:98               UHLWI           en6
fe80::aa20:66ff:fe42:64ef%en6           a8:20:66:42:64:ef               UHLWI           en6
fe80::aa20:66ff:fe44:c045%en6           a8:20:66:44:c0:45               UHLWI           en6
fe80::aa20:66ff:fe44:cf0e%en6           a8:20:66:44:cf:e                UHLWI           en6
fe80::ae87:a3ff:fe08:c081%en6           ac:87:a3:8:c0:81                UHLWI           en6
fe80::ae87:a3ff:fe17:e7d9%en6           ac:87:a3:17:e7:d9               UHLWI           en6
fe80::ae87:a3ff:fe22:1d09%en6           ac:87:a3:22:1d:9                UHLWI           en6
fe80::ae87:a3ff:fe23:ec3f%en6           ac:87:a3:23:ec:3f               UHLWI           en6
fe80::ae87:a3ff:fe30:f7fa%en6           ac:87:a3:30:f7:fa               UHLWI           en6
fe80::ae87:a3ff:fe31:2ce3%en6           ac:87:a3:31:2c:e3               UHLWI           en6
fe80::ae87:a3ff:fe31:70d1%en6           ac:87:a3:31:70:d1               UHLWI           en6
fe80::ae87:a3ff:fe31:7d06%en6           ac:87:a3:31:7d:6                UHLWI           en6
fe80::ae87:a3ff:fe32:3f33%en6           ac:87:a3:32:3f:33               UHLWI           en6
fe80::ae87:a3ff:fe35:7b61%en6           ac:87:a3:35:7b:61               UHLWI           en6
fe80::ae87:a3ff:fe35:c434%en6           ac:87:a3:35:c4:34               UHLWI           en6
fe80::ae87:a3ff:fe37:9134%en6           ac:87:a3:37:91:34               UHLWI           en6
fe80::ae87:a3ff:fe37:9682%en6           ac:87:a3:37:96:82               UHLWI           en6
fe80::ae87:a3ff:fe37:cf5e%en6           ac:87:a3:37:cf:5e               UHLWI           en6
fe80::ae87:a3ff:fe37:d106%en6           ac:87:a3:37:d1:6                UHLWI           en6
fe80::ae87:a3ff:fe37:f07c%en6           ac:87:a3:37:f0:7c               UHLWI           en6
fe80::ae87:a3ff:fe37:fa99%en6           ac:87:a3:37:fa:99               UHLWI           en6
fe80::ae87:a3ff:fe38:ff5%en6            ac:87:a3:38:f:f5                UHLWI           en6
fe80::ae87:a3ff:fe38:15e6%en6           ac:87:a3:38:15:e6               UHLWI           en6
fe80::ae87:a3ff:fe38:1e53%en6           ac:87:a3:38:1e:53               UHLWI           en6
fe80::ae87:a3ff:fe38:2926%en6           ac:87:a3:38:29:26               UHLWI           en6
fe80::ae87:a3ff:fe38:308e%en6           ac:87:a3:38:30:8e               UHLWI           en6
fe80::ae87:a3ff:fe38:30c4%en6           ac:87:a3:38:30:c4               UHLWI           en6
fe80::ae87:a3ff:fe38:7094%en6           ac:87:a3:38:70:94               UHLWI           en6
fe80::ae87:a3ff:fe38:710a%en6           ac:87:a3:38:71:a                UHLWI           en6
fe80::ae87:a3ff:fe38:7d68%en6           ac:87:a3:38:7d:68               UHLWI           en6
fe80::ae87:a3ff:fe38:8141%en6           ac:87:a3:38:81:41               UHLWI           en6
fe80::ae87:a3ff:fe38:85bb%en6           ac:87:a3:38:85:bb               UHLWI           en6
fe80::ae87:a3ff:fe3a:439b%en6           ac:87:a3:3a:43:9b               UHLWI           en6
fe80::ae87:a3ff:fe3a:90bb%en6           ac:87:a3:3a:90:bb               UHLWI           en6
fe80::ae87:a3ff:fe3a:db3f%en6           ac:87:a3:3a:db:3f               UHLWI           en6
fe80::ae87:a3ff:fe3b:1935%en6           ac:87:a3:3b:19:35               UHLWI           en6
fe80::ae87:a3ff:fe3b:22bf%en6           ac:87:a3:3b:22:bf               UHLWI           en6
fe80::ae87:a3ff:fe3c:cd39%en6           ac:87:a3:3c:cd:39               UHLWI           en6
fe80::b8e8:56ff:fef3:d800%en6           ba:e8:56:f3:d8:0                UHLWI           en6
fe80::ba8d:12ff:fe53:a3e6%en6           b8:8d:12:53:a3:e6               UHLWI           en6
fe80::c62c:3ff:fe32:eb07%en6            c4:2c:3:32:eb:7                 UHLWI           en6
fe80::d2a6:37ff:fee4:1925%en6           d0:a6:37:e4:19:25               UHLWI           en6
fe80::de9b:9cff:feee:605c%en6           dc:9b:9c:ee:60:5c               UHLWI           en6
ff01::%lo0/32                           ::1                             UmCI            lo0
ff01::%en0/32                           link#4                          UmCI            en0
ff01::%awdl0/32                         link#8                          UmCI          awdl0
ff01::%utun0/32                         fe80::f9c4:522:ff91:9dc9%utun0  UmCI          utun0
ff01::%en6/32                           link#13                         UmCI            en6
ff02::%lo0/32                           ::1                             UmCI            lo0
ff02::%en0/32                           link#4                          UmCI            en0
ff02::%awdl0/32                         link#8                          UmCI          awdl0
ff02::%utun0/32                         fe80::f9c4:522:ff91:9dc9%utun0  UmCI          utun0
ff02::%en6/32                           link#13                         UmCI            en6

Could You Be More Obvious?

windows 8.1 listing on amazon Really? Your account name is "disc burner" and you're selling cheap copies of Windows Pro? Unbranded discs with a key tossed in? Of course, if Microsoft would stop charging a premium for the OS and bring it down to dozens of dollars instead of hundreds, this wouldn't be as much a thing.

This is Not Security

I recently received a notice from my kid's after-school care provider that they had setup an online service to check on the bill and update personal information, etc. Well, that's nice — I thought — so I hopped right on setup the account. At first, some good signs. All the accounts were pre-setup with the registered email and a password was pre-set that was based on some information most people wouldn't have. Not perfect, but better than most. However, when I tried to login I was mis-generating the password (four digit year instead of two) so I gave up and hit the "Forgot Password" link to setup the account that way. This, folks, is where I started to get a little concerned. email showing plain text password Yes, that's not only the real password sent over email, but a clever person will pause and say, "Wait, the password is recoverable?" It would appear so. Passwords are stored in a recoverable way and regularly emailed in plain text to people rather than having a reset system. That terrifying moment behind me (and knowing that I simply had to use a unique password on this site), I used 1Password's generator to make a good password. Well, there's problem two. Your new password is too long, it must be 10 characters or less. The passwords, which are recoverable, are limited to 10 characters or less. Oh, and there are also no length or complexity requirements. My password could be "x" and be valid. On the one hand, that does increase the number of possible permutations (something I advocate for) but it also lets idiots be idiots (something I don't advocate for). In any case, the site where my kid's registration information resides is eminently hackable. I know what you're thinking. Surely, if there's any sense in the world, they at least got the most basic, trivial thing right when it comes to safeguarding personal information on the web? You'd be wrong. URL bar with no SSL indicator That's right. No SSL. At all. The only word for this is irresponsible. When they get hacked and my information is out in the world there will be no amount of spin that will give me a moment's pause in putting all the blame completely on their system design, of which every component is in blatant violation of their [declared security practices](

Bluetooth Keyboards

For a mess of reasons too boring to get into, I wanted to get a Bluetooth keyboard for my iPad Mini. After poking around for a bit I found some good candidates, but holy hell is the market for BT keyboards crap right now.

The Apple Wireless Keyboard is pretty much a desk keyboard. While I really hate wires, I hate replacing batteries for needlessly portable devices more, so I always go wired at desks when I can (my love for the Magic Touchpad is an exception to the rule). There are a dozen clones of that keyboard out there (whose manufacturers are both named and unnamed) but the design is very much for the desktop.

I did a search and found a long list of keyboards that would possibly work for me and settled on three to seriously consider: the solar-powered Logitech K470, the Logitech K480, and the Microsoft Universal Mobile keyboard. I chose these because they looked well-designed, supported multiple devices (once I learned this was A Thing™ I realized I wanted it for my Apple TV), and were available for purchase locally so returns would be easier.

Well, after going to a few places that listed the K470 as being in stock, it never was. Popular belief has it that it's been discontinued and that's kind of restricting supply. Oh well. I did find the other two locally and brought them home for some testing.

The Microsoft one is just lovely. It's very Surface-like, small, can pair with three devices, includes a cover that doubles as a detachable device stand, and is rechargable over USB (and a charge lasts six months, supposedly). I love this thing so much. I'm rather sad it didn't work out because so much attention to detail has clearly gone into this product that I was almost unashamed to carry around a MS keyboard with my iPad.

Alas, there are two flaws with this keyboard, and one is fatal with zero recourse. The first flaw is that I have man hands and this was apparently made for small children. Every key I hit was wrong. Even when I got used to it, I found myself smacking something random every 20 characters or so. Livable flaw, especially given how much I liked the thing, but annoying.

The big flaw, however, is a rather unforgivable oversight. The keyboard supports three devices: a PC, an Android device, and an iOS device. I mean that literally. You must have those exact devices for the different positions on the device switch are associated with keymaps for those platforms and there is no way to change that. If you have three PCs, you're boned. If you have three of anything, or even two of anything, you're boned. I have three Apple devices. I was boned. The modifier keys change for each expected platform and on anything other than the iOS mode the Command key is mapped to Control.

Think about that. That means to get Command back I have to remap Control to Command, thus losing Control (which I use in the shell -- a lot). I could switch Caps Lock to Control like a Proper Neckbeard but I never learned to care for that layout so it'd be a frustrating change.

Also, there aren't real function keys; they broke out the actual media keys and mapped them to their F-key for each expected platform. That kills a lot of CLI work as well.

So, I returned it. Sadly. I really liked it outside of that. The cover stand even held my Smart Case-wrapped iPad correctly without taking it off.

Next came the Logitech K480. This thing is big. It's about the size of a MacBook Air 11", but it's light enough that's not a big deal. While that initially gave me much pause, I realized that meant that they keys would feel properly spaced-out, and they do. I can type on this like any other keyboard without any issues at all. There are F-keys, and other than fn and Control being swapped it feels great. Best of all, it solves the keymap problem very well. The knob at the side lets you pick which pairing slot to use at the moment and when you want to pair a device you press either the pc or i buttons which establishes the keymap for that pairing slot at the time of pairing. Whenever you go back to it, the right keymap is used. It works great on the desktop, iPad, Apple TV, and my Linux server as a result. The battery is not rechargable, however. It uses two standard AAA cells, though they claim it'll last a couple of years on one set. We'll see. It wont be the end of the world if not.

Overall, though, what I discovered is that there are a lot of crap options out there and relatively few well-designed ones (at any price). I had hoped that by now there'd be some nice things out there but I guess everyone's making crap hardware to go with the crap freemium apps. At least I found a couple of options that show that some folks are still thinking about usability.

I Can Text You A Pile of Poo, But I Can’t Write My Name

I Can Text You A Pile of Poo, But I Can’t Write My Name by Aditya Mukerjee | Model View Culture:

We have an unambiguous, cross-platform way to represent “PILE OF POO” (💩), while we’re still debating which of the 1.2 billion native Chinese speakers deserve to spell their own names correctly.

Doxygen and NS_ENUM

If you're having trouble getting Doxygen to parse NS_ENUM statements, here's the config file magic:

PREDEFINED = "NS_ENUM(_type, _name)=enum _name : _type"

You may or may not want to enable EXPAND_ONLY_PREDEF to only expand that one macro.

The Design Philosophy of the DARPA Internet Protocols

The Design Philosophy of the DARPA Internet Protocols | the morning paper:

Understanding the underlying principles behind something can turn what might on the surface seem to be simply a collection of facts into a chain of causes and consequences that makes it much easier to see how those parts fit together. Clark provides us with some of those insights for the design of the Internet Protocols, working from the goals towards the implementation consequences.

8 Pages12345>»