Posts for Sunday, February 21, 2010

Gentoo Mozilla Team meeting decisions

On Feb 21st, Sunday, the Gentoo Mozilla Team had an informal meeting to discuss some of the recent changes which have a large-ish impact on users. Below is a list of them and the decisions that were taken. After the list is a description of each decision.

SQLite with Firefox: Firefox will use the bundled sqlite by default. Users can select the system-wide sqlite by setting USE=system-sqlite.

Ebuilds for Extensions in-tree: The Gentoo Mozilla team will not ship ebuilds for extensions such as noscript and weave anymore. We will only have ebuilds for extensions which are linux-specific and compiled; such as enigmail.

Firefox and Thunderbird Alphas and Betas: In addition to the overlay, we are going to start placing alphas and betas of Firefox and Thunderbird in the tree with a package.mask and a big fat ewarn during installation. Adventurous users are encouraged try them out but report bugs only in the Gentoo bugzilla. Do not go to upstream unless we ask you.

NOTE: These ebuilds will not have language packs since upstream does not release packs for these.

NSS/NSPR Changes: This involves various cleanups to the ebuild, and moving of the libraries from ${libdir}/{nss/nspr} to ${libdir} and removal of the /etc/env.d/08{nss,nspr} LDPATH entries alongwith corresponding changes in firefox-bin and thunderbird-bin launchers. These changes should be completely transparent to the user.

Revival of #gentoo-moz @ FreeNode: The mozilla team has expanded in recent times, and with that we have decided to revive the ages-old #gentoo-moz irc channel. Users are welcome to idle, discuss, and ask for help on that channel. Come on over!

Why we made these decisions:

SQLite with Firefox: We've done flip-flops on using the system-installed sqlite for for XULRunner and Firefox. Initially, we used the internal one, but folks reported bugs about that (we prefer not to use bundled libraries), so we switched to the system sqlite.

Then with the next version of Firefox, people started reporting major bugs with using the system sqlite and we temporarily disabled it. Once the problems were resolved, we added USE=+sqlite to use the system-installed sqlite by default.

Recently, another issue cropped up: upstream mozilla was getting bug reports that the sqlite db was insecure, and trivial tools like grep could be used to get (private) deleted information from it. They traced that to distros using the system sqlite which didn't have support for SQLITE_SECURE_DELETE. They then made that a mandatory configure check with 3.6 (and we added a dep on the system sqlite for it). Soon, we started getting bug reports from people who did not want that enabled system-wide (since it zeroes out the data when deleting it, which has a performance penalty). Upstream made it clear that they would not make the check optional.

In the end, we decided to make firefox use the internal sqlite by default, and allow the user to select the system installed sqlite via USE=sytem-sqlite if they are ok with secure-delete being on system-wide.

Ebuilds for Extensions in-tree: We found that a number of extensions were being released at a very swift rate which meant two things:

  1. Bumping ebuilds was very tedious, which led to them becoming stale very quickly
  2. Judging whether an ebuild can go stable was not possible, and most often the extension developers just want the users to use the latest release.
This offset the benefit of users being able to install extensions system-wide and have it managed by portage. Users can still manually install and manage system-wide extensions if they so wish. They are also free to copy the old ebuilds to their local overlays and use them if they wish.

Firefox and Thunderbird Alphas and Betas: Mozilla Upstream has been complaining that their betas and release candidates don't get much testing on Linux since all the distros ship only the final releases. This means that bugs are caught very late, and aren't fixed till the next major version. To help with this, we've decided to revise our release strategy and give a bit more visibility to our alphas and betas (which are generally kept in the overlay) by pushing them to the tree under package.mask, and with large ewarns all over the place. Users are strongly advised NOT to report bugs with these directly to upstream. Please use the Gentoo Bugzilla.

NSS/NSPR Changes: the libraries for nss and nspr were installed in a prefix due to collisions with other packages (libssl.a for instance). Recently, Google decided to use portage for cross-compiling and managing ChromeOS. This combined with some bugs reported with NSS/NSPR led to some investigation, and a voluntary review of the ebuilds.

This led to a number of changes which included disabling static libraries for NSS and NSPR, and moving the rest to ${libdir}. Further details on the changes and their "why" are listed on the review bugs linked above.

Getting list of referers out of Apache logs

I use Google Analytics, but it has a noticeable lag in updating its information. When my site is being hammered, I'd like to see where all the traffic is coming from. It'd also be nice to see how many hits my RSS feed is getting, and how many images and static files are being direct-linked, which Google Analytics currently isn't tracking for me at all.

So this script will look in my Apache logs and print referers for some URL, thanks to ApacheLogRegex:


require 'apachelogregex'

raise "USAGE: #{$0} log_filename desired_url" unless ARGV[0] and ARGV[1]

format = '%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"'
parser =
pat =[1])
refs = {}

File.readlines(ARGV[0]).each do |line|
  x = parser.parse(line)
  if pat.match(x["%r"])
    r = x["%{Referer}i"]
    refs[r] = (refs[r] || 0) + 1
refs.sort_by{|k,v| -v}.each do |ref,count|
  puts "%s: %s" % [count,ref]

I used to use awstats for this, but it was too heavyweight and a hassle to set up and keep running. Google Analytics is a no-brainer to use, even though the accuracy isn't as good as parsing Apache logs. At least I get an idea of which of my blatherings people are most interested in.

a new workstation II



some updates about my laptop. i removed lvm and my ‘luks partition’ which seems to work much better now as i don’t have this massive io-wait issues anymore.

  • i’ve tried several schedulers: ‘noop anticipatory deadline cfq‘ but none did the trick. it seems the issue is somewhere else. i’ve made some benchmarks but i did not find the file where i stored them ;P
  • compiling ogre 3d 1.7rc1 crashed my computer a few days ago, maybe 2gb ram are not enough and/or my linux installation is somehow broken or a driver isn’t done right – i did not find out what causes that yet
  • compiling big packages in general often results in massive swapping which will shut down firefox (with probably 20tabs) soon and sometimes it kills xdm as well – does not happen too often
  • but i still use xfs and i did not have any further data loss although, coming to the next problem
  • my laptop crashes on ever 4th resume cycle and i have to ‘force power off’ with 5seconds pressing the pwr button this is because of nvidia.ko, i’m currently using: x11-drivers/nvidia-drivers-190.53-r1
  • the quality of the nvidia proprietary driver is currently very low and ….. yes you know the story
  • i tried to enable ‘vt’ for experimenting with virtual machines when i suddenly realized that all the issues with the nvidia.ko proprietary driver NOT starting X was caused by enabling this option. after i disabled it (in the bios) X resumed to work. i did not know that this was the cause for X not to start up. also the error logs did not show anything interesting?! strange, isn’t it?
  • since i’m nearly done with the ogre3d stuff i was doing i’m looking forward removing 3d support and experimenting with kms and the open source nouveau driver comming with kernel 2.6.33+
  • all other hardware-components seem to be working pretty well, i can’t complain about anything expect the bad graphic card drivers – i think that is the only proprietary module i’m currently using
  • and i’m not using any kde pim application anymore since they suffer from very low quality (did i mention this already?) for instance they crash, they duplicate my addressbooks, on updates .kde dir (which stores all configs) sometimes is renamed to .kde4 (might be gentoo specific), xfs crashed all my ‘open’ files in .kde about 2 times now. so i’m using psi, thunderbird and firefox which seems to be working.
  • i’m currently on kde 4.3 but i will try 4.4 soon
  • my windows xp migration stopped working, not sure why – probably because my installation of grub. i should probably try to install a more recent windows version since this xp installation requires to set my sata controller into ide compatibility mode (which might be bad?)
  • i’m now using smartd on all my computers, really a nice tool!
  • my sound support sometimes is broken and i can’t use skype for telephoning, also the composition of mics in this laptop somehow does not work well with alsa as i can’t really predict which alsamixer settings makes the mic work and which not. most often it is basically random clicking until something works – welcome to linux audio. also flash sometimes does not work with sound when i use different players to play audio

Making an RPG in Clojure (part one of many?)

