Category Archives: Miscellaneous

Of Unicorns and Dragons

One of the GoGo Dragons in Norowich
The tech industry is full of jargon, and it just gets worse when you enter startup land. As this article points out, there’s even jargon for how large a company is. Unicorn (valued over $1Bn) and Decacorn (valued over $10Bn) I’d heard before. The rest were new.

Dragon ($100Bn) is probably a reaction to the fact that Centicorn sounds ridiculous – although I do like the sound of Teracorn, and at a valuation of $109Bn I suspect any investor would too.

The argument is that while unicorns are rare, dragons are rarer. I’m going to argue that this is a ridiculous post rationalisation.

Dragons are everywhere. Norwich is littered with them at the moment. Tales that include dragons are quite common. Tales that include unicorns less so. I’d also argue that while tales with dragons don’t necessarily imply unicorns (Reign of Fire for example), tales that include unicorns generally use a mythology that also include dragons almost by default.

Much easier to rationalise the Unicorn to Dragon scale as dragons are much more badass than unicorns. Simple as.

Of course, eventually inflation is going to mean that Dragon will no longer suffice. Do we simply take from the whole gamut of mythology – in which case may I be the first to propose that a Kilocorn ($1000bn) size company be called a Titan, or do we need to draw from mythology that already includes unicorns and dragons? The latter becomes harder, but we could go with Tarrasque which is certainly more badass than all but the eldest dragons, it just doesn’t really roll off the tongue.

Speed doesn’t kill

Speed doesn’t kill. Coming to rest in a short space of time does. The issue with Accelerators is there doesn’t appear to be any time to brake at the end of it. The day after Techstars finished, with less than 5 hours sleep under my belt, we packed up our office in London, moved it back to Norwich and attempted to reintegrate ourselves into “normal” life. In my case this meant heading straight back down to London for two days last week before returning to do two slots at nor(DEV):con. Part of the reason for being in London was to give a talk on our Neo4j driver. So, come last Monday I had one 10 minute talk, one 45 minute talk and one 90 minute workshop to prepare for, none of which I’d started. The workshop I fobbed off onto Ben and Chris so I only had just shy of an hours worth of talks to prep for. There wasn’t much time for anything else.

This week is the first where I’ve been able to stop. Take stock. And work out exactly where I am.

My inbox is now empty, with 15 flagged items awaiting action later. My todo list for today is todone, with items for the week and beyond mapped out. And three plus months of charging headlong has now been tamed slightly with a list of what’s outstanding and something that looks like a plan. Despite achieving nothing on the surface, today has been incredibly productive.

Getting back into something vaguely like a routine with my family is going to be slightly harder. Working from home while we wait for the birth of our second child is helping here, but it’s going to take more than an empty inbox, well ordered todo list and a project plan.

Of VGA Adapters and Sods Law

So, my shiny new MacBook Pro has an advantage over my old one insofar as it’s got an HDMI input. This means when I’m using it connected to modern and civilised projectors I can just use an HDMI cable and be done with it. Still, it’s not guaranteed that people have projectors with HDMI inputs so I normally pack my Mini Display Port to VGA Adapter just to be on the safe side. I also normally head to talks direct from the office so I keep it in a drawer there to be packed when I head out.

Tomorrow I’m doing a talk at Cromer Academy. Since it’s free of direct government control I’m going to give it a 50/50 chance of a brand new, state of the art projector with every port known to man, and an old projector that accepts VGA as an advanced input. These odds will, of course, be affected by certain factors; like me forgetting my VGA adaptor. I remembered at 9:50 this morning on a day where my wife is at work, I don’t have access to the car, and I have my daughter to look after. We were heading to the Zoo for the morning.

What resulted was categorically not me cutting short zoo time and making a Herculean dash for the office on rural public transport on a Sunday. No, that would result in tantrums. Instead we went on a fairyland adventure with trains, river walks and a castle (hurrah for Norwich’s historic architecture) resplendent with a hastily bought picnic on the train. Spin at its absolute finest.

