The Bug is Your Fault

My Quora answer : Phil Jones’s answer to What are some great truths of computer programming?

  1. The bug is your fault

  2. The bug is your fault

  3. The bug is your fault

  4. The bug is your fault

  5. The bug is your fault.

  6. No. The bug really IS your fault.

  7. The bug is your fault. Because you made an assumption that wasn’t true.

  8. The bug is your fault. And it won’t go away until you check your assumptions, find the one that isn’t true, and change it.

Clojure Debugging

Has to be said that Clojure’s runtime debugging support is the worst ever. A call stack of irrelevant Java information and no idea which line of Clojure actually triggered the error.
At least with CoffeeScript you can look into the Javascript at the appropriate line-number and see sort of what it’s doing and then map that back to CoffeeScript manually.

Tweaking / Refactoring OWL / OWLdroid

A bit of tweaking and refactoring OWL and OWLdroid over the last couple of days. If you’re trying them out, thinking of doing any development on OWL, it’s worth updating.
What’s up :
– the main purpose of this work was to bring the OWL and OWLdroid versions of the code-base back together. They’d drifted apart in my first attempt to figure out how to get this stuff working as an Android app. Now all the directory structures are back in the same place. The variation between versions is largely pulled out into specific local_setup.js files and a certain amount of cruft, debugging messages etc. have been removed.
This is obviously going to make it easier to do common development moving forward.
– there’s a new “Quick” menu which has buttons for moving the node up, down, left, right, and deleting it. This is mainly useful in OWLdroid where the menu was the only way to move nodes and there was no way to remove them. Nodes still have to be selected into the white-on-black non edit mode before they can be deleted (a useful precaution). This is awkward on OWLdroid, because there’s still the problem that the font-awesome arrows that show open / closed state of the items aren’t appearing. But it is possible to select this mode and, therefore, now possible to delete nodes on Android. (which previously wasn’t the case.)
– In OWLdroid I’ve experimentally moved the nav-bar up to the main menu bar. I’m concerned that this will screw up the layout on small screens. (Please tell me if it does.) Though it’s more or less OK on my Nexus 7 and I’d assume any tablet or in landscape mode.
There is a BIG advantage of doing this. The nav-bar controls no longer scroll off the top of long pages. So you can easily go back / forward or create links however far down the page you are. It’s definitely more usable for me.
I haven’t made the change in normal OWL because I think the cost / benefit calculation re: scrolling / layout problems probably works out a little differently. But if I get requests, then I’ll do it.
As a side-effect, it’s also removed something that was a catastrophic trap for the unwary in OWLdroid. The default bootstrap layout has a “brand” at the top left, which is a link back to the main page. When this was left in the Android version, if you clicked on it, it would cause weird behaviour. (On my tablet it would try to open the file system) That was confusing and hard to get back from. The branding link is now gone so this is no longer a danger.
– I’m still chasing down the Safari bug. It’s basically something to do with the way I handle requests for non-existent pages. The code which picks that up and deals with it on Firefox throws an error in Safari. The bug is appearing in jquery code, but it’s obviously because a null value is getting in somewhere. Just have to figure out what I’m relying on and make it an explicit test.


There’s a big fix for OWL today. There were some mysterious times when pages that I thought I was changing were getting reverted. I thought originally that this was a glitch from me btsync-ing between my laptop and tablet. Or maybe my attempts at doing background synchronization between the browser localStorage and the server were failing.

Nothing seemed to completely eliminate this intermittent problem. But today I realized it was much simpler. I was basically using’s “static” file serving to pull the OPML files off the server into Concord. But “static” is meant for static files (doh!). The browser was caching them. (Maybe because of some header was putting out.) Anyway, I just changed the server to reading the files into memory and spitting their contents out, just like any other dynamic web-page, and the problem looks like it’s gone away.

I’ll keep an eye out, but I think that was it.