What do you get when you combine old-school Final Fantasy-style RPGs with Clojure? Fun times for all. Well, for me at least.

I'm working on a sort of RPG engine in Clojure so I can make my own RPG. Click the thumbnail for a very preliminary video demo (6.5 MB) showing the engine in action.

RPG Demo

All I do in the video is walk around, and eventually start adding random NPCs to the map to test collision detection. Not all that exciting, but I'm proud nonetheless.

To forestall questions, yes I'll eventually post the source code, but no, not yet. It barely works. Just a proof of concept so far.

Right now I can walk around a map while NPCs also randomly walk around the map, not much more. So there isn't much to talk about. But not bad for 4 days and 600 lines of code (one tenth of which is ASCII art... more on that later). Keep in mind that I have no idea what I'm doing.

Collision detection works so people don't walk through walls or each other, and after endless tweaking I got all the animations to be very smooth, even when I add a few dozen NPCs to the map (as I do in the video). The video is a bit jerky but it looks better in person. All of the admittedly poor artwork is also created by myself, thanks to the GIMP and some hastily-read tutorials on pixel art.

It all runs on plain old Swing in Clojure. Here's some of what went right and what went wrong so far.


I've played a lot of RPGs, but I've never programmed a game more complex than Pong. I knew what double-buffering is, and that's as far as my knowledge of game programming went when I started.

My first idea was to use a plain old Swing JFrame. I'd make a bunch of sprites saved as PNG files, read them all in and draw them on the JFrame, as many times per second as I could manage. Then there's some global state to keep track of where everything is. Simple enough.