I am now armed with my VGA connector, the child has fallen asleep from all the excitement and I’m in desperate need of a shower having charged round Norwich with a pushchair in a heat wave. I expect fate will repay me with some fancy 8K 3D projector that wirelessly displays images without the need for any adapters.

Elite Dangerous and CH Products HOTAS

Not the most inspiring of titles, but then it’s deliberately anti-linkbait 🙂 If you are not playing Elite Dangerous you may want to go find something more interesting to read… no, seriously 😛 For everyone else, this is very CH Product centric, but may provide some ideas for other HOTAS setups.

Step 1: The Joystick Map

Download the Joystick map and CMS file and put them in your documents folder under a directory called CH Control Manager (you many need to create this if you haven’t used the CH Control Manager before).

Plugin your Fighterstick and Throttle, then launch the CH Control Manager and load the ed.map. The click the Download button to enable the map. This basically combines the stick and throttle into a single DirectX control. Due to limitations on the number of buttons available some buttons are mapped to key presses.

Few notes about the map:

  • I don’t use joystick modes, so it doesn’t matter what colour LED is lit on either the throttle or stick
  • The throttle control on the stick is mapped to a CMS scrip that disables the HOTAS Throttle when it’s fully back, and enables it when it’s fully forward. If your HOTAS throttle axis doesn’t seem to work then move the throttle wheel on the joystick to the other extreme.
  • I use the pinky button on the stick as shift and the map makes heavy use of shift.

You can use the Keycheck and Test/Calibrate options from the CH Control Manager to test the button and axis mappings.

Step 2: Mapping the game controls

Next up you want to copy the custom bindings for the above map into your Elite Dangerous data folder under C:\Users\USER\AppData\Local\Frontier Developments\Elite Dangerous\Options\Bindings\Custom.binds. Change USER to be your username. AppData is a hidden directory so you’ll need to enable Show Hidden Files.

I should point out that I’ve not actually tried this, I’m just assuming it’ll work. Worse case scenario you’ll need to go in game and just map the actions from the layout guide to the in game controls.

Step 3: Learn the map

Ah, the fun bit. Basically you can run the joysticks in a number of different modes depending on the situation at hand. So that you’ve still got access to all the controls you’re going to need some controls are duplicated elsewhere, albeit using the shift button to get to them. I’ve provided a layout guide for the map which shows which button maps to what action. It’s split over 3 pages depending on the mode you’re in.

Normal Operation

Page 1 of the joystick layout shows the default buttons configuration for the sticks with the ships gear up and without the shift pinky button pressed. They joystick is mapped to Pitch and Roll with the Throttle Wheel being used to engage (fully forward) and disengage (fully back) the main HOTAS Throttle Axis. Pressing button 3 on the throttle (middle of the three buttons on the throttle handle) toggles the joystick Y axis between roll and yaw.

The HOTAS Throttle Axis is mapped across the full range, so fully back gives you full reverse throttle, fully forward give you full forward throttle. The exception is when in Supercruise where this is no reverse so fully back on the throttle is minimum Supercruise speed and fully forward is maximum Supercruise. Under normal flight modes zero throttle is somewhere roughly in the middle of the axis range. If you need to stop set the Joystick Throttle to fully back to disengage the HOTAS Throttle Axis and set it to 0.

The Thumb Stick on the joystick is uses for Lateral and Vertical Thrust. The dead-zone is quite large on these as I find the stick doesn’t tend to centre as well as it could. If you find yourself thrusting vertically or laterally with no input check the stick is centred and possibly increase the dead zone.

The Joystick Hat Switch is usually used to provide digital inputs for Pitch and Yaw, making small adjustments in Supercruise and while docking easy. Pressing the shift (pinky button) on the joystick and button 2 on the throttle at the same time (shift-b2) toggles head look. The Joystick Hat Switch is used to look around the cockpit when head look is enabled. Press shift-b2 again to disengage head look and return the Joystick Hat Switch to Pitch and Yaw.