(PS I have no idea what I'm doing.)


My first version used Clojure agents (i.e. threads) for everything. The game logic was a thread, the renderer ran in a thread, every NPC was its own thread. The world itself was a single ref that all of these agents banged on. So the NPCs would tell the ref "I want to move down one square", another thread might say "Brian just pushed 'left' on the keyboard, so start scrolling the map". The world-ref would kindly oblige while preventing two NPCs from standing on each other or letting the PC walk through the walls.

Clojure is awesome in letting you do this in a completely safe and coordinated way. Everything worked well. But even for the crappy 2D graphics I'm using, all those threads caused way too much lag. I could get a good framerate if everyone was standing still, but if I was walking while the NPCs were walking, I'd get lots of lag. It was even worse on a slower computer.

My best guess is that the reason for the lag was the constant restarting of canceled transactions due to multiple threads trying to edit the world ref 50+ times per second. My sucky 2-core CPU couldn't keep up. It isn't surprising that this failed, in hindsight.


Next, I decided to try out OpenGL. There are multiple options for OpenGL in Java. One is JOGL and another is lwjgl.

I program in Linux, and my video card is ancient. I can barely get OpenGL to work in the best of times. Installing JOGL was a slight chore (Gentoo doesn't even include it in its repo). JOGL is not just a JAR you throw onto CLASSPATH, you need some native extensions, obviously. I got it running somehow, but I wouldn't want to explain to someone else how I did it.

I did get jwjgl to work too, eventually, which was nice. There is a really nice Java 2D game framework called Slick which uses lwjgl. Some good games were created using this, for example Stickvania, which recently hit Reddit recently. I got Slick up and running in short order.

Unfortunately Slick doesn't play nicely with a Clojure REPL. I could build and start a game, but once the game is stopped, it never runs properly again without restarting the REPL. Slick caches images to try to be speedy, and it seems like the cache is either corrupted or destroyed when you close down your game, for one thing. This is not conducive to Clojure REPL-style development, and I didn't want to spend a lot of time fixing it.

Another issue is that I'd really like this game to be cross-platform and available to non-hackers, and the thought of trying to tell the average gamer how to install JOGL or lwjgl was daunting, given the bullcrap I had to go through. Not sure if I can just throw JOGL into a JAR and distribute it, maybe I can, but I didn't want to bother reading about it. Swing on the other hand runs everywhere with no effort.

My main problem is that I know even less about OpenGL programming than I do about Swing, and don't have a month to learn. Back to the drawing board.


It turns out I don't need OpenGL anyways. All I need is program more intelligently. (Did I mention I have no idea what I'm doing?) Instead of dozens of threads, my current (working) version has one thread. It updates the game logic, then renders the game, then waits 10 milliseconds or so, then repeats this (forever).

With the single-threaded version, the logic is actually more complex than the multi-threaded version. Agents and refs were really nice and braindead-easy to work with. But such is life.

Once I learned about keeping track of things in realtime by counting milliseconds instead of counting frames or using timeouts to do logic/render updates, things worked better. (Did I mention I have no idea what I'm doing?) The game loop looks like this now:

(defn game-loop [#^Canvas canvas]
  (loop [last-time (get-time)]
    (let [curr-time (get-time)
          delta (- curr-time last-time)]
      (do-logic delta)
      (do-render canvas)
      (when @RUNNING
        (Thread/sleep 10)
        (recur curr-time)))))

The code to actually start the game, to give you an idea:

(defn start-world [world]
  (let [#^JFrame frame (doto (JFrame. "Game")
                         (.addWindowListener (proxy [WindowAdapter] []
                                               (windowClosing [e] (stop)))))
        #^JPanel panel (doto (.getContentPane frame)
                         (.setPreferredSize (Dimension. REAL-WIDTH REAL-HEIGHT))
                         (.setLayout nil))
        #^Canvas canvas (Canvas.)]
    (doto canvas
      (.setBounds 0 0 REAL-WIDTH REAL-HEIGHT)
      (.setIgnoreRepaint true)
      (.addKeyListener (proxy [KeyAdapter] []
                         (keyPressed [e] (handle-keypress e))))
      (.addMouseListener (proxy [MouseAdapter] []
                           (mouseClicked [e] (handle-mouse e))))
    (.add panel canvas)
    (doto frame
      (.setResizable false)
      (.setVisible true))
    (.createBufferStrategy canvas 2)
    (dosync (ref-set RUNNING true)
            (ref-set PAINTER (agent canvas))
            (ref-set WORLD world))
    (send-off @PAINTER game-loop)))

That's about it for the Swing side of things, aside from scribbling on the Canvas in the render function.

The agent I wrap around the Canvas controls the thread that runs the game loop. The agent helpfully keeps track of any exceptions that happen during the loop, and I can view those exceptions via agent-error, which is handy for debugging.

Note how little code it is to set up a keyboard event handler, thanks to proxy:

    (doto canvas
      (.addKeyListener (proxy [KeyAdapter] []
                         (keyPressed [e] (handle-keypress e))))

A couple lines of Clojure for what would be a lot of senseless boilerplate in Java. Notice how you the keyboard handler calls a normal Clojure function handle-keypress. Clojure / Java interop really is seamless.


My maps are made using ASCII art. (Did I mention I have no id-... never mind.) Here's the code for the test map, for example. Map here is a deftype (available in bleeding-edge Clojure), which takes a map of tiles, a "pad" tile, the map, and then a mask showing walls / tiles where the player shouldn't be allowed to walk. My Map type acts like a Clojure hash-map most of the time, but it also lets me name the fields that all maps should share, and has a proper "type", among other things.

(deftype Map [tileset pad tiles walls]

(def test-map (cache-map
               (Map {\  (tile "ground")
                     \/ (tile "ground-shadow-botright")
                     \< (tile "ground-shadow-left")
                     \d (tile "dirt")
                     \| (tile "wall_vertical")
                     \- (tile "wall_horizontal")
                     \1 (tile "wall_topleft")
                     \2 (tile "wall_topright")
                     \3 (tile "wall_bottomleft")
                     \4 (tile "wall_bottomright")
                     \u (tile "below-wall")
                     \v (tile "below-wall-shadow")
                     \w (tile "wood-floor")
                     \c (tile "cobble")
                     \b (tile "bush")}

                    (tile "ground")

                    ["                 1----2                            "
                     "                 |vuuu|                            "
                     "1----------------4<bbb3--------------------------2 "
                     "|vuuuuuuuuuuuuuuuu/   uuuuuuuuuuuuuuuuuuuuuuuuuuu|<"
                     "|<1------------2               cccccccc d        |<"
                     "|<|vuuuuuuuuuuu|<       d      c      c          |<"
                     "|<|<           |< cccccccccccccc    d ccccccc d  |<"
                     "|<3------ -----4< c                         ccccc|<"
                     "|<uuuuuuu/uuuuuu/ c  1-------2    1------------2 |<"
                     "|<1---2 bcb       c  |vuuuuuu|<   |vuuuuuuuuuuu|<|<"
                     "|<|vuu|< c  d     c  |< 1-- -4<   |<           |<|<"
                     "|<3- -4<bcb       c  |< |vucuu/   3------ -----4<|<"
                     "|<uu/uu/ c        c  3--4< c      uuuuuuu/uuuuuu/|<"
                     "|<  c  dbcb       c  uuuu/ cccc         bcb      |<"
                     "|<  cccccccccccccccccccccccc  cccccccc   c   d   |<"
                     "|<  d        d                     d ccccc       |<"
                     "|<                    1--------------------------4<"
                     "uuuuuuuuuuuuuuuuuuuuuuu/                           "]

                    ["                 xxxxxx                            "
                     "                 x    x                            "
                     "xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
                     "x                                                x "
                     "x xxxxxxxxxxxxxx                                 x "
                     "x x            x                                 x "
                     "x x            x                                 x "
                     "x xxxxxxx xxxxxx                                 x "
                     "x                    xxxxxxxxx    xxxxxxxxxxxxxx x "
                     "x xxxxx x x          x       x    x            x x "
                     "x x   x              x  xxx xx    x            x x "
                     "x xx xx x x          x  x         xxxxxxx xxxxxx x "
                     "x                    xxxx                        x "
                     "x       x x                             x x      x "
                     "x                                                x "
                     "x                                                x "
                     "x                     xxxxxxxxxxxxxxxxxxxxxxxxxxxx "
                     "xxxxxxxxxxxxxxxxxxxxxxx                            "]

This lets me make all of my tiles be simple PNG files with sane names. I could dork around with sprite sheets, but why bother? Emacs or Vim column-editing and overwrite modes make it easy enough to make a map this way. Swing thankfully handles transparency for me if I use PNGs, so it's a no-brainer to make multiple map layers later, which I'll need later. The code for reading in PNGs is brain-dead simple thanks to Java's ImageIO:

(defn tile [name]
  (ImageIO/read (File. (str "img/" name ".png"))))

The cache-map function (below) iterates over the ASCII art (via seqs on the Strings), using each character as a key into the map of real images, and builds a BufferedImage out of it. This is cached, since the renderer needs to re-draw the background every frame. In this function I'm also drawing a "padding" layer to sit under the background, so that I see endless fields of grass when I walk close to the edge of the map, instead of garbled, smeared-out graphical artifacts.

(defn cache-map [amap]
  (let [height (count (:tiles amap))
        width (count (first (:tiles amap)))

        #^BufferedImage img (BufferedImage. (tile-to-real width) (tile-to-real height) BufferedImage/TYPE_INT_ARGB)
        #^Graphics2D g (.createGraphics img)

        #^BufferedImage pad (BufferedImage. (tile-to-real width) (tile-to-real height) BufferedImage/TYPE_INT_ARGB)
        #^Graphics2D padg (.createGraphics pad)]
    (doseq [[y row] (cseq/indexed (:tiles amap))
            [x tile] (cseq/indexed row)]
      (.drawImage padg (:pad amap) (tile-to-real x) (tile-to-real y) REAL-TILE-SIZE REAL-TILE-SIZE nil)
      (if-let [#^Image img ((:tileset amap) tile)]
        (.drawImage g img (tile-to-real x) (tile-to-real y) REAL-TILE-SIZE REAL-TILE-SIZE nil)
        (throw (Exception. (str "Missing tile " tile ".")))))
    (assoc amap
      :map-image img
      :pad-image pad
      :max-map-x width
      :max-map-y height)))

This code is nasty, mostly due to converting between tile-based coordinates and pixel-based coordinates. This code needs to be cleaned up a bit. But that's about the most complex code you'll find in my program so far.

Who needs mutable state?

Clojure is a mostly functional language, in the sense of strongly discouraging unnecessary use of mutable state, and this program is no different. I'm sometimes amazed how far I can get before I need mutable state at all. The vast majority of my functions take a world value (a plain old hash-map) as an argument, and return a new world value after making changes to it. The current state of the world is whatever value is currently in the global WORLD ref.

The render loop grabs a snapshot of the world from the ref on each iteration, and then draws it. Thanks to Clojure refs, the snapshot of the world is guaranteed to be consistent (e.g. no NPC objects in the middle of mutating themselves) and persistent (the world value sticks around as long as the renderer needs it, even if the WORLD ref is changing in another thread). Once it's been drawn, the renderer throws the world snapshot away and it's garbage-collected later.

This all happens around 50-100 times per second in my game, and there's no noticeable lag. So that's a good thing.


That's about it. I'll post the full source code once it doesn't suck as much.

In my opinion, exploring a new area of study is some of the best fun a person can have. It's a flood of information and a surprise every 10 seconds.

Making a game has been like that. There's a huge wealth of knowledge about this kind of programming that I never knew existed. Everything I read on this topic is new to me and fascinating. The saddest(?) part of this whole thing is that I'm going to have more fun programming this game than I usually have playing games I buy in the store.

Posts for Saturday, February 20, 2010

Windows7: Welcome to 1990

Approximately one in twenty times when I try to log on to my work computer (running Windows 7 Professional™), it lags for 2 minutes and then I see this:

Windows 7 crash

That's the Microsoft I know and love. (By "love", I mean the opposite of love.) Just like the good old days. I'm glad my employer bought this computer and I didn't have to spend my own money.

80% of the time on this machine I'm sitting in Virtualbox using Ubuntu, thankfully.

ogre 3d II

some updates about ogre 3d

  • 1.7 will have a samples browser
    i actually do hate the sample browser deployment as well as the concept it does implement. if one uses cmake and forgets to modify the ‘CMAKE_INSTALL_PREFIX’ but afterwars installs the library using ‘DESTDIR=/tmp make install’ nothing will work since all resources.cfg, plugins.cfg and media.cfg contain the wrong location and since the program is installed as root but executed as normal user it fails horribly when starting the SampleBrowser. but more important – since the sample browser loads the plugins as shared objects (for example ./lib/ the samples are degraded as ’showcase’ only but can’t be used to play with directly as it requires a complicated installation mechanism. i see two fixes: either create another CMakeLists.txt which can build standalone runners for each sample or write a standalone runner for this create .so files. but in general i don’t like what they did, it degrades the quality of the samples since you have to run the SampleBrowser, find the plugin you want to have a look at and next you have to search the soure directory for the plugin.
    let’s see how the trolls (authors of qt) did that in comparison: they build standalone examples; they give you the source-code and the binary in one directory; they do code documentation based on a comment system which parses the example code.
  • 1.7 will use cmake for the ogre library (instead of autotools) -> i absolutely love this! this still has some quirks but i think it’s very good work!
  • using ogre disabled ‘key repeat’ every time i start my application, i need to type: ‘xset r on‘ to re-enable it. did not find out why…
    UPDATE: seems to be fixed in 1.7rc1
  • ogre displays a configurator everytime i start my application which configures the ogre ‘ogre.cfg’. this window shows up and since 1.7rc1 i  CAN NOT press ‘return’ directly to continue with the default settings – instead i have to click the ‘accept’ button with the mouse.  every time! this is VERY ANNOYING! maybe this has something todo with my ‘focus widget’ policy but since all other programs on my system work and especially since ogre 1.6 did work that way i wonder why this ‘ogre configuration widget’ does not have focus after i start my application…?
  • freeimage issue: the old ogre 1.6 had devil support but they probably dropped it (i’m not sure about that but i tried to find ‘devil’ in the source code (1.7rc1) but came up with only a few references, most were in the documentation) and therefore one needs freeimage for which i don’t even have an ebuild. so i installed freeimage and afterwards – once again – ogre. i basically compiled and installed ogre a couple of times to find that out – since freeimage is very important and without it no sample works and all you can see is this yello/black textures all over the place and some errors in the log which don’t make much sense without massive googling.
    why does the cmake script not stop with a BIG WARNING: you have samples enabled but freeimage wasn’t found instead the whole library can be built without support for the Media/ archives coming with the samples but then the samples are completely useless.
    not to forget: since ogre installed into /usr/local i needed to alter my /etc/ to reflect the new location (and others) and afterwards i had to run ldconfig as root (this is now done by the ebuild i wrote automatically)
  • i wanted to have a look at the samples (despite of naming them samples instead of examples one thinks they are of help). however all samples share one giant resource system. this might make sense at first however if you – the newcomer – don’t have any clue about unique namespaces in material scripts and textures and compositing of texutres using various vertex and fragment shaders renders the samples are pretty useless because of their complexity.
    i want simple samples which have all they need in ONE folder with a clean structure and NOT having to rely on external files which are referenced in mystical ways.

i’m not the only person who has serious problems getting ogre to work, see [1] and [2]. [2] is exactly what i meant by low quality downstream support.

AND before anyone asked, NO i did not fill any bug tracker. if you like to do that, please feel free to do so. i hate to waste my time using email and ‘gray listening’ , then after i get a login. i’ve filled quite some bugs on bug trackers but as long as they don’t provide a frontend i consider ‘usable’ i won’t fill any bugs anymore. i often don’t even know where to fill the bugs anyway since they have lots of things you have to fill in… waste of time

right now i’m going back to ogre 1.6 since ogre 1.7 gave me this error when compiling my project:

An exception has occurred: OGRE EXCEPTION(5:ItemIdentityException): Cannot find a group named debugger in ResourceGroupManager::isResourceGroupInitialised at /home/joachim/Desktop/projects/space-game/ogre/OgreMain/src/OgreResourceGroupManager.cpp (line 1880)

i have absolutely no clue what could cause this, i did not edit OgreResourceGroupManager.cpp at all. googling didn’t reveal anything and the really nice ppl on couldn’t help me either.

summary: working with ogre 3d does not make much fun currently

nvidia cg support in ogre

actually i did get the cg (nvidia shader stuff) running. i noticed that in plugins.cfg i had*:

why does ogre say:

WARNING: material shader/ring has no supportable Techniques and will be blank. Explanation:
Pass 0: Vertex program shader/gradientVP cannot be used – not supported.

instead of:

WARNING: you disabled cg support by not using any extension so no cg file will work for every use of cg

* this is because we use git and since the project was developed by me the nvidia user and seitz the ati user, he disabled the cg programmanger in his plugins.cfg, i probably updated the file without knowing that

ogre 3d 1.7rc1 ebuild

i’ve writte an ebuild for ogre 1.7rc1, it can be downloaded at [4], i copied some parts from [3] which was very helpful since i never did write an ebuild using cmake before.

i did not check the dependencies and they might probably be incomplete. if you want to use my ebuild you might just install ogre 1.6.5 with all use flags you want and then update to my package without cleaning ‘world dependencies’. also note that using my ebuild all samples will be built but the SampleBrowser binary and some others won’t be installed. i currently don’t understand why but the reason is that CMAKE_BUILD_TYPE=Gentoo is set but the CMakeLists.txt somehow expects CMAKE_BUILD_TYPE=RelWithDebInfo but i wasn’t able to overwrite that value with -D in the ebuild. i’ve asked in #gentoo-sunrise for support and they told me that this probably has to be fixed upstream. also don’t forget to install freeimage!

i did not upload that ebuild to – if you want to, please feel free to do so







2010-02-20: my ebuild does not install the library as well (that is the .so files) so currently everything is built but both the library and the bin/* files are not installed

Documentation about this is in ‘/usr/portage/eclass/cmake-utils.eclass‘. About CMAKE_BUILD_TYPE=Gentoo i’d like to quote the cmake-utils.eclass comment:

# You usualy do *NOT* want nor need to set it as it pulls CMake default build-type
# specific compiler flags overriding make.conf.

My current fix is to overwrite that buildtype with:

CMAKE_BUILD_TYPE=RelWithDebInfo just before src_configure()

NOTE: i’ve also updated the ebuild at [4]

Posts for Friday, February 19, 2010


Handy Exchange 2003 to Exchange 2010 Guide

Just been reading this guide over at and think that anyone who is planning an Exchange 2003 to Exchange 2010 migration should give it a read as it includes some additional steps to take that aren’t included in Microsoft’s Exchange Deployment Tool such as moving the OAB generation to the new server aswell as upgrading the address lists from LDAP filters to OPATH and upgrading Email Address Policies.

Posts for Thursday, February 18, 2010

Protect yourself from Repetive Strain Injury (RSI)

Putting your keyboard where your brain is means that you are a candidate for repetitive strain injury.

You should check out Workrave now. Workrave is a free software available for Windows and *Nix users.

If you are working on a Debian-based system,

sudo apt-get install workrave

Windows users, download [here].

Protect yourself from Repetitive Strain Injury (RSI)

Putting your keyboard where your brain is means that you are a candidate for repetitive strain injury.

You should check out Workrave now. Workrave is a free software available for Windows and *Nix users.

If you are working on a Debian-based system,

sudo apt-get install workrave

Windows users, download [here].

Protect your self from Repetitive Strain Injury (RSI)

Putting your keyboard where your brain is means that you are a candidate for repetitive strain injury.

You should check out Workrave now. Workrave is a free software available for Windows and *Nix users.

If you are working on a Debian-based system,

sudo apt-get install workrave

Windows users, download [here].


It’s the hot topic and we’re all part of it – the Gen Y.

Generation Y was a topic I first touched upon a little over a year ago in early 2009, which was basically a rebellion against this extremist vision provided by ZDNet. While in hindsight it’s true in many aspects it shouldn’t be read without a crapload of salt along with it. Gen Y is a definition spurred and accelerated by technology – and as technology lags, so does Gen Y. This leads to the obvious conclusion of the diversity of the Gen Y. Their impact won’t be negligible and nor will it be a paradigm until the Gen Z come along.

In this case we’re pretty much stuck in the mix – the bridging between the generations to see exactly how the Gen Y see the world. Which may or may not be a bit like this:

(Image credit to XKCD)

It also so happened that I managed to get the opportunity to write an article about this for a multinational, which will understandably have to deal with this as a much more severe problem as it represents a greater number of people in the workforce and each country (like the Indians, Chinese and Americans) will have their sub-cultures. I then decided to share it here, yep, on the thinkMoult blog, in true Gen Y fashion. It’s quite condense (word limit, hey) and assumes the readers have had a good deal of time already looking into the issue. In other words inference and insight is a necessary evil when reading it.

Generation Y have a very different culture and follow different working practices. To put it into context exactly how great this social schism is, just the other day I read a blog post of a relatively young Gen Y – he had never sent snail mail before and was shocked to find out that a stamp cost 55 cents.

With Gen Y entering the workforce daily it’s important to not attribute lack of experience of these practices to incapability but instead to an understandable ignorance. Sooner or later we’ll have to embrace this culture and synergise it with the Generation X practices.

I have had the privilege to observe and participate in a few major and minor open-source projects. For the uninitiated, open-source has its roots in developing software that is both free to use and free to edit, but can be used generically as a way to describe any project where there are no barriers to entry. Anybody can contribute, everybody (ideally) has equal say, and there is no ownership.

Some of these larger projects can be compared to the workings of your average commercial company, except that work is only done in spare time and when people have a personal interest, much like a charity. However unlike most charities, the workforce is built up by a vast majority of Gen Y. This, of course, means that it’s a great way to see how these people think it’s best to run an organisation.

"So, how do you guys create your requirements spec, the concept documents and so on?

Oh, they just write a blog post

This Gen Y organisation is fueled by the internet. They use the internet to recruit, to train, to discuss, to collaborate, to vote, and to organise. Blog posts are how visions and ideas are communicated internally, email discussion lists are used to assign and discuss the smaller details of tasks, chatrooms and instant messaging are used for real-time updates and meetings, editable wikis are used to archive the more common workplace topics, forums are used for customer service, and marketing is all done through social networking.

There are regular “real life” meetings, too – split rather unevenly into three categories: work, marketing, and having a few beers together. However even throughout these meetings are taking place they are routinely documented by all participants in their social networking accounts and respective blogs , aggregated through a “blog planet”, which filters blog posts of all developers based on topic.

From this we should understand the Gen Y dependence on the internet – they don’t write diaries, they write blog posts. Photo albums are served through Flickr. Business is email and keeping in touch is through social networks. The importance of this doesn’t lie in how information is stored but instead on how information can be retrieved – Gen Y expect to have all resources at their disposal at all times. More importantly, they will want to have the choice on how it’s used – if they prefer a chatroom rather than a phone conference, they will express it and use it with others if possible. Trying to tell others to use a social networking system doesn’t work – nurturing a drive to share progress, regardless of the medium, is what Gen Y believe in.

The organisational structure in an open-source organisation is an initiative-driven process. Newcomers watch the communication channels for tasks they have the time and experience to deal with, and over time as they make bigger impacts they gain influence”. This influence gives access to more information and the ability to coordinate others with lower influence. When up to a certain stage a person with a high enough impact will have influence over the entire organisation and whose responsibility is now to communicate a vision and steer the projects. Social inertia prevents constant challenges of power. This system ensures quality control over the products, that all workers are specialised, and is a form of on-the-job training. This causes the Gen Y to have an emotional attachment to the work at hand. It’s important to tap into this as they are all too willing to express it, as long as the environment is conducive.

As much internal information is made as transparent as possible. Anybody is able to edit wikis/online resources, participate in live chatrooms regardless of position but instead due to self-interest, and throw in their comments on social networks. People don’t believe in competition but instead in synergy. This keeps infighting between departments at a minimum and introduces a self-service feel towards getting things done. This likens the mentality of work to a self-service checkout system in a supermarket instead of a cashier, to use an analogy – people attending a self-service checkout have an internal drive to check themselves out as fast and efficiently as possible, but will always do it correctly due to the CCTV above – workers are presented with information and freedom and it is everybody’s responsibility to watch over everybody else.

The Gen Y workforce is incredibly diverse, technologically competent, tied towards a social and transparent environment, but most importantly highly sensitive to ethics. Misalignment of personal goals and company beliefs serves to repel Gen Y workers. They are loud-mouthed at times and will not hesitate to make their views known – with the power of social networking news travels fast and maintaining a reputation for a comfortable workforce environment where views are accommodated is vital. They are unafraid to switch and will do so. In open-source organisations a sign where this isn’t happening is seen where elitism and schisms in the community emerge. The Gen Y focus is always on the future and the possibilities for job development is what keeps them interested.

Technology has served as an accelerator to the generation gap. While the Gen X and the baby boomers have had time to adapt it’s perfectly understandable that the Gen Y are currently a mystery to the upper echelons. With this drastic difference in mentality we should see ignorance with potential where others see incapability – then cross-fertilise through generations as necessary.

For those that made it to the end without sleeping I’d like to recommend to take a peek at Jason Dorsey aka "The Gen Y Guy", who’s cashing in on this hot topic (view the little video bottom right "Jason in action")

Related posts:

  1. Future of the Workplace due to Technology
  2. The state of vendor lock-in on handheld services?
  3. Hello. I hacked the GIS website.

Posts for Wednesday, February 17, 2010


Begun a monthly desktop album – this month we have your standard KDE with a couple widgets and wbar.

Related posts:

  1. KDE – sexier than a Mac.
  2. Langkawi Photos
  3. What say you, Sherlock?


I find life hilarious, really.

This isn’t the first time I’ve made that outrageous claim but I really, really do. I do so much that I want to write about it.

A random stroll down the street at 6AM each morning reveals yet another lovely little detail that our crazy synergy has produced. The reason that detail exists? Because we’re often too caught up with trying to comply with these imaginary rules that so-called society has imposed on us. Completely forgetting we’re what defines society we act certain ways around people, do little things for love and big things for money, and often forget who paid for the ticket to the joyride in the first place.

Taking a step back and realising just how comical it is for all these people to comply really opens up a lovely new perspective on things.

To use an example I’d like to talk about a daily (well, weekdays) activity – walking to school. I’m awake sharp at 6AM each day and up even sharper at 6:07AM. I leave at 6:40AM and begin the walk at 6:45AM most of the time. That’s about the point when I stop measuring things in terms of time (yes, it’s amazing not having a watch) and start measuring things in accomplishments and experiences.

It usually begins with trying to get my headphones out and plugging them into my phone. Occasionally I listen to a talk or music but most of the time it’s so that people don’t stare when I start playing the air-drum/guitar/trumpet in the middle of the street. Salute the guards at the guardhouse, tell them my schedule for the morning (you know, they’re paid to just sit there), and wink at the drivers having a chat downstairs. Pass the Japanese mothers and their little children confused between hyperactivity and morning sleepiness and then remember something I forgot to put in my bag.

Screw what I forgot, take a run down the road as a warmup and play chicken with the cars at the first junction (quite an easy feat, not many cars at that time). Exchange nods (and the occasional high five) with Azif the street cleaner and watch the stream of workers miling down the path. Try only to step on the red bricks and check how late (or even early, occasionally!) the bus driver is this morning – use the time until the streetlights extinguish since I don’t have a watch. By this time I’m about the chorus section in the piece of variable genre I’ve made up since winking at the drivers. By that time I’m also by the stretch of road that leads to the Plaza, an area with a few shops and a ridiculous architect who decided spurting water from a leak in the ground was somehow better than a magestic fountain and pond. More about that later, perhaps.

This stretch of road is great – it has everything. It’s got the sleepy 7/11 workers who accidentally set off their own motorcycle alarms, the rhythmic beat of the beginnings of a construction day (say, they have a legal start time don’t they?), the stray dog, the forest (well, close enough if you squint) to the right (lovely split image of nature/urban), the clouds saying hello to a new day, the taxi driver whom I’ve never seen in a taxi, the guard having a smoke behind the voltage box, and the cars realising they no longer need their headlamps. Oh, and the birds too, but they’re more noise than anything. and it’s a bahdum-tsh! Baam bah bah aahhhhh – it’s the climax of the song by the end of it.

Unless of course I see my business teacher walking to school too just ahead of me with his children. Then I just scare them silly by stalking them.

By this time we’re at the Plaza. Now we’re around people we can really have a laugh. You’d find at least a couple people sitting in the most unimaginably uncomfortable positions (well, they look uncomfortable, but you never know) in deep, deep sleep. You should walk through the McDonalds without fail each morning, not to buy anything, but simply because it’s half a minute faster walking through than around (I know, I timed it long ago). You want to know why the first hash brown of the day tastes like the sort of deep-friend chicken skin somebody’s left overnight? Want to know why the free newspapers pile is always empty? Want to know why McDonalds switched from ketchup packets to a self-service watchamathing? It’s hilarious.

Then you leap down the wrong escalator (they haven’t been started yet) and meet that security guard I’m almost sure is gay. It’s hard to tell because they don’t speak English very well (neither do I, apparently I’m told), and like most guards he spends most of his time loitering. Loitering with a purpose. However when you shake hands each day and he holds your hand for a bit too long and a bit too close you worry sometimes. But it’s ok because he knows my schedule better than I do at times and a walking agenda is a great tradeoff.

At this stage you get to the set of traffic lights where all the cars who realise that going around the back of the Plaza gets you to where you want at least 3 times faster than the only route that existed before which went for a lovely 3KM loop-the-loop just to get 500 meters away. Not to mention 2 more traffic lights. (honestly, what were they thinking?) Funnily enough you get parents dropping off children here because then you can skip another loop-the-loop when driving back. You also get your physics teacher’s retired husband taking his brisk walk around here. He talks to anybody else who’s white and about his age, and I don’t exactly fit that as far as I know.

The next stretch of road is great, because it features the 13 years consecutive winner of worst-traffic-jam award of the year. It’s great because you’re walking. It also means that in about 2-3 minutes you’ve got to end your piece because you’re about to arrive. In fact, now is the perfect time for an impulse run, to make people think you’ve actually run all the way from home in formal office-wear (and sometimes a green bow-tie, for that matter). (Note: this run may happen for any duration, and may start as early as 6:45) That doesn’t mean the fun’s over though, in fact it’s just begun. Stuffing 1000 adolescents with a P.E. teacher at the head in a school is a recipe for the perfect all-night comedy show.

Guys (and girls), keep ‘em coming. You make my day, every day.

Related posts:

  1. If the auto industry makes cars like Microsoft makes Windows?
  2. Happy 2010!
  3. Hello Planet KDE!


Big Brother Google, hello goodbye.

My name is Dion Moult (Student). I do graphic design, some 3D work, and currently in the middle of a "soon" to be released 3D animated movie. I like programming too and fluent in XHTML, CSS, PHP and MySQL. Web development is my main area of computer expertise …

Given that introduction I lumped a while back at the bottom of this page I’d be lying to say I honestly cared about the majority of things I throw online. Only an idiot wouldn’t appreciate the lack of anonymity of the internet. Perhaps I’m a little paranoid but I don’t like third-party solutions – especially those by Big Brother Google. I like the flexibility and control of my own setups, which is why I run a very lovely cloud-setup with a laughable synchronisation schedule and don’t use Google.

When I say I don’t use Google, I mean it. More or less. I don’t use GMail but instead use my own mailserver with a choice of Horde, Roundcube or Squirrelmail as a webmail client and almost exclusively use mutt and KMail as a main client. I find I get less spam, more compatibility, and of course, flexibility. You don’t need Google Blogspot when you can run your own Wordpress setup on your server. Picasa? Calendar? That’s what your cloud is for. It’s really dead easy. Reader? Use a proper client, not a website. It’s rather easy to boycott their underdeveloped services but the biggie is changing Google search.

With Google’s latest change with their image search it seems as though they completely overlooked third-world countries because I’m not alone in finding it to be the most terrible interface in the world. Nothing loads right, searchings are noticably slower, and it’s a pain to navigate. Anyways at that point I began a discussion with a few friends on how easy it would be to switch away from Google.

A quick peek at the alternatives shows that Google’s web search trumps the competition. Lucky we have Scroogle (SSL). Which provides all the results and none of the videocameras. With SSL, of course. Firefox users may use the Firefox plugin, which adds it to your search bar on the top right of the browser – a few clicks later and it’s your default. A bit more poking reveals another firefox plugin called OptimizeGoogle, which although enhancing Google also allows you to remove some of the identified Google tracking systems and other nonsense like ads.

I’m still poking around for more boycott goodness and would appreciate a solution to their retarded image search interface. It’s also quite refreshing to see the good ol’ alternative search engines that I used in primary before Google really existed. Remember Dogpile?

So, what did you do to stop Google?

Related posts:

  1. Chrome in the Clouds: The Google OS
  2. Google Wave Review
  3. Beware of Google.

Posts for Sunday, February 14, 2010

package managers

i’ve been into package managers for some time and i always wondered why developers have to define dependencies manually and not supported by a program using ‘a syscall interface monitoring all OPEN calls‘ in combination to something like ldd for the built binary.

the idea is pretty simple:

  1. first try to compile the program you want to packet. if all compiles then you probably have installed all required libraries on the system. (i assume PATH and LD_LIBRARY_PATH wasn’t altered).
  2. next create a package as an  ebuild for instance. the ‘configure’ and ‘make’ step can be called by ‘emerge’. emerge could then monitor everything, as
  3. on ‘build time’ of the package all OPEN syscalls are monitored and every single file which is opened (which in theory belongs to a different installed ‘known’ package) is checked for the owner package. a group of packages which the ‘build step’ belongs to is acquired, and
  4. finally after the source has successfully compiled the binary is processed by ‘ldd’ which usually looks like:
    # ldd `which htop` =>  (0×00007fffce0a7000) => /lib/ (0×00007f305f907000) => /lib/ (0×00007f305f684000) => /lib/ (0×00007f305f328000) => /lib/ (0×00007f305f124000)
    /lib64/ (0×00007f305fb64000)
    now every library the binary depends on is expected to be from a specific package (again – which in theory belongs to a different installed ‘known’ package)
  5. finally all this automatically detected dependencies are reported to the package maintainer and one probably could also check the existing dependencies for the package to see if they match.
  6. another important point would be if a package, NO read: if a upstream package is removing support for something which requires an external library, does include a dependency which is not used anymore it could be dropped automatically as well.

i did not test if that would actually work but i can’t think of any issue why it should not.

i’ve had some other ideas as well, if you are curious you can read the article in my wiki [1]. if you want to contribute please don’t use the comment field, just write me an email or ask me for a wiki account and you can change it directly.

my goal is to evaluate a mixture of the concept of ebuilds – everything built from source – with having binary packages combined to a p2p network in both hosting ‘already compiled packages’ as well as a distributed compile farm. currently it’s a mixture of german and english but i might fix that soon. another important goal is to merge package management at some yet unknown point to remove redundant work and to have a common package manager for all linux distribution as well as all other distributaions as mac os x and windows.

spoken in analogies: the same process for building a cross platform package manager is ‘cmake’ for cross platform build system generation which was (or currently is) replacing  ‘autotools’.



Review: Parsing Techniques: A Practical Guide

For Christmas this year, I received a shiny hardback copy of Parsing Techniques: A Practical Guide by Grune and Jacobs. It's a thrilling book, if you want to learn parsing, which I do.

Where most books proceed in a sort of linear fashion, this book teaches parsing in layers. First you learn what a grammar is. Then you learn what it means to parse: what's a parse tree? What's bottom-up vs. top-down? What's a leftmost vs. rightmost derivation?

Next you get some general ideas and methods for parsing, e.g. CYK and Unger, and then you dive into the implementations of parsers (in pseudocode and in C) in great detail. This is about as far as I've gotten so far, before having to go back and figure out what the heck I just read. But it's an interesting progression. Reading the book, I feel like I'm constantly revisiting things I learned a few chapters ago, but this time in more detail. The book kind of does a breadth-first traversal of the world of parsing.

Be warned however: this book is not easy reading. It's dense, heavy on the info, light on the entertainment. Unless you really get a kick of out parsing, this will probably put you to sleep if taken in large doses. But it is a trove of information, and I couldn't put the book down during certain chapters.

In fact there's so much information in this book that it's almost depressing. The bibliography alone takes up 1/4 of the book, and lists 1,500(!) authors. It'd take me a week to read the bibliography, and probably many years to read every book listed there. Parsing could easy consume a lifetime of study, and I'm saddened that I'm probably never going to find the time to master all there is to know. But such is life.

If I had one quibble with this book, it'd be the same quibble I have with most math papers. The notation is horrible. Say what you will about programmers, most of us know that code is written for humans, not for machines, and we give our variables descriptive names. In math it's all single letters variable names.

When the authors of this book run out of single letters, they use letters with bars over them, or bold letters vs. normal typeface letters, or they do things like this:

...whenever a non-terminal A is entered in to entry Ri,l of the recognition table because there is a rule A -> BC and B is in Ri,k, and C is in Ri+k,l-k, the rule A_i_l -> B_i_k C_m_n is added to the parse forest grammar, where m = i + k and n = i + l - k.

This is the first paragraph of a section. Those variables are not mentioned before this sentence. This is certainly not a style of writing that I'm used to reading. It takes me a good dozen tries to understand. (Using lowercase i's and l's right next to each other should be prohibited by law.)

In any case, this book is good. One of my favorite tools has always been Perl-style regular expressions, and I feel like this book has expanded my understanding of how they work. Learning to write a recognizer, learning how things are implemented under the hood, you couldn't ask for a more interesting topic. I can't wait to try writing a toy parser generator or regex recognizer in Clojure once I've solidified my understanding of some of these concepts.

UFOs, or the Joy of Skepticism (part one of two)

One topic I don't write about enough is skepticism and science. It's something I find interesting (in fact something I try to live my life by) but up to now I've never really come up with anything I thought I could write that would be worth reading.

Today I thought of something, so I'd like to remedy this situation. Here is a fun story (part one of two) about strange experiences I've had while flying. It may involve alien spacecraft!

Space aliens!

In this incident, I was on a normal commercial flight somewhere north of Washington state. I like to have a window seat and sit and stare out the window when I fly. Flying is an amazing experience that has never quite worn off for me, and I like to enjoy the sights.

On this flight, as I stared out the window, I saw some kind of orange sphere go whizzing backwards past the window. The plane was well above the cloud line at this point, and the "orb" was between the plane and the clouds, so I knew it wasn't on the ground. I thought to myself that this was very strange, but maybe my eyes were playing tricks. I was looking carefully out the window at this point, when I saw a second, similar orange sphere go flying past (again in the reverse direction of the plane).

How easy, how tempting it would be to say "UFO! Aliens! Experimental government aircraft! Ghosts! Demons! Sasquatch!" Maybe not sasquatch, but still. This thought immediately occurred to me as I sat on that plane. (More on this later.) This is the kind of experience wacky UFO beliefs are made of.

Or maybe not

I'm happy to say this line of thought didn't last long in my mind. The first question I must ask myself is how genuine my experience actually was. What did I really see?

  1. I have no idea how big the orange globules were. It's extremely difficult to judge the size of something in the air if there's nothing close to it for reference. Scroll down a bit and look at the picture of two planes on this site. I don't know if the photo is genuine or photoshopped (yay skepticism) but I don't have much reason to doubt, and you can find many similar photos all over the internet.

  2. I likewise have no idea how fast these things were going. To me they appeared to be going backward, so did everything else, because the plane was going forward at many hundreds of miles per hour. Maybe these things were stationary and the forward motion of the plane made them look like they were going backward. Maybe they were even going forward, but more slowly than the plane. They would still appear to be going backward to me.

  3. More importantly, did I see something that really existed? It's very possible it was a trick of light. Maybe a reflection in my window. Maybe a play of sunlight on the clouds. Interestingly, no one else on the plane seemed to see anything. I didn't ask around, but I didn't hear anyone yell "Oh wow, look!" This leads me to suspect that maybe I was just seeing things that weren't there.

  4. If I did see something real, did I see it accurately? At the time this happened, I was very excited about the plane trip I was taking. It's not hard to imagine that I was so excited as to be distracted. I was also pretty hungry (I never eat when I fly, as a rule); my brain may not have been at full operating capacity.

  5. I also must consider that my eyesight is terrible. (I asked my eye doctor what my vision was once, and he laughed at me and said "blind".) Maybe my coke-bottle glasses caught a reflection. Maybe my sucky eyes see spots sometimes.

  6. Perhaps most importantly, maybe none of what I remembered ever even happened. This was years ago. I am telling this story from memory. Is my memory real? Maybe I did see something, but I'm misremembering important details? Maybe there was only one sphere, not two? Maybe they weren't orange? Maybe I have all kinds of details wrong. Maybe I dozed off for a minute and I'm remembering a dream. I have had dreams before that I later remembered as "real" but that the people involved tell me never happened.

The human mind is a highly fallible piece of hardware and memory is a lossy storage system. A lot of people greatly overestimate how accurate their eyes and their memories are. Eyewitness testimony and anecdote are the least valuable form of evidence, for good reason. The entirety of the scientific method, testability and repeatability of testing, is intended in one sense to make up for the deficiencies of a single human brain. Lots of brains testing a theory lots of times gets us close to answers, but one experience in one brain, even my own, is highly suspect.

But what was it?

Suppose I really did see something, and I really am remembering properly. I have no idea what these things could've been. But I can think of a lot of things more likely than space aliens. "Balloons" is the obvious first guess.

In any case, I'm perfectly comfortable settling on "I don't know". I don't have a need to know. Bad answers are worse than not having answers.

Who cares about this?

This story is important to me partly because of my childhood. As a young child I had a lot of superstitious beliefs, and I was plagued with fear of a lot of silly things. One of those things was UFOs. I slept with my window closed so I couldn't see the night sky, and I never looked up when I went outside at night. I was terrified I'd see something scary in the sky. I had nightmares for years.

I cured myself of this fear by educating myself. I learned that the chance of there being aliens flying around earth is very close to zero. The physics of space travel nearly precludes any such thing from happening. The logic of a bunch of super-advanced beings coming all this way just to poke people up the bums with pointy rods and leave doesn't really make any sense. There is no actual evidence that UFOs are anything other than natural phenomenon, urban myth and the misunderstandings of a gullible public.

One day I read Sagan's The Demon-Haunted World: Science as a Candle in the Dark, which is an awesome book for many reasons, one reason being the serious treatment of "space aliens" by a scientist who apparently would really love them to exist on Earth, but is forced by lack of evidence to say they probably don't.

Sagan makes some excellent points in the book. He mentions for example that many people claiming to be abducted by aliens would contact him and offer to ask the aliens questions for him. Sagan would ask some people to ask the aliens "Should we be kind to other humans?" (and the answer was always "Yes"), and others he would ask to solve unsolved (at the time) mathematical problems like the Poincaré conjecture. It stands to reason that any race of beings advanced enough for interstellar travel would have answers to such mundane mathematical problems. Sadly Sagan never got an answer to the latter question.

In any case, via countless similar little data points collected in my 29 years of life, via a lot of thought and reading the thoughts of others, today I'm no longer afraid of the dark. Science was certainly a candle for me, and continues to be one. As I sat on the plane that day, I enjoyed the puzzle of thinking about what I saw (or didn't see?) and what it could be. I enjoy living in a world without demons.

Part two will follow. It's about rainbows.

Posts for Saturday, February 13, 2010

FCron + Postfix

In the late hours I got FCron and Postfix to work together (problem: stupidity on my part) so I can finally have a nice cron system that reports to my normal (non-root) user's inbox what the system crontab is doing.

Should make my life a lot less hectic now that I mastered how to make tedious repeting tasks a part of what my laptop does for me and not what I should do for it.

...more on FCron to come. Need sleep. Badly...

hook out >> Vancouver over, just bed now...

Exaile: The best Amarok since Amarok 1.4

Like a sad dumb dog who still hopefully visits the grave of his dear, departed master, every once in a while I try Amarok 2 again. Unfortunately, there has been no improvement in usability since the last dozen times I checked.

But have you seen Exaile lately? This is what the bleeding edge version looks like:


It's pretty nice. It's about as close as you can get to a stable, fully-functional Amarok 1.4-ish player nowadays.

Aside from looking good, Exaile is good at handling ID3 tags (a few Japanese tags that Amarok 2 displays as ????????, Exaile displays properly) and it's pretty fast to rescan my collection nowadays, which is nice. It does fairly sane grouping of multi-artist albums under "Various artists". It supports moodbar and song lyrics and cover art fetching and such, if that's the kind of thing you enjoy. It even splits the library display by the first letter of the artist names, just like Amarok 1.4 did, which is awesome.

I did have some problems installing the dependencies (python bindings for webkit?) for some of the plugins, but oh well. I figured it out.

Today I went so far as to install gnome-settings-daemon and gnome-control-center just so Exaile wouldn't look like crap. I use KDE4, and I haven't touched Gnome or any Gnome libs in a few years, so this is saying something.

Mark Kretschmann, an Amarok dev, recently wrote an article about the paradox of choice, in which he said (probably correctly) that being presented with too many options and too many choices end up paralyzing people and making them miserable.

Sorry, but the irony was overwhelming...

Exaile Explained

Amarok2 Explained

I really do believe there's a good program buried somewhere in that mess of controls, desperately wanting to be free.

2nd meeting of FSFE (Fellowship group) Slovenia

Yesterday we held our second meeting of (soon to be) FSFE Slovenia / Fellowship group Slovenia — and it was quite a success.

First for some stats: on the first meeting there were 9 of us, on the second one there were 14, and on the three-day-old mailing list there's already 20 members!

Apart from figuring out that we need a FSFE group and are willing to do it, we already made some sound plans on what we plan to this year and I'm very happy that in the group we have so many experienced people from all sorts of backgrounds.

It's quite late and I sent too much time behind the keyboard today already, so I'll just make it short — bullet-time style!

FSFE Slovenia's plan for 2010:

  • found FSFE Slovenia — start as a Fellowship group, in a few months' time develop a FSFE team from that;
  • Document Freedom Day — we've yet to decide if we want to make it small or already huge in the first year;
  • translate FSFE's site — make a team to translate it;
  • FOSS in schools — promote GNU/Linux and other FOSS to pupils directly and also by collaborating with the profs. There's some pretty good and detailed ideas on how to do that already;
  • Windows/Apple-tax — devise a system (probably via sample e-mails etc.) on how to make Windows- and Apple-tax refunds easy, bring it to the masses and possibly even try to work with the competition and consumer protection offices to solve the problem on the big scale;
  • si2010 — we plan to take apart the national implementation of the EIF and see how much of this strategy has been really implemented and write a report on it. We know this could be the motherload and should therefore be taken under serious scrutiny and would be a terrible mistake to let such an oportunity to leave a mark pass us by!

Personally, I think the plan's is just right — ambitious enough to change something, yet not too big, so it stays managable.

hook out >> maybe Vancouver, most definetly bed...

Posts for Friday, February 12, 2010

Technology ain't everything

Let's discuss can openers.

Growing up, my parents would often invest in electric can openers. These things never worked. Some of them sit robot-like on top of the can and walk themselves around the top while chopping the metal. Some of them were mounted on the wall and you somehow get the can to hang in a harness while the device spins the can around. It takes a PhD and double-jointedness to get the can set up in these devices properly. And then you push a button, a lot of noise happens, and usually the can ends up half-open, half-bent up to the point where it's un-openable short of dynamite.

When I open a can, I use one of these. You jam the metal bit into the can and turn the crank, the can spins in a circle and 10 seconds later, off comes the razer-sharp top. The one I own was probably manufactured in the 1980's and it's still sharp enough to open a can with minimal effort.

Is it really that hard to turn a handle for 10 seconds? Do we really need computer-controlled robotic can-opening devices?

Consider books. I still buy and read all of my books in the form of compressed wood pulp. There are newfangled e-book readers, but I don't want one. Why? Because the only places I read are 1) In the bathtub, and 2) Lying in bed. Taking a computer into the bathtub is generally not a good idea, and holding a Kindle above my head for 3 hours is awkward compared to lying a (3-D) book on the bed beside me with one page bent up so I can read it. (Note: I have dropped a book in the bathtub on more than one occasion, and contrary to my expectations, once it dried it was still perfectly readable, no ink runnage at all.)

I know some day, maybe soon, paper books are going to be gone and we're all going to read books from digital devices. But I like my books. I know there are benefits to having electronic books instead of paper ones. But even though they're a waste of space, even though they can have pages ripped out, even though they can burn up or smudge or age and become brittle, I like paper books better.

Mostly I like paper books because they're simple, analog devices. I don't have to mess with any kind of user interface. Books don't have battery life. Books don't have copy protection. Books don't require me to sign up for user accounts at some website and worry about having an internet connection. I can flip through the pages with my fingers. I can tell how many pages are left by the thickness of the pages that are left. I have actually never comfortably finished a long e-book, not even books about programming, where you'd think the ability to copy/paste code would be a boon. I'll pay good money for a paper copy of a book even if the electronic version is free.

This is probably the most banal thing I've ever written about. But there is such a thing as too much technology. I say this as a person who spends all day trying to get people to use databases instead of keeping drawers full of paper records. Technology for the sake of technology is a waste of time.


Not working for Facebook

In november last year, I was contacted by Facebook HR.
They found my background interesting and thought I might be a good
fit for an "application operations engineer" position in Palo Alto, California. (it is
basically the link between their infrastructure engineering and operations/support
I did a few technical interviews over phone with other app ops and engineers
from CA (about the Linux kernel, lowlevel userspace, mysql, memcached, networking, programming,
scalability, etc) and solved one of their optimisation puzzles.
( I picked usr bin crash. Actually I wanted to do something with thrift but I
couldn't get it to compile
). The technical interviews went well but then I had
another interview which was about handling support. As I have no experience
in setting up support frameworks and procedures to hand off to separate
support teams, I was/am not good enough for this position.

Then they suggested a role as site reliability engineer for the office in Dublin, which is more about
troubleshooting, monitoring and systems management/automation.
So I did some more interviews with SRE's and engineers from the London office and
from Palo Alto. Similar subjects as before, but with more of an operations/support touch to it.
These also went well, except the last one, which was more about things less related to
high-performance/scalability such as nfs, pam and ldap.
I think I missed too many questions on the last interview. I could come up
with some excuses such as me being tired (it was the evening before our Kangaroot showcase event, and
the call being late - Facebook HR messed up a timezone conversion) but fact
of the matter is: I have little experience with such "office ;-)" stuff.

So after 8 interviews over phone (each one about 40-60 minutes), spanning
about 2 months, they let me know they would not go forward with me.
That was late december, I asked for some feedback but haven't heard from
them since.

Bottomline: it sounded quite nice but I'm pretty happy with my current life in Belgium.

"Every person needs a project"

A few weeks ago after lunch my coworkers and me were sitting in the cafeteria of our university and having a post-lunchy coffee. We were basically all just digesting and I actually don't remember what we were talking about but I can remember one quote by my Professor: "Every person needs a project."

For a few weeks this has been at the back of my head now because it kinda fit to some feeling of unrest I had been having lately. Not the kind of unrest that makes you run up walls or buy a motorbike or get your ears pierced, the kind that makes you wanna create. Since I started working out at a local gym (just to stay in shape and to avoid turning into the stereotypical computer scientist) I have found myself with a lot of extra energy that I couldn't get rid of.

"Every person needs a project." I do have projects. I have a relationship. I have this blog. I now have a podcast. I have a dissertation to work on. I have a job. But it didn't seem to be enough, there always seemed to be more.

We live in times of great freedom. There's so much to learn and so much to know and that can, as I wrote about a year ago, become a burden, can become more of a curse than a blessing.

A similar thing is true for being creative. We used to have so many excuses for not creating things: The tools were too expensive. Or you needed other expensive resources. You could spend time writing a story but you wouldn't ever get it published. Nowadays a blog is free and after a while you will find people reading your stuff. You can create images, movies and whatever you can think of and have thousands of people watching it. And again all this freedom can make you freeze.

"Every person needs a project." And I agree. Every person does, there needs to be something that you put your heart into, some tiny, microscopic space within the universe that you change, that you form. That little piece of everything that you focus on to form the world. But it's not all.

Every person also needs a vision. I recently realized that the only people I pity more than those without any project are those without a vision. The German politician Helmut Schmidt, who was German Chancellor for a while, once said: "If you have visions you should go and see a psychiatrist." And that idea has been floating around for a long time. We've been dissing people that said that they are dreaming of something for years. Telling them to "grow up" or "get real".

Because we, as a society, hate visions. Because visions change the world. Because they challenge the status quo. Because it might mean that we might lose the status or position we have. That we might have to adapt.

And where has it lead us? To a world of two extremes: "Robots" and "losers". The "losers" are those not willing or not capable of playing the "make yourself a stupid machine so you are predictable and can be properly used for work", society either laughs at them or treats them even worse threatening them with forced labor and other dehumanizing concepts. The "winners" or "robots" made themselves uncreative so they wouldn't disturb the system.

People aren't machines. People are not just "functional units", they are more than a set of skills or a job description. People are creative and brilliant and a source of unlimited entropy (and that is awesome!). People need their own projects and visions that they follow. There's more than one world, there should be unlimited ones: The one we can call our "shared reality" (however that thing is actually build) and all the worlds that the different people around you want the "real world" to be.

Find a vision. Find a project. In fact, find many. And if you already have something, talk to me, we'll setup a date and talk about it. Let's make the world wonderful.

Planet Larry is not officially affiliated with Gentoo Linux. Original artwork and logos copyright Gentoo Foundation. Yadda, yadda, yadda.