firing and Targeting is performed on the joystick with the Trigger performing primary fire and button 3 (the side button) used for secondary fire. button 2 toggles hard points, although they will automatically deploy if not already deployed when trying to fire.

A digital roll control is mapped to side 4-way Switch on the joystick, as is Engine Boost and Reverse Throttle.

Navigating the ships systems is done using the two 4-way Switches and the Hat Switch on the side of the throttle. The top 4-way Switch is used to bring up the Target Panel (left), Systems Panel (right) and Radar Panel (down). Pressing up returns you to the normal forward view. The direction you move the 4-way Switch matches where the panels are in relation to the cockpit. The Throttle Hat Switch is used to move between the various tabs on the UI windows (left and right) and to highlight items on the window (up and down). Use the bottom 4-way Switch to increase (right) and decrease (left) highlighted values, or button 4 on the throttle to select the currently highlighted entry. For example, to request docking you might press left on the top 4-way Switch to bring up the Target Panel, press right on the Throttle Hat Switch to select Contacts on the Target Panel, press down on the Throttle Hat Switch to select the station, then press button 4 on the throttle to bring up the interaction dialog, then down on the Throttle Hat Switch to request docking permission, then button 4 on the throttle to confirm.

Power management is performed using the forward 4-way Switch on the throttle with the directions matching that on the UI (left for Systems, forward for Engines, right for Weapons and back to reset).

You can see the other assignments on the layout diagram.

Shifted Operation

Page 2 of the joystick layout shows the button assignments when the joystick shift (pinky) button is pressed. The greyed out assignments are the same as the unshifted assignments. Under shifted operation the joystick Hat Switch changes to a digital lateral and vertical thrust and the digital roll control that is mapped to side 4-way Switch on the joystick becomes yaw controls. There’s also access to additional targeting and sensor options on the stick.

Shift controls on the throttle allow you to toggle and reset head look, plus toggle/deploy various ancillary functions on the ship.

Axis mappings remain the same in shifted operation.

Landing Overrides

Page 3 of the joystick layout show the button assignments when the ships landing gear is deployed. This overrides basic targeting, fire group control and FTL drive control functions to provide all axis of motion via the two 4-way Switches and the Hat Switch on the top of the joystick. While docking (and especially while undocking) it’s recommended to disable the HOTAS Throttle Axis by moving the joystick Throttle Axis fully back. You can then use the thumb stick, joystick axis and the various digital controls to effectively land.

The greyed out assignments in this mode are the same as when the landing gear is not deployed. Sifted operation remains the same with the exception that changing fire groups is now mapped to Roll.

Watching it in action

There is a youtube video that goes over some of these layouts, and a thread on the Beta Discussion forum for those who are in the beta.

Feel free to mess about with the maps, and tweak them to your needs – or just to use them as an example of how to do some (very) basic CMS scripting with the CH Products HOTAS.

Improving Google Drive on the Mac

I’ve been a Dropbox user for ages now, although I’ve never really been hugely active in getting referrals or other activities to increase my free space. Currently my account lets me store 3.8Gb of data. Until recently this has been fine, however, I also now have a few shared folders which are beginning to chew up some space. To mitigate this problem I’ve hived off just under a Gig of data to Google Drive, which I’ve recently installed. While Google Drive doesn’t really give me the in-app integration of Dropbox, it is quite a useful place to dump lesser used files and backups.

My problem is that the badges used by Google Drive are hideous and fugly, and that doesn’t appeal to my sense of good style. If you compare the Google Drive folder on the left in the two images below to the Dropbox folder on the right you’ll see what I mean.

dropbox googledrive

Googling to see if there was a way to solve this issue was, initially, fruitless, however, I came across something telling me where the Dropbox badges were within the application. They’re
icns files which got me thinking; did Google Drive use something similar? Turns out it does. The solution was simple, copy the Dropbox icns files over the Google Drive ones, reboot and voila.

As you can see from the two examples below, it’s not quite perfect. Again, Dropbox is on the left and Google Drive is on the right, and the Google Drive badge is offset lower and to the right. Still, it’s a huge improvement.

dropboxgoogledrivenew

The commands I used were simple, and include a step to backup the old Google Drive icns files. Obviously, we’re messing with the internals of an application here so Caveat Emptor and all that, and if you end up breaking it you get to keep both halves – please don’t come running to me.

cd /Applications/Google\ Drive.app/Contents/Resources/FinderExt.bundle/Contents/Resources

cp Blacklisted.icns Blacklisted.icns.bak
cp Shared.icns Shared.icns.bak
cp Synced.icns Synced.icns.bak
cp Syncing.icns Syncing.icns.bak

cp /Applications/Dropbox.app/Contents/Resources/emblem-dropbox-unsyncable.icns Blacklisted.icns
cp /Applications/Dropbox.app/Contents/Resources/emblem-dropbox-uptodate.icns Shared.icns
cp /Applications/Dropbox.app/Contents/Resources/emblem-dropbox-uptodate.icns Synced.icns
cp /Applications/Dropbox.app/Contents/Resources/emblem-dropbox-syncing.icns Syncing.icns

OSX Screen Saver Bug

Screen Saver PreferencesJust had a really weird bug with Screen Savers in OSX after upgrading to 10.9.2. I use hot corners to enable the screen saver (and thus lock the screen), but this stopped working after the update. Quick Google suggested it wasn’t actually the hot corners not working, but the screen saver. Further Googling uncovered it was something weird to do with the “Start after” setting. I had this set to “Never“. Changing this to “1 Minute” caused my hot corners to start working again. Changing it back to “Never” and everything was still fine. Most odd.

OK, so maybe Kevlin has a point

Kevlin Henney posted the following today:

Now I can understand Klingon, it’s not a widely spoken language, but Latin? I went to http://agilemanifesto.org/, select, copy, paste, Google Translate, done.

Manifesto enim vincula Lorem ipsum

Nos melius developing discooperiens
Alii luctus et faciendo eam.
Per hoc pretium venimus:

Et super homines, et agant, et fiunt instrumenta
Lorem ipsum dolor sit elit in dolor
Customer in collaborationem negotium contractus
Responsio ad his consilium muta

Id est, cum sit in pretium items
dextrorsum sinistrorsum items magis existimemus.

OK, so I don’t speak Latin and machine translation leaves a lot to be desired, but if we translate back to English we get:

Manifesto for China ties

We better developing uncovering
Some software and doing it.
During this tour we have

And upon men, and to act as, and become the instruments of
Let’s see what the company’s competition in the
Customer collaboration in business contracts
The answers to these policy change

In other words, since it is in the price of the items
right to the left of items more rest.

Which looks correct to me.

Haves and Have Nots

My development team is divided into the Haves and the Have nots. The Haves have a number of things in common. For starters they’re not using the bog standard corporate HP workstations that get issued to new joiners. They don’t use Windows, instead choosing Linux or Windows. They all have SSDs. They all have substantially lower compile times than the rest of the team.

Historically, to be a Have here, you needed to put your hand into your own pocket. Some, if not all of the hardware used by the Haves machines is self funded. Including the SSDs. This situation has arisen from the standard fallacy that you can just bulk order a load of machines for everyone in the company and they’ll be fine. Not all computer users are created equal.

Of course trying to explain to The Powers That Be that spending an extra few hundred on a computer is actually a cost saving is often an exercise in futility. Everyone else copes with a £400 computer, what makes us so special that we need to spend more?

The answer is compile time. Developers aren’t cheap and a bog standard Windows 7 box takes about a minute to do a compile of the code base. Custom Linux box with SSD: 6 seconds.

Thankfully I am now The Powers That Be, at least I am when it comes to ordering a bunch of 60Gb SSDs for use as development drives. I may not be able to convince everyone to move away from Windows, and our standard HP boxes may not quite stretch to sub 10 second builds, even with Linux on them, but if I can cut 10 or 15 seconds of everyone’s compile time the £300 cost will easily pay for itself over the lifetime of the disks.

I’m hoping this will soften the blow for the next move: proper development rigs for all the developers during the next hardware refresh. Now if only I could justify shiny new Mac Pros for everyone 🙂

Eclipse, OSX and JDK 1.7

Despite being a massive Mac fanboi I am the first to admit that as soon as you start going a little off piste with OSX you run into problems that require technical knowledge to fix. Java development on the Mac falls into the category of off piste and it has always been more than a little fun getting things set up.

Now that Oracle are providing the JDK it seems that things no longer live quite where they do which left me scratching my head when trying to get Eclipse working with JDK 1.7.

Installing JDK 1.7 is easy, go to the Oracle download page, grab the 64bit OSX DMG, open, run, job done.

$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

Now to tell Eclipse where the JDK is:

$ ls -l `which java`
lrwxr-xr-x  1 root  wheel  74 24 Oct 15:37 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

Great… except Eclipse doesn’t recognise /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/ or /System/Library/Frameworks/JavaVM.framework/Versions/Current/ as a valid JDK location.

A bit of Googling I discovered the magic java_home command.

$ /usr/libexec/java_home -v 1.7
/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home

Giving that directory to Eclipse made it happy and I’m now able to use an up to date version of Java for my code.

Overlooking Social Channels

We recently suffered an 8 hour outage from our payment provider. The most frustrating thing about this outage was the complete lack of information from the payment provider about the problem, or indeed the lack of any communication whatsoever. Yesterday we got reports from our front office staff that they were having problems with payments again. A quick check of the logs confirmed that, yes, there was a problem somewhere. Given the nature of the issue it was likely to be a problem with out payment provider but we needed to be sure. We approached getting this information in two ways.

My boss took the traditional approach, contacting the account manager to see what light they could shed on the problem. Net result: there may be a problem, further information would be forthcoming in 30 minutes after a meeting their side.

Given the informational black hole from the last outage I took a slightly tangential approach; Twitter. In seconds I was able to confirm that others were seeing the same problem and it has started at least 3 minutes ago. Two minutes after that, and only 5 minutes after the outage started I had the entire company either on, or preparing to enter a BCP stance. Part of this involved speaking to our social media team because they needed to be poised to inform customers and handle customer queries and complains.

25 minutes later the outage ended. Again I was able to confirm that there were no intermittent problems through a combination of our logs, talking to our staff and responses from people on Twitter. We still hadn’t been called back by the account manager, there was still no official communication about the outage. As far as I’m aware, some 24 hours on, there is still no official acknowledgment.

These days companies, especially large ones, need to understand that they have a social media presence, even if it’s not official. Search for our payment provider during an outage and the torrent of negative opinion and pleas for information are abundant. In this case the presence of, and silence of the official Twitter account only fuelled this frustration. People expect frequent and honest updates, especially when it’s something as important as a payment provider. BCP should include informing customers of the outage, the extent, estimated duration and any other pertinent information. Even if it is “We are aware of issues with the payment gateway. Engineers are looking into it, update to follow in 10 minutes“. Not wanting to say anything for fear of negative reaction is pointless. The negative reaction is already out there. How you present the information is also critical. Use of the word “intermittent” for a problem that is affecting 99 out of 100 transactions, while technically accurate, is clouding the situation. “We are suffering from intermittent problems” in this case sounds like spin which sticks out like a sore thumb in a sea of negative statements.

Effective management of the various social media channels is something that is overlooked by ‘traditional’ far too often.