Not a complete list yet ...

    date=“2005-10-22” title=“How to make the LG V9910 region free” tags = [“hardware”, “drm”]

    If you ever get a LG combined DVD/VCR and want to get it region free, look no further than LG RegionFree. Worked like a charm.

    date=“2007-12-21” title=“Acorn” tags =[“software”, “osx”]

    Theocacao: A Look at the Acorn Image Editor: “Acorn is first working example of what I would consider a programmer’s image editor. It has a very ‘objecty’ feel to it — sort of what might happen if Interface Builder was reincarnated as a bitmap tool. If you feel more at home in an IDE than Photoshop, I think you will probably like Acorn.”

    Cool, I purchased Acorn a couple of months ago and now I know why.

    date=“2007-02-23” title=“Exchange Love” tags =[“planning”, “exchange”]

    This is funny if you understand Swedish:

    Funny Exchange Mail

    date=“2008-05-23” title=“Jonathan Ive on Understanding Customers” tags =[“apple”, “product_design”, “jonathan_ive”]

    Jonathan Ive on understanding customers: “‘We don’t have to take this great intuitive leap to understand the mythical concerns of our users, because we are the users.‘”

    That sure helps.

    date=“2008-06-09” title=“Monday Evening” tags =“apple” twitter fail_whale current_status

    Football on BBC’s excellent live streaming service, Stevenote on IRC. Twitter is very much down as expected.

    18 maj 2002

    Blir liksom aldrig inaktuellt.


    1996 revisited

    After receiveing what I believe was the third promotional email from my beloved mobile phone operator, showing this not-so-useful information

    Screenshot of empty email

    I was curious to see what sort of HTML did not even render images in Safari.


    <title>Sista chansen: Specialpris på Telia Mobilt bredband</title>
    <base target=&quot;_blank&quot;>
    <META http-equiv=Content-Type content=&quot;text/html; charset=iso-8859-1&quot;>
    <META content=&quot;MSHTML 6.00.5730.13&quot; name=GENERATOR></HEAD>
    <BODY bgColor=#818177 leftMargin=0 topMargin=0 marginheight=&quot;0&quot; marginwidth=&quot;0&quot;>
    <TABLE height=&quot;100%&quot; cellSpacing=0 cellPadding=0 width=&quot;100%&quot; bgColor=#818177 border=0>
    <TD vAlign=top align=middle>
    <DIV style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 10px; COLOR: #505050; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif&quot;>Ser mailet konstigt ut? <A style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 10px; COLOR: #cf0566; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif&quot; href=&quot;#&quot; target=_blank>Klicka här »</A></DIV><BR>
    <TABLE cellSpacing=0 cellPadding=0 width=590 align=center bgColor=#aaaaa4 border=0>
    <TD vAlign=top align=middle><A href=&quot;;mid=250386&amp;uid=124849854&amp;&amp;&amp;; target=_blank><IMG alt=&quot;Nu höjer vi hastigheten och sänker priset.&quot; src=&quot;; border=0></A></TD></TR>
    <TD vAlign=top align=middle><A href=&quot;;mid=250386&amp;uid=124849854&amp;&amp;&amp;; target=_blank><IMG alt=&quot;Nu höjer vi hastigheten och sänker priset.&quot; src=&quot;; border=0></A></TD></TR>
    <TD vAlign=top align=middle><A href=&quot;;mid=250386&amp;uid=124849854&amp;&amp;&amp;; target=_blank><IMG alt=&quot;Nu höjer vi hastigheten och sänker priset.&quot; src=&quot;; border=0></A></TD></TR>
    <TD vAlign=top align=middle><A href=&quot;;mid=250386&amp;uid=124849854&amp;&amp;&amp;; target=_blank><IMG alt=&quot;Nu höjer vi hastigheten och sänker priset.&quot; src=&quot;; border=0></A></TD></TR></TABLE><BR>
    <DIV style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 10px; COLOR: #505050; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif&quot;>Vill du inte få fler erbjudanden från Telia till denna epostadress, <A style=&quot;FONT-WEIGHT: normal; FONT-SIZE: 10px; COLOR: #cf0566; FONT-FAMILY: Verdana, Arial, Helvetica, Sans-Serif&quot; href=&quot;; target=_blank>klicka här »</A></DIV></TD></TR></TABLE></BODY></HTML>
    <img border=0 width=1 height=1 src=&quot;;sid=124849854&amp;pf_action=View&amp;pf_Link=&quot;>

    Wow - it is like a time machine to 1996. MSHTML did supposedly generate it.

    A Few Tips For Giving A Lecture On Lean

    So, you are about to give a lecture on lean software development? Here are a few tips:

    1. Do not say that the agile movement came out of the dot-com era. Mentioning the Smalltalk community at least once is a plus.
    2. If you name the language that first introduced the notion of object orientation, Simula 67 is a good choice.
    3. Do not say that Winston Royce advocated Waterfall. He didn’t
    4. Do not claim that all US Government work in the 60’s and 70’s was done in a waterfall fashion. Nasa ran iterative projects in the 1960’s.
    5. Understand that most Toyota practices that has been adapted by the software development community are taken from Toyota Product Development System, not Toyota Production System.
    6. If you still intend to do 1-5, do not start the presentation by saying that you are going to correct some misunderstandings about agile.

    Good luck.

    A Fresh View On Printing

    My three year old son just managed to print something of the Backyardigans web site and yelled out “Dad! We got mail!”

    A scary future

    Mathias just sent this video of Boston Dynamics Big Dog. If this is the next level of mechanized warfare, the future will most certainly be scary.

    About Me

    My name is Marcus Ahnve, I live in Stockholm, Sweden since forever with my family.

    I have worked with software development since 1996, mostly creating web based systems. During my career I have worked both as a consultant and in product companies, in roles spanning from backend developer to management consultant.

    After trying pure non-technical roles I have found that I enjoy the technical part of software development too much to let it go. These days I try in my work to mix programming assignments with coaching and speaking, helping teams improve their processes and programming skills.

    I am currently employed as Technical Principal at Valtech Sweden. My job description includes working as a solution architect, training, speaking, helping our sales team with technical sales, and a bit of development.

    These days I prefer to program in Clojure, but I’ve also written a lot of Python and Ruby over the last 8 years. And of course, as anyone exposed to web development, I have also written my share of JavaScript.

    As I have done quite a lot of server setups, I’ve become quite proficient with DevOps technologies such as Docker, Ansible and Terraform.

    I was lucky enough to get started as a Smalltalk developer at IBM, which exposed me early on to what was to be called Agile methodologies. It was only later when I was introduced to Extreme Programming when I realized that we had been doing things differently.

    Having started practicing XP in 2001, I have been very involved in the agile community, and was one of the founders of the Agila Sverige conference in 2008. I still believe that agile methodologies are necessary for a successful product development, but I am also quite disillusioned by what the industry has made out of it. After doing a number of consultancy gigs as an agile coach, I now much prefer to work in development teams, and focusing on actually building something.

    If given a choice, I like to work with Open Source technologies. I run Linux on all my computers, and prefer Arch Linux on the desktop and Debian on servers.

    Agila Sverige 2018

    Skalad agila processer har kommit att bli det sätt som riktiga och bra företag ägnar sig åt seriös och rejäl systemutveckling. Med riktigt många agila team kan man leverera jättemycket kod toksnabbt. Med tydliga processmallar och best practices kan man se till att agila metoder levererar med samma förutsägbarhet som RUP, fast 20% snabbare. Typ.

    Agilt har gått från att vara rebellisk punk till storsäljande men intetsägande arenarock . Jag kommer att ägna 10 minuter åt att förklara hur vi stoppar den.

    Agile Architecture, Design For Replacability

    The most important question to be asked when developing a new software system is “How will we replace it?” It is however a question seldom asked. Instead organization focus on reusability, which unfortunately helps create rigid and inflexible architectures. The talk shows how to design systems made up of small parts, why you should standardize on protocol and not platform and how you will end with a system that is easier to scale and maintain.j

    I gave this talk for the first time at JFokus 2012

    Agile GUI Development

    These days when almost every body is doing the agile thing, there is still one part of the software development process that is missing out - the design of the GUI.

    Too often some snazzy web design studio is brought in, thumb rings and all, to produce mockups in Photoshop. These are then given to the programmers to implement to the last pixel.

    I am sorry, but this is the waterfall process straight up. And it does not help that you implement it page by page or even component by component - that is just dividing the predefined work into smaller bits.

    If you want to be truly agile, bring the usability people into the development process. Have them work iteratively as well in accordance to the stories being implemented, making paper prototypes the first round and refining in the coming iterations.

    Now I can hear all the usability people go “But we need to see the whole picture”. That argument is what everybody has had when resisting the agile change. Remember, project leaders could not do agile development - how could they steer the project if they would not know where the project was going?

    I have full faith in the usability community that they also can make the switch.

    Agile Isn't Punk Anymore, It's Arena Rock

    It was 1979 and the punk movement wasn’t going anywhere. The music was loud, the hairdos were spiky and a majority of the older generation really didn’t get what was happening.

    In order to bring some order to the chaos, Swedish state television, the only one allowed at the time, decided to do a televised concert with what’s now punk legends Ebba Grön.

    While the kids ran a mosh pit on the floor, older people were seated in stands behind. When the music was over a journalist asked the older people, “So, what did you think of this”. It was a weird time.

    Ok, that’s fun, but what has this got do to with anything?

    The way I see it, the agile movement was the punk movement when it came about in the early 2000’s. Early practitioners were in a intellectual moshpit banging ideas against each other.

    Ebba Grön

    The large corporations and existing process vendors were the old people in the stands thinking it was very loud and not at all what they were used to. The initial reaction from the old crowd was denial and resistance, but fast forward to today, the very same organisations have now adapted the term agile, but of course with the mandatory prefix “Scaled”.

    Old People Watching Rock Concert

    When agile became “scaled” in order to work for traditional organisations, it stopped questioning the status quo, it stopped looking for simplicity, it stopped thinking in values and adopted a “best practice” based cookie cutter template approach. In short it stopped being punk rock and became arena rock - rock for people who don’t like rock, adult rock, appealing to enough people that you can fill large arenas.

    In my view “scaling agile” is solving the wrong problem. Agile processes shouldn’t adapt to a dysfunctional organization, it’s the organization that should change to enable change and feedback. Don’t be a band that plays nicer, less noisy music so that the old people in the back likes it. Don’t become arena rock. Stay punk.

    Agile Quitter

    The other day my friend Aslam Khan wrote a post on Facebook about a talk he had held at Agile Africa 2018, and he wrote that this might be his “farewell to the agile community”

    This resonated with me, since I’ve long felt that agile is no longer where I want to be. As much as I still believe in the original premise of agile and like teaching people how to think about undeterministic processes, most companies these days are looking for improvement without doing any meaningful change. Perhaps I shouldn’t be surprised as fifteen years ago agile was still an early adopter business, these days we’re dealing with the late majority and laggards trying to adopt some version of “scaled” agile.

    After a few contacts with it, I do believe that scaled agile is asking the wrong question. Agile shouldn’t adapt to large organizations, large organizations should adapt to agile. Maybe that is happening somewhere, but not where I’ve been.

    I’ve actively turned down agile coaching jobs the last couple of years, instead opting for technical assignments. The last talks I’ve given at agile conferences has been quite critical of the state of the agile community.

    Inspired by Aslam I wrote the Agile Quitters Manifesto. It’s a joke, it’s heavily polarizing, and it needs to be that way.

    I have come to realize that I’ve quit the community and industry that is agile. I will continue to strive for XP style development, build a sustainable workplace and build stuff that’s valuable by whatever measure is important. But I don’t feel like I’m part of the agile community anymore. That party ended a long time ago.

    Agile Smurfing

    Recently I was replying to a post on the Valtech intranet, and tried coming up with a word for what I do as an agile coach. The thing that popped up in my mind was agile smurfing, which I think nails it. As an agile coach I do everything between teaching TDD to solving organizational issues, and since you can exchange every word in the smurf language to “smurf” it just works.

    So, what does an agile smurf look like? Hopefully this is the agile smurf you most often happen upon:

    Agile Smurf

    As we all know, some ten years ago, the original agile smurf was outnumbered by the Scrum smurf:

    Scrum Smurf

    And just a few years later, the Scrum smurfs was joined by the Lean Smurfs.

    Agile Smurf

    Agile Sweden 2008

    After reading Aslaks post on his upcoming conferences it is obvious to me that Stockholm is sorely lacking in the conference space.

    Aslak mentions RubyFools in Copenhagen and Oslo, and Smidig 2008 in Oslo. RubyFools seems to be great, and I know that Smidig was awesome in 2007.

    The only conference I can think of in Stockholm is JFokus, which I hear is very good but Java only. Looking to the whole of Sweden we have Øredev which I always has found too unfocused, and Expo-C which I cannot tell if they exist anymore.

    I guess I have no right complaining if I am not prepared to do anything about it. So, after Smidig 2007 in Oslo, we have had talks within the Agile Sweden network about running a similar conference in Stockholm this spring. And while this is no announcement by any means, I am putting pressure on myself to actually contribute to make it happen by speaking openly about it.

    Look out for Agile Sweden 2008 this spring.

    Agile Sweden Christmas Party

    The Agile Sweden annual christmas party is on Thursday at the Agical office. The evening will kick off with a few lightning talks, of which I am doing one. My talk is titled “The Simplest Thing That Could Possibly Work” and will discuss how XP’s value of simplicity has more or less been forgotten as agile has gone mainstream.

    Agile Tour Kaunas 2017

    So now that everyone and their dog is agile, what really changed? Are we really “delivering more value in less time” as many agile methodologies promise. What do we even mean by value? How do we know when we’ve delivered value? When we’re “done” according to our “Definition of Done”, or when we can validate that a feature is being used by our customers?

    Most organizations that implement agile methodologies mistakenly believe that implementing the process according to spec is the goal. In reality it doesn’t matter how many certifications you have if the product you are building does not meet end users expectations.

    In this I talk about:

    • Why every organization tries to be a factory, and why it is a bad model for software development.

    • Why projects are a mostly bad way to organize software development.

    • Why counting features is not really measuring value, and what to do instead.

    • It doesn’t matter if you’re “done”

    All Your Technology Are Belong To You

    Jonathan Schwartz writes about finance as a technology business > I remember a dinner I had a while back with the CEO of a global financial > services firm. As one of his first acts as CEO, he’d cancelled an enormous > outsourcing contract, and I’d asked him why - his response has stuck with me. > ‘Banking is a technology business. Pure and simple. I can’t win if I don’t have > my own team.’

    Independent of his views on outsourcing, I’ve heard the same point made by many (but not all) financial services executives - banking (like big swaths of telecommunications, media and retailing) has become a technology business, where every ounce of performance and differentiation matters. Even, and especially, in the midst of market turmoil.

    Which is why you should use consultants that can help you improve your game, not play the game for you.

    (Via Jonathan Schwartz’s Weblog.)

    Amphetadesk rocks!

    There has been a lot of talk about news aggregators. Personally I’m using Amphetadesk which does the trick and more. One must know the little secret to using it though. The basic setup works just fine, but the fun starts when you go for this addon which adds expand/collapse of news feeds, time since posting etc.

    And now I'm a ...

    I’m a Chevrolet Corvette!

    image You’re a classic - powerful, athletic, and competitive. You’re all about winning the race and getting the job done. While you have a practical everyday side, you get wild when anyone pushes your pedal. You hate to lose, but you hardly ever do.

    Take the Which Sports Car Are You? quiz.

    Andy Hunt Seminar i Stockholm

    I spent last evening at an Andy Hunt seminar organized by Valtech Sweden. Andy delivered a very good presentation on “How hard can it be” handling the topic of complexity and how we as developers often make our jobs harder than they are. Highly recommended.

    Another Mercurial Convert

    Paul Duncan is another Mercurial convert, and explains his choice of VCS very well

    Any Damn Fool

    Tim Bray is my hero of the day. So many other people would defend their brainchild, especially a world conquering one, in any situation but Tim clearly stands above such behavior.

    Any Damn Fool: “… we designed XML as a document format. When the world gleefully seized upon it as a data-packaging/RPC tool, that was OK, but I doubt you could get any of XML’s original designers to disagree with the statement that JSON, for example, has all sorts of advantages for wrapping up short-lived strongly-typed data.”

    (Via ongoing.)

    Apples and oranges

    Bernard replies to my reply:

    Me: My thoughts were that it is easier to transform bare data as it is less to transform. You take the old data and insert it into the new code, which is all you need because you don’t want the old implementation anyway.

    Bernard: I guess you are somehow comparing apples and oranges. If you want to compare data storage then instead of storing Java objects with data and business logic, just store some objects having data only. Sure, if you store objects with only data you are quite close to the tabular data model. But remember, I only want to be able to “offer” it for OLAP purposes and for upgrades, if then.

    I don’t want to degrade my business objects, I want them to carry as much info as possible. This to ensure that the state is all set and verified before the Command executes, as discussed on the Prevayler site.

    To sum up the upgrade story: when moving an application between version, the persistent state needs to be transformed. The less info in the persistent model, the less to transform. That is why I, initially, believe that the tabular data model is good for upgrades. But as mentioned, I’m intrigued by the XSL approach, and we will most certainly try it out.

    Me: However, we may have to provide a tabular data model for analysis purposes outside the scope of our application. The standard way to access this is using SQL. This is the only reason I want it.

    Bernard: At least if your external application could use JCA you could think of a JCA implementation for Prevayler. Very nice thought. We want to provide as a broad support for data extraction as possible which probably would make a connector a good choice.

    Me: This morning Jon had a good way of formulating what I wrote on the two persistence needs: “RDBMS do two things: OnLine Transaction Processing and OnLine Analysis Processing. After Prevayler we only need OLAP.”

    Agree. This is an empty room for Prevayler. We might have a look at some integration with Mondrian which is rougly a Java OLAP implementation working in-memory. Mondrian looks way cool. Will look into it more.

    Autotest 3.5.0 and Growl

    Autotest 3.5.0 is out, and the result given from Autotest is no longer a String, it’s an array of strings. So if you still want Growl to function properly just modify the .autotest slightly:

    module Autotest::Growl
      def self.growl title, msg, img, pri=0, stick=""
        system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{stick}"
      Autotest.add_hook :ran_command do |at|
        output = at.results.last.slice(/(\d+)\s.*specifications?,\s(\d+)\s.*failures?/)
        if output =~ /[1-9]\sfailures?/
          growl "Test Results", "#{output}", '~/Library/autotest/rails_fail.png', 2 #, "-s"
          growl "Test Results", "#{output}", '~/Library/autotest/rails_ok.png'

    Axis - how bleeding edge can you get?

    I was trying to get my head around Axis and read this:

    Apache Axis2 is built on Apache Axiom, a new high performant, pull-based XML object model that was released two days ago.

    Back On Track

    Whew! I just spent 2,5 hours converting my old B2Evolution blog to WordPress. I have been planning to do this for ages, but I just never got around to it. The idea was to switch hosting providers at the same time but I had a hard time finding something I liked. Then one of the pragmatic guys mentioned TextDrive and that was love at first sight.

    Converting was not that straightforward until I found this. Thanks a lot.


    Var på herrmiddag hos Henrik D igår, otroligt trevligt och makalöst god mat. Dock visar det sig dagen efter att man inte riktigt hänger med som man gjorde förr. Huvudvärken släppte lite lagom när jag var med Ellinor och babysimmade - 30-gradigt vatten är bra för kroppen.

    Blog spam

    My brother just informed me that I’ve been getting a lot of adult referrers. I have to admit my naivite that I was not aware that it even existed.

    I will upgrade b2 so that I can blacklist these sites. I have absolutely nothing to do with them.

    BoosterConf 2017

    A three hour workshop on server provisioning using Ansible, Terraform and Packer

    BoosterConf 2018

    So now that everyone and their dog is agile, what really changed? Are we really „delivering more value in less time“ as many agile methodologies promise. What do we even mean by value? How do we know when we’ve delivered value? When we’re “done” according to our “Definition of Done”, or when we can validate that a feature is being used by our customers?


    The Faint är extremt ojämna, men “Amorous in a Bauhaus Fashion” är grymt bra.

    Building AMI's Incrementally With Packer and Make

    At Qwaya we run our servers in AWS. We build our own base AMI’s in order to ensure a stable base infrastructure and to be able to quickly launch new servers when needed.

    We have a few AMI’s arranged as described in the image below:

    Qwaya AMI's

    • The base image holds all the packages we want installed on all hosts, it sets up docker, logspout logging to Papertrail and [Datadog][datadog] monitoring.
    • The Web and Worker images holds different systemd files for different parts of our application.
    • We use Buildkite for building and deploying, which uses a bring-your-own technique for build servers. We have two kinds, one for building and one for deploying.

    While we really should have our configs in something like Consul, we’re not there at the moment. In order to limit the number of AMI rebuilds, we try to place configs in cloud-init to limit rebuilds.


    We use Make as our build tool to only rebuild the necessary AMI’s after a config change. Normally, Make builds output files from source files which are all local. However, the AMI’s we’re building are of course not local, they’re stored in the AWS cloud.

    Instead we generate a proxy target file locally, one for each AMI, that stores the generated AMI id. This file is then the target for building the AMI.

    Again, AMI are not stored locally, so we need to make sure that the generated AMI id files are available when building AMI’s on other machines. We upload the generated AMI id files to an S3 bucket, and the Make file downloads all them before commencing the build.

    It basically looks like this:

    # Set a variable for each AMI file
    # Set a variable that holds all AMI id files
    # For each AMI id file, declare dependencies and the build command
    $(BASE_AMI_ID_FILE): $(shell find ansible/roles/... -type f) packer/base_ami.json ansible/base_ami.yaml centos_ami base_ami
    # Finally, declare a .PHONY target that downloads the latest AMI
    # id files and builds the AMI's
    amis: get-latest-ami-ids $(AMI_ID_FILES)


    As can be seen in the Make script above, we have a local script that runs Packer. It takes two parameters, the box name to base the box on, and the box name to build. The names map to the AMI id files mentioned above, and the same name is used for the Packer json file.

    # syntax: <from_box> <to_box>
    if [ $# -eq 0 ]
        # No params given, exiting
        exit 1
    mkdir -p ${ami_dir}
    export BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
    export COMMIT_ID=$(git rev-parse --short HEAD)
    # Reading base ami id from ${old_ami_id_file}
    SOURCE_AMI_ID=`cat ${old_ami_id_file}`
    if [ -z ${SOURCE_AMI_ID} ]
        # No source AMI id found
        exit 1
    # Current base ami id: ${SOURCE_AMI_ID}
    export SOURCE_AMI_ID
    # Run Packer to build box ${build_target} using ${build_file}
    # tee the build log to a result file
    packer build ${build_file} 2>&1 | tee ${build_result_file}
    # Check for errors in log file
    if egrep -q 'Non-zero exit status|Error' ${build_result_file}
        echo "Build failed, exiting"
        exit 1
    # Every now and there's a glitch in the AWS
    if grep -q "Build 'amazon-ebs' errored:" ${build_result_file}
        echo "Amazon error in build, exiting"
        exit 1
    # Find the newly created AMI id in the output
    new_ami_id=`cat ${build_result_file} | awk '/^us-east-1/{print $2}'`
    # Writing new ami id ${new_ami_id} to file
    echo ${new_ami_id} > ${new_ami_id_txt_file_path}
    if [ -n "${new_ami_id}" ]; then
        # Updating ${new_ami_id_txt_file} with value ${new_ami_id}
        aws s3 cp ${new_ami_id_txt_file_path} "s3://ami-ids/${new_ami_id_txt_file}" --acl public-read


    We version all of our code using Git and Github. In a new clone of Git, the modification time of all files is set to the time of the clone, not the time they were added to Github.

    This means that on a new clone, all AMI files have the same modification date and all AMI’s are subsequently rebuilt when the build is run. This is normally just a problem when we provision new Buildkite build machines.


    We find this a decent way to build AMI’s that depend on each other. However, building an AMI takes a few minutes, so I would advice against creating large tree structures which would cause a complete rebuild to take hours rather than minutes.

    Building Vim with Ruby on Leopard

    I have had problems compiling Vim on Leopard, and it turns out that the culprit is the built in Mac Ruby. No clue why, but when after port installing Ruby, Vim installs cleanly.

    I guess I’ll have to go with MacPorts Ruby - having a working Vim beats DTrace, however cool it is.

    Bäst just nu

    Caesars Palace första är ju faktiskt vansinnigt bra.

    I wanna smoke crack Because you’re never coming back I wanna shoot speedballs Bang my head against the wall I wanna sniff glue Cause I can’t get over you.

    • “Sort it out”

    Det är ju toppen.


    Curriculum Vitae

    Marcus Ahnve
    Stockholm, Sweden

    Telephone: +46 (0)723 083 083


    I wrote my first BASIC program in 1981 and have worked as a programmer since 1996. I have a long experience writing full-stack software for the web and have written production code in Java, Python, JavaScript, Kotlin, Clojure, Ruby, Smalltalk, HTML, CSS, and SQL.

    I have built and designed applications on various versions of Open Source software stacks based on Linux and databases like PostgreSQL. Since the end of the ‘00s, I have used cloud providers such as AWS, Google Cloud, and Digital Ocean to deliver these solutions.

    I was an early adopter of what was later to be called agile methodologies and was a founder of Agila Sverige, Sweden’s first conference on this topic. As agile grew mainstream and the word lost meaning, I stepped away from agile as an industry. I still work using test-driven development, continuous delivery, and deployment, with an adherence to a well-functioning workplace.

    Work Experience

    2018 - Marcus Ahnve AB

    Independent Software Developer

    Nov 2020 - Consultant at digital health provider

    • Part of team building core services for the backend.
    • Technologies used: Java, Spring Boot, Quarkus, Prometheus, Grafana, Docker, Kubernetes, Helm, Google Cloud Platform

    Oct 2019 - Nov 2020 Consultant at a large media company.

    • Part of the team handling payments for multiple large streaming brands.

    • Technologies used: Java, Vert.x, Spring Boot, MySQL, Kafka, AWS, Docker, Kubernetes.

    • Wrote a React Native app for testing in-app purchase flows.

    Oct 2018- Sep 2019 Consultant at a large logistics company.

    • Designed and developed a solution for tracking the contents of packages.

    • Built prototypes to evaluate product ideas.

    • Technologies used: Java, Kotlin, Javalin, Spring Boot, PostgreSQL, Docker, Google Cloud, Kubernetes, Knative, Pub/Sub.

    2015 - 2018 Valtech AB

    Technical Principal

    • Worked with technical strategy and architecture, internally and externally.

    • Designed a new payment solution for a large online retailer.

    • Helped a large media company design a new data mining solution.

    • Started a transformation to a headless CMS for a large travel company.

    • Information architect for the Swedish Tax Authority introducing headless CMS.

    • Transformation from a monolith architecture to a microservices-based one for global travel company.

    • Teacher in agile methodologies, DevOps automation and Clojure.

    • Involved in pre-sale trying to get assignments with an attractive technical profile for our consultants.

    • Speaker at conferences, talking about architecture, deployment and Clojure.

    2014 - 2015 Qwaya AB


    • Programmer building Qwayas SAAS platforms for advertisers, Qwaya and Funnel. Programming was done in Python, Flask, and Django.

    • Moved existing application from single host deployment to a Docker-based, clustered, AWS deployment. Automated deployment setup using Terraform, Ansible, and Packer.

    • Speaker at meetups and conferences about Docker, ClojureScript and agile architectures.

    2009 - 2014 Valtech AB

    Senior Consultant

    • Tech lead building the new version of a site for economic news. It was built in Ruby on Rails with a sprinkle of JavaScript on top and a PostgreSQL database.

    • Tech lead for a project building internal playlist editor tool for TV schedules. Technologies used included Linux, Ruby on Rails, PostgreSQL Bootstrap, and Backbone. We also used a custom view layer with a Ruby DSL to generate HTML.

    • Management consultant to a leading telecommunications company. Led value stream mapping workshops. Gave courses in agile planning and requirements in Sweden and Finland and coached project managers.

    • Agile process coach to large address catalog company Initially hired to help out with a Scrum process but realized it was not feasible. Initiated a Kanban-based process instead and coached team leads to use it.

    • Teacher in agile project management for project management school

    • Speaker at various conferences and meetups

    2008-2009 ThoughtWorks

    Country Principal

    • Led the effort trying to start a ThoughtWorks office in Stockholm. Work included marketing, sales, and administration.

    • Scrum Master and agile/lean mentor for a large bus company. Adapted the existing Scrum process to the local premises and improved communication between the development team and the client organization.

    2008-2015 Agila Sverige conference


    • Started Sweden’s first agile conference on agile methods

    • Facilitated Open Space

    2007-2008 WeMind AB


    • Responsible for all technology within the company

    • Lead developer for a web-based program for cognitive behavioral therapy helping people with sleeping disorders. Technologies used: Ruby on Rails, PostgreSQL.

    2005-2007 Valtech AB

    Senior Technical Consultant.

    • Internally responsible for agile methodology competency

    • Architect at large Telecom company Began implementation of an agile development process. Developed framework in Java focusing on increased development speed.

    • Tech lead and project manager for a project creating a search service in Java for a Swedish university.

    • Tech lead implementing CMS solution in Java for Swedish university

    2000-2005 Lecando AB


    • Responsible for the development of Lecando product portfolio and technical marketing.

    • Led development team. We were early adopters of XP and building web apps without J2EE

    • Built a product accepted into IBM product catalog

    1999-2000 Sun Microsystems AB

    Java Consultant in Sun Java Center.

    • Built administrative client for LDAP in Java for a telco company

    • Member of the team that built a hybrid mail solution, which became Suns first J2EE reference project

    1998-1999 Enator Objective Management


    • Member of a team building a travel booking system in Java

    • Teacher in Java and object-oriented modeling

    1996-1998 IBM Svenska AB

    IT Specialist

    • Developed administrative client for Swedish social insurance authority in Smalltalk.

    • Teacher in Smalltalk


    • Software development and architecture for web-based systems
    • Agile software development methodology

    Programming Languages

    • Java
    • Kotlin
    • Python
    • Clojure
    • Ruby
    • Bash
    • Smalltalk
    • Go


    • Linux
    • AWS
    • Google Cloud
    • DigitalOcean
    • Docker
    • Ansible
    • Packer
    • Terraform


    1990-1997 Masters degree in Civil Engineering

    Spoken languages

    • Swedish: First language
    • English: Fluent
    • French: Beginner

    Calculated Time

    I took the train home to Stockholm from Skövde yesterday. The train was to my very small surprise late, somehow Swedish trains have a hard time dealing with snow.

    The more interesting thing was how Swedish train company SJ calculates when the late train will arrive at its destination. The train started in Gothenburg, and had continuously become more late as it approached Skövde. But according to SJ, from Skövde and on we would not only start going faster, we would actually be going faster than normal.

    As I found this highly unlikely, I figured it would be fun to follow up and see if the algorithm ever picked up that trains actually were slow today?

    Below is a graph of the first calculated time that SJ presented. We left Skövde 25 minutes late and according to SJ we would make up 15 minutes on the rest of the journey. This included make zero minutes stops at the stations on our way to Stockholm.

    Graph showing first calculated

    As the graph shows we actually continued losing time the rest of the journey. But just like a few project managers I’ve had, SJ’s algorithm insisted on a sometimes ridiculous make up of lost time.

    This is the graph showing the next to last updated timetable. It shows that we should make the last leg in four minutes rather than the 14 minutes it normally takes.

    Graph showing next to last calculated

    Funnily enough, SJ marked the train as “Arrived” when we still were a minute away from the station.

    I found this very analogous to the behavior I’ve seen in a few projects, where time estimates are made to please the recipient rather than to provide actual information. As if I would feel better that SJ “tried” to go faster but couldn’t.

    All I know now is that what they call their “calculated” time is actually “in a Unicorn world” guess.

    Cedric Still Doesn't Get Agile

    Update: Martin Fowler pointed to Jeff Langrs response. It seems Cedric did not give us the full picture. I have edited my post accordingly

    After attending a less than stellar presentation on TDD,Cedric Beust confuses TDD with “Agile” and goes on to tell the world that agile is not good. Let’s have a look, shall we?

    First of all, tests are not specs.  Not even close.  Somebody in the audience was quick to give a counter-example to this absurd claim by using a numeric example (‘how do you specify an exponentiation function with a test?‘)

    I would not use unit tests for specs. Automatic acceptance tests on the other hand is really nice if you have a customer/product owner that will work with you. Now Cedric has previously stated that he does not really care for the labelling of tests (“However, when I write a test, I don’t really care if it’s a unit test or a functional test”) so that of course makes it harder for him.

    And hey, testing an exponentiation function? How about providing test data with given parameters and answers? It would be a prime candidate for a FIT-test by the way.

    Relying on tests as a design specification is lazy and unprofessional because you are only testing a very small portion of the solution space of your application (and of course, your tests can have bugs).

    Why would you only test “a very small portion of the solution space of your application”?

    Tests also fall extremely short of having the expressiveness needed to articulate the subtle shades that a real specification need to cover to be effective.

    This is my main gripe with Cedrics rant. He seems to be completely oblivious to the great emphasis on customer interaction that agile methods make, which promotes a two way dialogue.

    A specification written in a document is a one way communication. Even in high school psychology I learned how much more information was conveyed in a spoken dialogue than in writing.

    This claim is part of a broader and more disturbing general Agilist attitude that is usually articulated like ‘Your code is your spec’, along with some of its ridiculous corollaries such as ‘Documentation gets out of date, code never does’.

    What is so ridiculous with the last statement? I have never been involved in a large scale project where the documentation did not get out date.

    As for the code being your spec: when you have code and documentation, and the latter does not correctly describe the former, it is out of date, which will you trust? And what do you read to know what the real world looks like? Map, meet terrain.

    I am currently getting acquainted with a brand new project that is not even very big, and while I understand Java fairly well, there is no doubt in my mind that for ten minutes I spend trying to understand how a certain part of the application works, a five-line comment would have given me this knowledge in ten seconds.

    Sure, if it is up to date, which you will have to read the code to find out. My general rule: if you feel the need, comment on why the code does what it does if it is not obvious. If you feel the need to comment on what the code does, the code is not clear enough. Refactor until done.

    Very often, Agilists simply forget that their job is to produce software that satisfies customers, not software that meets some golden software engineering scale.

    Again, this is simply ridiculous - all agile methods try to get customers as close as possible to produce just what they want. Anyone even remotely knowledgeable with agile methods knows that.

    Frankly, it takes all of ten minutes to explain Test-Driven Development to a developer who’s never heard of it:  ‘Write a test that fails and doesn’t compile.  Make it compile.  Then make it

    I actually find it quite hard to get developers to grasp TDD; people find testing something that does not exist confusing. This is of course the basis for behavior driven development, but let’s just be happy for Cedric now.

    Some might find it picky, but leaving out ‘refactor’ in the TDD loop tells me that you somehow has not grasped the concept completely. But then Cedric might throw in a comment instead :).

    ‘What should we test now?’ ‘How about:  if we pop an empty stack, we get an exception’ <a bit embarrassed> ‘Mmh, no, let’s not do that’ <hand waving, look down at notes and proceeds while happily ignoring the other raised hands>

    This is quite easy to test, so I do not see why he could not add it. Read Jeffs answer

    Stack s = new Stack();
    try {
      fail("Should not get here");
    catch (Exception e){

    But I am dead sure Cedric knows this , too bad the presenter did not.

    To be honest, I am becoming quite suspicious of Agile practices for that reason:  all the presentations I have attended and books that I have read are always using toy implementations as examples. Stack, List, Money, Bowling…  enough already!

    Ignoring the fact that Cedric again confuses TDD and agile, he does have a point. Too many TDD presentations uses examples that are way too simplistic. They should point out the need of a modular architecture, and the fact that using TDD actually helps you get a clean, high cohesion - low coupling architecture.

    And please, avoid smug and useless answers such as: ‘A lot of the classes I have to test are hard to isolate, do you have any advice regarding mocks?’ ‘Well, if you had started with TDD in the first place, you wouldn’t be having this problem today’.

    It is certainly not a helpful answer, but it is true nonetheless.

    Fundamentally, I am disturbed by the Agilists’ dishonesty when it comes to presenting their arguments.  They offer you all these nice ideas such as Test-Driven Development and Pair Programming but they never – ever – disclose the risks and the downsides.  To them, Agility is a silver bullet that is applicable in all cases with no compromises.

    Just to give one example, “Practices of an Agile Programmer” clearly states that agile is not for everyone.

    The truth is that these practices come at a price, and for a lot of organizations, the price gets high very quickly.  Agile development will never go far if its proponents keep ignoring these organizations and make condescending comments to its members.

    Here Cedric is spot on. Yay!

    I like Test-Driven Development.  I really do, and I’m fortunate enough to work on a project that lets me use TDD most of the time. But the truth is:  at times, I don’t do TDD because implementing a feature quickly is more important than a fuzzy feeling.  And I’m also aware that TestNG is an open source project with less than five developers, all of them on the bleeding edge and aware of the latest advances in software engineering. And this is my main beef with Agilists:  I strongly suspect that most of them are spending their time on open source projects with like-minded fellows, but none of them have any experience what companies whose survival depends on shipping software have to go through to organize huge code bases growing thousands of lines of code every day under the combined push of hundreds of a developers, all with their personal background, education and bias.

    My main beef with people opposing agility is that they basically say that too many of the developers out there are morons who cannot perform unless closely supervised and given clear instructions, and that there is no hope that that will ever change. It is a weird combination of pessimism and elitism

    Now Cedric has a history of not liking agile methods, and that is fine with me. Whatever makes him happy. But his retoric in this case is like watching somebody who does not know karate perform a round house kick - lots of power and effort but misses the target completely.

    Changing from Fig to Docker Compose

    My daily yaourt -Syua led me to realize that fig has been deprecated in favor of docker-compose. Switching however was just a straight renaming exercise. The fig.yml file is now docker-compose.yml, and the command is docker-compose instead of fig

    Choice Is Good

    I was happy to note that Dion Almaer commented on my blog post on Merb. Dion is one of my favorite bloggers/podcasters and I value what he writes highly.

    But I disagree with him on this one. The problem with using Java for web application development was never one of too much choice. In fact, it was because of that choice that Java became a player in the server side market at all. Sun alone never had the answer to what was needed for server side development, instead the open source world stepped in and made incremental corrections.

    The same thing is happening to the Rails world. The core team cannot create a framework that is a one-size-fits-all. The initial Rails proposal is great for a large number of webapps, but it is other things around it like plugins and JRuby that is making Rails a viable choice for all.

    My Java tools of choice was usually Tomcat/Jetty, FreeMarker, iBatis, WebWork tied together with Spring or PicoContainer. What I hated was having some frankensteinian-enterprise-architect-design-by-comittee-lets-not-be-different stack forced upon me with a fullblown J2EE server, EJB’s, Struts or the JSF monster, sprinkled with an Eclipse-only development environment. And I hope dearly that Rails development is not going the same way where people question you on your choice of tools and wonder why you are not using MySQL and TextMate like the rest.

    There is one choice that I do not miss though - directory layout. I am truly happy every time I do not have to choose it.

    Instead of not having to choose, the most important difference I’ve experienced is that Java as a language together with the Servlet/J2EE spec induces a lot of accidental complexity, which is almost non-existent in the Ruby/Rails world. It is that which enables the increased velocity many development teams experience when switching to Ruby.

    Christian Kjellvander

    Inte riktigt vad jag brukar lyssna på men … tokigt bra. Känns lika oundgängligt i varje manlig skivback som Chris Isaac. Manligt vemod som lockar får en att längta till någon odefinierad lägereld med öl och goda vänner. Rekommenderas varmt.

    Client OS

    I looked at the logs for freeroller and realized that 75% of client OS’s accessing it was Windows. This is of course a lower percentage than would be expected from a more generic set of computer users (I assume we’re all geeks here, right :-), but still, 75%.

    I most certainly don’t want to start another Windozesuckslinuxisugly debate, but I was thinking that most sites accessed on freeroller have a strong connection to Java, and often business system Java - as opposed to embedded etc.

    The main competitor to Java as business systems go is of course .NET. How come that 75% of the programmers who have made the Java their choice of programming language use Windows as their operating system? Why are they not preferring .NET?

    Is it that they consider Windows a superior client os, but want the freedom of choice on the server? That they love the Java syntax? Someone else made the choice? Is this a small indication that .NET is a failure? Just curious.

    Up until two years ago I also used Windows as my client os for programming. But then Sun started releasing the JDK’s for Linux at the same time as for Windows and Solaris. I made the switch and never looked back.

    For the sake of it, I’m writing this using Phoenix on Windows on my home machine, which dual boots Win XP and Red Hat 8. I strongly prefer RH8, my wife Windows.

    Close the window

    Eurocard really wants you to close the window. (“Stäng fönstret” is swedish for “Close the window”)

    Eurocard screenshot

    Commenting Functional Tests Comments

    A few nice people commented on my posts on functional tests and suggested a few other alternatives:

    • Canoo Webtest. It’s XML-based which makes it go right out my window. Sorry about that. We are a small company where programmers have to do their share of test time. This means that we are not afraid of code, in fact we prefer it.
    • Jameleon. I had not seen this one, but looking at the tutorial it seems a lot more complex than the stuff we use now.
    • PureTest. This is a very competent scenario recorder/player, and I do like the guys at Minq. But as I stated earlier, recording HTTP will not test your page the way HttpUnit does with JavaScript and all.

    I am truly happy with the way we do it now. We have a base testcase class that provides methods like clickButton(). These methods are implemented as Strategies by both a remote HTTP implementation and a local in-process mock implementation.

    Writing the tests are really easy. All you have to do is:

    public void testLoginWithCorrectNameSucceeds() {
      setFormText("Name", "foo");
      setFormTest("Password", "foo");

    After a while you can start pushing common higher level functions such as login to the base class for easier reuse.

    Since we use a object oriented web API all test fields with labels are rendered in the same way. This means that we can find the form by the labe which is a good thing, since it eliminates the need for artificial id’s.

    Connecting to a database From IntelliJ Running in WSL2

    I’m running Intellij inside Ubuntu on WSL 2, and today I had problems connecting to a database. It would connect randomly and then quickly lose connection. It turns out that the problem was with the way that IntelliJ stores passwords. When running in Linux, IntelliJ uses the Gnome Keyring, which I did not have running. The quick solution to the problem was to switch IntelliJ’s password save setting to “Never”.

    I probably should invest some time in setting up my zsh files for WSL.

    Connman and DNS

    I’ve been running Connman instead of NetworkManager for a week since it is supposed to be more lightweight. Lightweight is good.

    However, I had really weird problems with DNS, where some hosts wouldn’t resolve.

    $ ping
    PING ( 56(84) bytes of data.
    64 bytes from ( icmp_seq=1 ttl=238 time=44.7 ms
    64 bytes from ( icmp_seq=2 ttl=238 time=44.6 ms
    64 bytes from ( icmp_seq=3 ttl=238 time=44.8 ms
    --- ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2003ms
    rtt min/avg/max/mdev = 44.625/44.755/44.890/0.267 ms
    $ ping
    ping: Temporary failure in name resolution

    We use Outlook 365 at work, please don’t judge me.

    Switching back to NetworkManager solved the problem immediately, so now I can send all those enterprisey emails again. Good times.

    Consultant Profile

    Marcus Ahnve
    Stockholm, Sweden

    Telephone: +46 723 083 083 Email:



    I wrote my first BASIC program on paper in 1981, and I have worked professionally with software development since 1996, mostly creating web-based systems. I have done extensive work with Java, Ruby, and Python but would love to work with Kotlin or Clojure. In general, I favor working with open-source products and frameworks over proprietary solutions.

    As my first professional assignment was a Smalltalk project, I was early on trained in what was to be called Agile methodologies. I have run projects using XP and Scrum since 2001 and am today an active member of the agile community in Sweden as a conference arranger and speaker.

    Notable Assignments

    Nov 2018 - Aug 2019: Software Developer PostNord

    • Built two experimental products in Java on Google Cloud Platform
    • Cloud Run, Kubernetes Engine, and App Engine
    • PostgreSQL used for persistence
    • Pub/Sub to enable asynchronous writes to the database

    Feb 2018 - Sep 2018: Information Architect Skatteverket

    • Designed architecture and API for accessing headless web content
    • Taught differences between legacy web architectures and microservices ones.

    Feb 2018 - Jun 2018: Solution Architect Large Travel Company

    • Designed microservice-based architecture to replace existing legacy software
    • Designed information architecture based on headless CMS transforming existing content

    Mar 2017 - Jun 2018: Solution Architect Large Retail Company

    • Designed new payment solution, replacing existing legacy service dating back to the mid 70’s.

    Oct 2015 - Sep 2017: Presales Consultant

    • Designed solution in presale stage for prospective clients
    • Taught programming and architecture internally

    Feb 2014 - Sep 2015: Developer Qwaya / Funnel, Employee

    • Programmer building Qwayas SAAS platforms for advertisers, [Qwaya][qwaya] and [Funnel][funnel]. Most Programming done in Python.

    • Moved existing application from single host deployment to a Docker based, clustered, AWS deployment. Automated the whole setup using Terraform, Ansible, and Packer.

    • Speaker at meetups and conferences about Docker, ClojureScript and agile architectures.

    Jun 2013 - Jan 2014: Programmer Ongame

    • Developed whitelabel portal for gambling products in Ruby On Rails.

    Dec 2012 - May 2012: Software Architect Mio

    • Assessed ecommerce platforms and architected solution for Mios new online shop.

    Oct 2012 - Dec 2012: Software Developer HSB

    • Solely responsible for building Christmas calendar marketing site integrated with Facebook.
    • Ruby on Rails, PostgreSQL, Facebook, Heroku

    Apr 2012 - Nov 2012: Agile Coach Ericsson

    • Coached two teams in agile methodology as Ericssons GSM division started its transition to a more agile way of working.

    Aug 2011 - Mar 2012: Software Developer Boxer

    • Tech lead for a project building internal playlist editor tool for TV schedules. Technologies used included Linux, Ruby on Rails, PostgreSQL, Bootstrap and Backbone. We also built a custom view layer using a Ruby DSL to generate HTML.

    Jun 2010 - Jun 2012: Software Developer NGNews

    • Tech lead building the new version of [the NGNews site][ngnews] The site is built in Ruby on Rails with a sprinkle of JavaScript on top, using PostgreSQL as database.

    Apr 2010 - Jun 2010: Agile Coach Eniro

    • Agile process coach initially hired to help out with a Scrum process, but realized it was not feasible. Initiated a Kanban based process instead and coached team leads to use it.

    Oct 2009 - Aug 2010: Lean Coach Telia

    • Led value stream mapping workshops, gave courses in agile planning and requirements in Sweden and Finland and coached project managers.

    May 2008 - Oct 2009: Country Principal ThoughtWorks

    • Led the effort trying to start a ThoughtWorks office in Stockholm Worked with all parts including marketing, sales and administration.

    • Scrum Master and agile/lean mentor for larger bus company Adapted the existing Scrum process to the local premises and improved communication between development team and client organization.

    Jan 2008- Jun 2015: Founder Agila Sverige conference

    • Started Sweden’s first agile conference on agile methods

    • Facilitated Open Space

    Feb 2007 - Apr 2008: CTO WeMind AB, Employee

    • Responsible for all technology within the company

    • Lead developer for web based program for cognitive behavioral therapy helping people with sleeping disorders.

    Jun 2006 - Jan 2007: Software Architect Telia

    • Began implementation of agile development process. Developed framework in J2EE aimed to increase development speed.

    Feb 2006 - May 2006: Software Developer Karolinska Institutet

    • Tech lead and project manager for a project creating a search service
    • Java, Oracle DB, Linux

    Sep 2005 - Feb 2006: Software Developer Karolinska Institutet

    • Tech lead implementing new CMS solution
    • Java, Polopoly, Linux

    Sep 2000- Aug 2005: Lecando AB CTO, Employee

    • Responsible for the development of Lecando product portfolio and technical marketing.

    • Responsible for the development of Lecando product portfolio and technical marketing.

    • Led development team, early adopters of XP

    • Built product that was accepted into IBM product catalog

    Jun 2000 - Aug 2000: Architect Posten

    • Developed architecture for Java based web solutions.

    Jan 2000 - May 2000: Java Developer IDP

    • Developed online physical mail solution that became Suns first J2EE reference project
    • Java, Oracle

    Sep 1999 - Dec 1999: Software Developer Europolitan

    • Developed management application for LDAP registry
    • Java, Swing

    Mar 1998 - Aug 1999: Java Developer Bokser

    • Developed online travel booking system
    • Java, Oracle

    Aug 1998 - Feb 1999: Software Developer Core Bank

    • Developer of supposedly reusable banking solution.
    • C++

    Jul 1998 - Jul 1999: Smalltalk Developer Försäkringskassan

    • Developed administrative client
    • Smalltalk.


    • Software development
    • Software architecture for web based systems
    • Extreme Programming
    • Teaching

    Programming Languages

    • Java
    • Python
    • Kotlin
    • Clojure
    • Ruby
    • Bash
    • JavaScript
    • Go


    • Linux
    • Google Cloud
    • AWS
    • DigitalOcean
    • Docker
    • Ansible
    • Packer
    • Terraform


    1990-1997 Masters degree in Civil Engineering

    Spoken languages

    • Swedish: First language
    • English: Fluent
    • French: Beginner

    Continually switching

    After getting the PowerBook, I’ve made quite a few additional switches in my digital life:

    • Mac Mini instead of a PC with Ubuntu Linux at home. After a few weeks with a Mac at work, I could no longer live without one at home, so whoops, there it is: a Mac Mini. It is oh so quiet.
    • NetNewsWire instead of Bloglines. I have not visited my previous darling Bloglines once since I started using NetNewsWire
    • TextMate instead if JEdit, Vi, Emacs … it rocks.
    • iTunes and iPod instead of rsync and iRiver. I’m not addicted - right :)

    Could we please stop using "www"

    Why do so many organizations still demand that you add “www.” in front of their domain name when browsing their site?

    People, it is so 1997. Typing is boring. Stop using it.

    Covenants nya

    Covenants nya dunsade ned för en vecka sedan och har surrat i hörlurarna mycket. De inledande två spåren Monochrome och Call the Ships To Port är briljanta, 6:an We Stand Alone är bra och 8:an We Want Revolution funkar. I övrigt blir det tunt. Det är snyggt producerat och coola ljud men … segt. Som det ofta blir när synthband inte riktigt får till det. Det blir självupptaget, pretto och liksom synth-Hammerfall.

    Dan North: How simple is too simple?

    Dan North: How simple is too simple?: “Kent Beck advises us to do ‘the simplest thing that could possibly work’, but this is often mistaken for ‘the first thing I could possibly think of’ or even ‘the only thing I know’”

    Well put.

    (Via Planet TW.)

    Data, encapsulation etc.

    We’re right now trying out Prevayler as a persistence layer for our products. It is basically the coolest think I’ve seen since I became an OO-afficionado. I did start out with Smalltalk, and it sort of set the tone for what I believe in.

    I need to check out if Jon has mentioned this on his blog. Nope, he hasn’t so I’ll be first then.

    Here we go: What Prevayler basically does is store your object graph in memory, recording every transaction as a serialized Command. Every 24 hrs a snapshot of the full object graph is written to disk and the log is cleared. Crash recovery is performed by taking the latest snapshot and redo all the commands that is deserialized from the log.

    This basically means complete transparency, wow-whiz-bang performance, database independance and a call to your local RAM-dealer for more memory. It is also very reliable, the full package is something like ten classes, meaning very few dark corners for bugs to hide. We’ve tried it in development and yes, it rocks. I could dance the funky AOP-chicken here and tell you how fast it was done since we only removed the OJB interceptor and added a Prevayler interceptor, but I won’t. Seriously, sure, that rocks too, but haven’t we sort of agreed on that by now?

    So what’s the backside? Schema evolution. I’ll save that for a separate post.

    Delphi and JBuilder as role models for Rails development?

    Chatting over a beer with Ola Bini last year, we discussed the possibilities for JRuby. My dream was to run a Ruby IDE on top of JRuby to get a Smalltalk like environment, because Smalltalk is still the best programming environment I have ever used.

    Now that 3rdRail, running on JRuby, is released, should I get my hopes up? Some people are actually very excited about it, but when Delphi and JBuilder are referred to as some sort of pinnacle of development it seriously makes me wonder.


    Från och med idag och till och med december kommer jag att jobba 75%, i praktiken innebär korta dagar utom på onsdagar då jag jobbar fullt. Om någon vill leka med mig och Ellinor på eftermiddagarna är det bara att säga till.

    DevLin 2017

    En praktisk genomgång av verktygen, hur och när man använder dem, där allt körs live.

    Devdays Vilnius 2017

    I will give a workshop on Clojure and a talk on server provisioning using Ansible, Terraform and Packer.

    Different worlds

    I am reading Cal Henderson’s Building Scalable Web Sites. It covers a lot of topics, some of which I am closely familiar with such as version control.

    Cal does however have suggestions for situations I have never been in, in particular I do love this quote from the part on how to handle hardware platform growth: “When you get to the point of having a few thousand servers […]”. Never been there.

    Distributed Version Control

    I just read this article on distributed version control by Ben Collins-Sussman who is a lead developer behind Subversion. If I understand his arguments, he basically says that DVCS is better than centralized VCS, but you probably should not use one since 80% of all developers are too dumbfounded too understand VCS at all.

    I am one of the pretentious, self-righteous and obnoxious fanboys of DVCS. And let me tell you this: the difference between using DVCS and Subversion is on par with the difference in programming in Ruby compared to Java. If you have made the switch you just do not want to go back.

    And finally: We have taught our GUI-guy Martin to use Mercurial. He has limited experience of using VCS’s, but he grasps the difference between commit and push. My face is straight saying this.

    Docker Container Orchestration

    In the first post on how we moved our application to Docker on AWS, I described the reason for us to do it, and how we set up the servers. This post describes how we’ve organized the different Docker containers.

    Container Setup On AWS

    Our setup on AWS looks like this:

    Qwaya AWS Setup

    We use an EC2 load balancer to route traffic to our web hosts. This is an easy way to setup clustering, but you should be aware that EC2 does not allow for any alternative route or html page if no hosts are available. This means that if all instances are down for some reason, the only thing shown is a blank page. This has been a long standing feature request which for some reason hasn’t been implemented yet.

    Linking Docker Containers To Form Pods

    Our web hosts is what has come to be called a pod these days. Every pod consists of two parts, an Nginx container which serves static content and proxies calls to the backend container, which is running our Django app in Gunicorn.

    Now, the vast majority of the static content served by the Nginx container is generated by the Django app. If the Nginx was to host that content itself, we would have to redeploy both containers every time we updated the backend.

    To mitigate this, we use container linking which allows the Nginx container to serve content from the backend.

    The backends Dockerfile exposes the directory with the static content:

    FROM qwaya/our-own-debian:latest
    VOLUME /opt/app/generated_content

    The Nginx server is configured to read from the path

    server {
        location /static {
            alias /opt/app/generated_content;
            expires 24h;

    Finally the docker containers are started, the backend container exposing the volume,

    # systemd config
    ExecStart=/usr/bin/docker run --name backend \
        -p 8000:8000 \

    and the frontend linking to it.

    # systemd config
    ExecStart=/usr/bin/docker run --name frontend \
        --link backend:backend \
        --volumes-from backend \
        -p 80:80 \

    Workers For Asynchronous Jobs

    The workers are responsible for asynchronous jobs, and can be scaled horisontally. Historically on our one server setup, falling behind on the job queue could lead to long periods of catching up. When we launched the new architecture on AWS, we initially started to few workers, and built up a large backlog of jobs. It was a great feeling when we easily solved it by starting 10 additional servers, which worked through the queue in 15 minutes.

    Backing Everything With RDS

    Just to comment on the last piece of the above picture, we use RDS for storage. I can’t say that I love every piece of AWS, but RDS is really great as it makes setting up and managing MySQL or PostgreSQL very easy.

    Docker-compose for development

    In development, we’re running the same setup as above with the exception that we’re using the local filesystem instead. We’re using docker-compose (formerly fig) for this:

    # Database image with an easy to guess password
      image: mysql:5.6
        - "3306:3306"
      - tmp/mysql/:/var/lib/mysql
    # Mailcatcher is awesome for testing mailings.
      image: schickling/mailcatcher:latest
        - "1080:1080"
    # The backend backend, which sets up mappings to the database
    # image. Mailcatcher is also setup as a link and dev
    # configurations point to it.
      image: qwaya/app-backend:latest
        - "8000:8000"
        - DB_HOST=database
        - DB_USER=root
        - DB_PWD=toor
      - databasemaster:database
        - mailcatcher:mailcatcher
        - <filemappings>
      image: qwaya/backend:latest
        - DB_HOST=database
        - DB_USER=root
        - DB_PWD=toor
        - PROCESS_NAME=task
        - databasemaster:database
        - mailcatcher:mailcatcher
      command: <task runner command>
        - <file mappings>
      image: qwaya/app-frontend:latest
        - "80:80"
      # Map to the backend
        - backend:backend
      # Automount volumes from backend
        - backend


    The isolation and composability of containers is really useful, and has helped improve a not so great one server setup without any big changes to the code. Being able to run the very same setup on your laptop as in production is truly awesome.

    The next post will explain how we setup our build pipeline to support the new architecture.

    Domain lost and found

    I accidentally found out that all ahnve.* domains where down today. It has been three years since I last renewed them, so I had forgotten all about it. The big problem was that the contact emails where being sent to an old address, so I never got the warnings I assume GoDaddy sent out.

    According to Feedburner, some people have tried to reach the site and failed, sorry about that. It is all good now. But I got quite a scare as we are about to go on vacation, which will make me internetless.

    And as any good subscriber of the GeekBrief, I used Calis promocode for a 10% rebate - woohoo.

    Don't Be Done

    Don't trust the non-programmers to design systems

    I read an article the other day about a surgeon who said that in order to stay a good surgeon, he had to perform operations on a regular basis. Which sounds quite reasonable right?

    Ponder that the normal thing for experienced surgeons was to not take part in the actual operation. Instead, they analyze the patient and decide what should be done in great detail, creating diagrams explaining the situation.

    The actual surgery is then performed by somebody else, while the surgeon architect at best is standing by in the vicinity, but is probably somewhere else planning the next operation.

    It does not work that way. Why do we in the software industry let people who do not program design systems?

    Early Extreme Programming: The Original Mac Team

    From Revolution in The Valley:

    Instead of arguing about new software ideas, we actually tried them out by writing quick prototypes, keeping the ideas that worked best and discarding the others. We always had something running that represented our best thinking at the time.

    Eclipse is the new Emacs

    It was my colleague Håkan Råberg who coined this the other day. Quite insightful I think. I mean, you can play Tetris in them both.

    Emacs and Firefox on Debian

    I have once again switched browsers, the pendulum is now on the Firefox side. However when I changed my Emacs config to open links in firefox it didn’t work.

    Instead I got the error message “Firefox is already running, but is not responding. To open a new window, you must first close the existing Firefox process, or restart your system.”

    It turned out that I had both the firefox and firefox-esr packages installed, and browse-url-firefox tried to open iceweasel instead of firefox. Uninstalling firefox-esr solved it.

    Emacs and PostgreSQL database names

    Emacs brings REPL-driven development to SQL using sql-mode, so you can have a SQL buffer running and send commands to it.

    Today however sql-mode didn’t show a prompt when connecting to my local dev database. It turns out that sql-mode has a regexp looking for the prompt, which expects the database name to be all alphanumerics for some reason. It seems to be fixed but is not in the version I get from Arch Linux.

    EmacsWiki provides the following fix which works:

    (add-hook 'sql-interactive-mode-hook
                (lambda ()
                  (setq sql-prompt-regexp "^[_[:alpha:]]*[=][#>] ")
                  (setq sql-prompt-cont-regexp "^[_[:alpha:]]*[-][#>] ")))

    English Version of the SLADOS Talk

    I have translated the talk I gave last week at Agila Sverige to English, it’s available here.

    English version of my article on REST vs SOAP

    As I’ve received a few requests for it, I’ve been given permission by my employer Valtech to republish an english version of my article on REST vs. SOAP here at my blog.

    Enterprisey technology stacks

    Almost all large companies I have come across have some standards regarding the technology stack that they are using.

    The main reason behind this is economy, that developers should be able to rotate between projects and that operations should only have to worry about a limited number of software products. Something like that anyway

    However nice this seems, it never delivers on its promise. It is much like the Gantt charts - looks nice, promises a lot, delivers zilch. Not counting the enormous upgrade cost when the whole stack is upgraded after 20 years - COBOL anyone?

    It is like a bakery standardizing on a given type of flour, salt and sugar and keeping all ovens at the same temperature, so that the bakers are familiar with the environment should they start working in another part of the bakery.

    So you have your chocolate cakes baked using the same ingredients as your sour dough bread, and of course the whole thing is a mess. After a while the bakers start changing oven temperatures without telling anyone - not out of rebellion but because they have to. Different cakes are baked in different ways, and software is just the same.

    There is hope though; I was delighted to read this interview with Werner Vogels, CTO of Amazon:

    Developers of our services can use any tools they see fit to build their services. Developers themselves know best which tools make them most productive and which tools are right for the job. If that means using C++, then so be it. Whatever tools are necessary, we provide them, and then get the hell out of the way of the developers so that they can do their jobs.

    That is one man that understands development.

    While writing this, Matt wonders how to get stuff past the acceptance red tape. I have no good answer. Guerilla coding is the insubordinate way. Nagging for a very long time has worked a few times. But I probably lean towards Alistair Cockburns analogy with the old joke:

    Paddy stopped cutting the hedge as the big car drew up beside him and an English visitor enquired, “Could you tell me the way to Balbriggan, Please?” Paddy wiped his brow. “Certainly, sor. If you take the first road to the left… no still that wouldn’t do… drive on for about four miles then turn left at the crossroads… no that wouldn’t do either.” Paddy scratched his head thoughtfully. “You know, sor, if I was going to Balbriggan I wouldn’t start from here at all.”

    Meaning, Matt might be in the wrong place to do what he wants to do.

    Finally - if an organization should standardize on something it should be protocols. HTTP for example. Build it, make it accessible with external API’s, and implement it the way you see fit. Just like Amazon does it. Loosely coupled large grained components the way EJB’s never were.

    Eventum Issue / Bug Tracking System

    Eventum Issue / Bug Tracking System has to be the best kept secret in issue tracking. I might not get out as much as I should, but I had not heard of it until the other day.

    I did spend some time the other day looking at Bugzilla, which we used to use in house before the days of JIRA, to see if they had made any improvements and fixed that god-awful search screen. (They hadn’t)

    In the process, I came across Eventum by chance and since it is a MySQL product I figured it ought to be interesting and installed it on my laptop to give it a go.

    The thing is, I really like it. It has the same power user feeling that Request Tracker has, but is more aimed at a development environment. We are happy JIRA customers at Lecando, but Mike and the guys could definitely pick up one or two things from Eventum. My favorite thing is that Eventum uses colored rows when listing issues to indicate the status of the issue, which really gives you a quick overview.

    JIRA’s icons look nice, but they do not provide a good overview. Look at the ‘Roadmap’ screen to see what I mean.

    Screenshot of JIRA roadmap feature

    Everything You Didn't Know You Have To Know About Software Development

    Famous Leader and Movie Test

    Now - is this good or bad?

    image What Famous Leader Are You? personality tests by image What Classic Movie Are You? personality tests by

    Finally some decent SOA facts

    Given what I have previously written about SOA, I really like these facts.

    First Post!

    This is the infancy of the new site. Whatever brought you here, stay tuned.

    Fit Testing - how to translate it to Swedish?

    I’m spending some time getting into Fit style acceptance testing and I’m liking what I see. My biggest problem so far is translation.

    For all you non-Swedish-speaking out there, most techie lingo gets a very crude translation, basically by not translating it at all and using the english word as is. So a unit test in english is also a unit test in swedish.

    But I’ve bit my tongue at least 10 times today saying “Fit tests” in swedish. Basically by not translating it I’m saying what I believe is considered the dirtiest word in the swedish langauge.

    Any ideas for translations, swedish people out there?

    Fit is a Requirements Tool, Not a Testing Tool

    Mike Ratliff did a very good presentation on Fit/Fitnesse at Valtech Days. While praising the effects it can have on a development project, he also highlighted some of its quirks such as the ones I’ve complained about earlier.

    The main point he made in my mind was when he said that Fit is not a testing tool but a requirements tool. It does not replace your regular acceptance testing tools. According to Mike, the main advantage Fitnesse brings is an increased, and executable, dialogue between customers and developers, and the possibility for customers to work with the spec in a “what if” manner.

    I have been going over that thought for two days now and I think I really like it. And it makes me revalue Fitnesse, I definitely see the value of customers being able to work with the tests dynamically. I might just end up writing a blog post these days titled “Why I like Fit” :).

    For the Fun Of It

    I came upon this awesome TED talk on “Why You Should Make Useless Things” by Simone Giertz thanks to Mikael Pawlo. The talk really resonated with me and articulated thoughts I have had for a long time.

    I learned how to program BASIC from a book 37 years ago, one year before I actually saw and touched a real computer. A few months later I got my first computer, a Commodore VIC20. The first year I had it I didn’t have the tape recorder that allowed me to save my programs. So for a year whatever I did was ephemeral - as soon as I turned of the computer the program was gone. Sort of like a Groundhog Day version of Global Day of Code Retreat.

    Vic 20

    I spent a lot of time in front of my computer, so I became fairly proficient writing small programs for myself, mostly in BASIC but also some 6502 Assembly. And they were all fairly useless, but the exploratory freedom made me learn a lot.

    Over the years I’ve lost the ability to build something just for the fun of it. Even when I’ve done stuff in my spare time it’s been for some sort of practical use - either to learn something new or to finally get started on that startup idea. But Simones talk is a reminder that just simply building something for the fun of it will be a teaching moment, in itself more valuable than what is built.

    Functional Test Updated

    After evaluating the previous named contenders for webtest tools, the winner was … none of them.

    It dawned upon us that the MaxQ way of doing this, ie. recording tests, really is not the way to go, ever. What you’re really doing is testing the server from a HTTP perspective, without testing button clicking and stuff. For example, all hidden fields must be specified at every request. If you have anything Javascript based you still have no clue if this works after having these funtional tests.

    On the other hand, using anything based on HttpUnit actually mimics a webbrowser, so you can click buttons and not have to worry about hidden fields. And yes, Javascript is handled.

    jWebUnit is based on HttpUnit, but it has a rather limited API, for example you cannot find a button by its name to click it. We came to the conclusion that it was easier to build our own API on top of HttpUnit.

    We also decided to implement the same API in a mock implementation á la the way it is described in “Testing XP”. This way functional tests can be run very quickly on development machines and the more time consuming remote HTTP tests are done on the integration

    Functional Testing Revisited

    We have got our functional testsuite working. It currently consists of more than 260 tests doing everything from the simple login to running recorded WebDAV tests and restarting Websphere etc.

    We’ve done it in the way that Testing Extreme Programming prescribes, with collection of methods that are implemented both remotely and locally, running the servlets in-process. The methods are pretty high-level for a very high degree of usability.

    We’ve used HtmlUnit as the basis of our tests, extending it in the high-level methods. It is a great package as it tests the JavaScript too, as opposed to recorded tests that only tests the servers response to a given HTTP request.

    Functional testing

    We are currently in the process of improving our functional testsuite, some might say getting one. I’ve skimmed the JUnit site and have found two alternatives:

    • jWebUnit. It has a really clear and simple syntax which is why I prefer it over HtmlUnit which I prefer over HttpUnit.
    • MaxQ. Recorded Jython scripts.

    I am not really sure what to make of it. The functional test suite must run separately from the rest of the system, which makes it a good candidate for a scripted language. However, being able to use IDEA is always better than any alternative. I am not sure either if recording is a good or bad thing.

    I am leaning towards jWebUnit. You could then easily use JUnitPerf for basic load testing.

    Funniest Thing In A Long Time

    From BOFH:

    “Yeah, academics and beancounters are the worst for this sort of thing. Somewhere in their brain they believe that just because they USE a computer means they’re somehow gifted in that area.” “How?” “Well it’s a bit like the people who had the first flush toilets - They thought they were somehow a plumbing specialist when in actual fact they were just crap dispensers.”

    Funny Foxtrot

    Todays Foxtrot reaches new levels of geekiness :).

    Get Back At Our Politicians


    This is my kind of modern grassroots politics: Use the Internet which they want to control to do to them as they do to us.

    Getting Things Done

    Huge kudos to Mike for hinting about “Getting Things Done”. I’ve only made it to page 75 so far, but it has already resulted in my desk being clean. This is something that no coworker of mine has ever seen. I wonder what the rest of the book will do to me.


    Beställde the VinesGinza. Det visade sig att Ginza kan skicka upp till fyra skivor direkt hem för efterskottsbetalning - så slipper man postförskottet. Strålande.

    Gnome 2.8

    I have been using Gnome 2.8 for a couple of weeks now, and I must say that it is getting really good. Gnome was the first window manager I used when I started using Linux, but I soon became hooked on more lightweight alternatives such as Fluxbox and XFce4, as I did not think that Gnome offered that much to compensate for its relative slowness.

    But since I got my laptop, I have grown tired of having to do everything manually whenever the environment changes. And with the advent of Ubuntu it is really a snap.

    I honestly do think that it is a way better working environment than Windows. It still has a lot to do to catch up with Mac OSX, but when I look at what is happening over at Planet Gnome I strongly believe that they will eventually get there.

    Gnome Panel Applet for Luntbuild

    I’ve created a Gnome Panel Applet to monitor Luntbuild builds. This is basically a spike to try out the Ruby-GTK2 library and the Luntbuild API but it works so I might as well release it.


    Going to JAOO

    I will be at JAOO this year, telling everyone who is interested all about ThoughtWorks Sweden. Last time I went to JAOO was 2001, so I am really looking forward to it.

    I will probably spend quite some time in the ThoughtWorks booth, so come by and say hi. Or beat me in the IT-run which I have signed up for.

    Going to Öredev

    My Friday morning inbox contained an email from Niclas Nilsson asking me to replace him doing interviews for InfoQ at Øredev. It took some planning calls to my wife and booking of babysitting, but now I am good to go.

    I will be interviewing these six gentlemen:

    • Jon Bostrom
    • Walter Bright
    • James Bach
    • Roger Sullivan
    • Luke Hohmann
    • BJ Hargrave

    Let me know if you have any question you would like me to ask.

    Google Apps - Heaven and Hell

    We’re using Google Apps at Re:mind which is really, really great. So great in fact that I wanted to move my private mail there as well. So after setting the domain up, I created the webpage that was needed for domain activation, put it on my server, clicked the “verify my domain”, and got the usual “this may take 48 hours to complete”

    It has now been almost two weeks or something like 300 hours, slightly more than 48. I have sent Google a support email asking what is happening, but I have yet not received an answer. To that mail that is

    You see, today I got this mail:

    Hello Marcus, You’ve been invited to use Google Apps for, but we noticed that you haven’t started using any services yet. To activate Gmail, Google Calendar, Page Creator or the new start page, log in to the control panel with your administrative account. At any time, if you get stuck or if you want to tell us about your experience with this service, you can find more information and get in touch through our help center ( To make room for other domains, we will remove from our system if you don’t activate any of these services in the next two weeks. If you need more time, just click this link: [link] and we’ll extend the deadline to 30 days from now. Alternatively, you can sign up again at a later date when you’re ready to use the service. Sincerely The Google Team

    Now, isn’t that ironic?

    Google Says JavaScript Is A Language For Non-Programmers

    They actually do say that, here in Sweden. In a brochure handed out at SIME07, Google provides a little glossary for the technically challenged, and to my amusement JavaScript is described as follows:

    JavaScript - scripting language for those who are not programmers, in first hand intended for creating web pages.

    The translation is mine. The original text in Swedish: “JavaScript - skriptspråk för de som inte är programmerare, som i första hand är avsett får att skapa webbsidor”

    This is of course a mistake, and my guess is that mistakes like these are inevitable if you have local offices like the one is Stockholm without technical knowledge. I find it funny, but I wonder if Sergey and Larry would laugh if they were to find out?

    Google Talk - it's hackable

    Google Talk is the thing to mention today so why should I be different? I really hope that it catches on, as it is based on Jabber, which is open, meaning hackable without resorting to reverse engineering and hoping that the protocol does not change overnight as is the case with MSN and ICQ for example.

    Presence awareness and IM integration in various contexts can provide some really cool features and is considered a killer feature by IBM in their Workplace product for instance. (A truly crappy piece of software as a whole though)

    Finally that Jabber plugin in CruiseControl might come to real use.

    Google issue solved

    I’ve previously mentioned that I’ve unsuccessfully tried to migrate my personal domain to Google Apps. I also blamed Google for it not working. I was wrong.

    It seems that Textdrive has some nifty Apache security going on which denies the Jakarta HttpClient to connect, returning a “412 - Precondition Failed”. Big thanks to Doug for finding this out.

    Gourmet Web Hosting

    I am trawling for a hosting company and came across this gem of a web page:

    Gourmet Web Host

    The page won’t load at all if Javascript is disabled, has no doctype, won’t render umlauts in Firefox on Mac (and this is Sweden, we actually use them.)

    The final nail in the coffin is that it states “Web hosting for gourmets”.

    Groovy and Ruby

    I cannot help myself from making a small comment on Rick Hightowers post on Groovy vs JRuby. In short he thinks Sun should support Groovy instead og JRuby, because the syntax is familiar to Java programmers.

    To support his case he presents a chart showing language popularity according to job postings. And since Ruby is at the bottom and Java is on the top, Sun should support Groovy. Which by the way is not even on the chart.

    One thing I did recognize was this:

    Comment on Rick Hightowers Groovy post

    Notice that between Java and Ruby/Python there is a wasteland of languages that you will not see running on the JVM in any near future. So if Sun wants to expand the developer base for the JVM (not Java the language), I believe they are making a very wise decision to support the largest languages available to them outside of Java.

    Supporting Groovy would probably be popular among the already converted, but Sun has to appeal to new markets to expand the JVM usage. I believe that is what they are doing.

    Hackers and Painters

    Like so many others, I have read Hackers and Painters by Paul Graham. And, surprise, I find it highly recommendable, like everybody else. The following are a few thoughts about I jotted down while reading:

    • Why, oh why, in the name of mad page flipping are the footnotes placed in the back?
    • I am surprised that Pete McBreen of Software Craftmanship fame is not mentioned - in my opinion they are making the same case against “Computer Science”
    • Contrary to common XP belief Paul Graham favors code ownership. Quite unusual in this day and age, and interesting - I need to reflect on it more.
    • His thoughts on developers needing empathy are spot on. Not only for the end users but also for the later developers. It is also better to tell a developer to see things from somebody elses view and document accordingly instead of having him follow the RUP Deliverable Tablets of Stone without reflection.
    • Hosting your own web application - I wish. Companies today still see the intranet as something that should be inside their own, very physical, walls. And I can’t blame them - at Lecando we run our own JIRA, Confluence, SugarCRM etcetera in house. It hit me though when thinking about this - what would we choose if Atlassian offered a hosted JIRA at a competitive price? What if that was the only way they offered their solution? Would JIRA be developed faster since they did not have to worry about releases and customers maintenance problems, or would they spend that time managing the server park?
    • Paul Graham makes a very strong case for capitalism. Whatever your view on politics - I believe that the starting part of the Wealth chapter describing the difference between wealth and money should be taught to all.
    • The parts about Lisp are quite tiresome. And regarding Perl as a higher level language than Java? Please.
    • With “Partisans of permissive languages ridiculing the other [preventive languages such as Java - my note] as “B&D” (bondage and discipline) languages” Paul Graham wonders what “prevent”-style people say of Perl? At Lecando we normally just say “Perl …” and shake our heads.
    • Paul Graham has a slightly dismissive tone when talking about stuff like object orientation, static typing etcetera which can get on your nerves if you are a Java head.
    • I get the feeling that he sees Java people the way Java people see VB people. Prejudice! :)
    • He suggests that pointy-haired bosses select Java for programming projects. Since I would select Java for many programming project, would that make me pointy-haired?
    • He does explain, perhaps unintentionally, Javas success by emphasizing the importance of existing libraries for a programming language to succeed. Hibernate, Lucene et cetera anyone?.
    • When he mentions the importance of efficiency and the ability to rewrite code I believe he is right. But, I can be dead wrong, I imagine Paul being a Emacs hacker, and if you still only use Emacs, it is sure easier to write code in Python, Ruby etc. But in Java land there is this neat thing called refactoring IDE’s - Eclipse, IDEA and the lot. My problem is that it is hard returning to Emacs after using a code-completing, refactoring IDE like IDEA.
    • I guess I have to learn Lisp to see what the fuss is all about

    Edit: Fixed typos

    Helg igen

    Sådärja, då var det fredag igen. Ellinor har fått feber som endast 1,5-åringar kan så man hade ett litet oroligt värmeelement i sängen i natt.

    Förra veckan var jag i Luxemburg på ett groteskt tråkigt möte. Mötet ramades dessutom in a vad som måste vara Europas tråkigaste och otrevligaste stad. Vart vi än kom lyckades den lokale luxemburgaren få oss övertygade om att vi egentligen borde stannat hemma, men om vi ändå var på plats så kunde han ju ta hutlöst betalt för vad han än ägnade sig halvdant åt.

    Denna vecka har varit en helt vanlig Svenssonvecka med dagis-jobb-dagis. Nästa vecka är som alla vet en högtidsvecka eftersom jag fyller år på fredag. Oskar Lins fyller fyra på lördag dessutom. Stort.


    Har varit ensam hemma med Ellinor i helgen, C har varit i Schweiz på studieresa med jobbet. Fantastiskt lite vad man hinner med egentligen, idag har vi hunnit med storhandling B&W (Jag vet, Coop Forum Sydsydväst eller nåt) på förmiddagen och middag hos farmor på eftermiddagen. Sen sova.

    Nu borde C snart vara hemma, om flyget landat som det ska. Kom just på att det kan ju se på nätet ju - och det hade landat. Bra.

    Vad gjorde man egentligen innan nätet? Dagens studenter måste ha det så mycket enklare roligare. Och så kan de ladda ned all musik de vill ha från nätet om pengarna tryter. Jag antar att “blandband” är ett ord som snart är lika glömt som “stencil”.

    Hidden Desktop Manager Gems

    By accident I stumbled upon the alt-command-O keyboard combination which allows you to move the current window to a given Desktop Manager virtual desktop - or to place it on all of them. Perhaps I haven’t looked hard enough, but I have not seen this mentioned in any documentation.

    This was the only thing I thought was missing in Desktop Manager. I find it really useful for Adium and Skype.

    How To Automigrate the Test Database Using Merb, Datamapper and RSpec

    I am creating a small site using Merb, DataMapper and RSpec, all in all a very enjoyable experience. I did however have problem getting the test database to be automigrated when running the specs, as I am used to in Rails.

    As Google did not help, I turned to #merb on IRC, and got immediate help.

    Two alternatives:

    1. Run rake MERB_ENV=test dm:db:automigrate before running rake specs
    2. Insert DataMapper::Base.auto_migrate! into your spec/spec_helper.rb

    Big thanks to topfunky, afrench and jdempsey for the help.

    How To Fix Vagrant Up Hanging

    Following along the Deploying Rails book, I stumbled immediately when vagrant up hung showing;

    Waiting for VM to boot. This can take a few minutes.

    even though the server in fact had booted ok.

    I found a solution in the mailing list from a Stefano Pallica:

    Boot in GUI mode:

    config.vm.boot_mode = :gui

    Login to the server when booted.

    Edit /etc/rc.local and add the following before exit 0:

    /etc/init.d/networking restart

    Worked for me.

    How to best develop half of a web application?

    At work, the task at hand is extending an existing J2EE based product. This means that half of the .war that is to be deployed is hands-off, and the other half is written by us.

    The problem I am having is how to get a productive environment. Unfortunately the products file organization is a mess, so there is no way to have a version checked into the version control system as it never would survive an upgrade. Also the deployed app needs to be initialized with a lot of data that is - surprise - saved both in a database and on the filesystem, meaning no easy test db setup.

    The developers who have been in the project for a while have used an army of symbolic links to connect the dots, probably inspired by the products overgenerous use of such. But I am not content with what I’ve seen, but I cant really point my finger at what to do. Anyone who has done anything similar?

    How to show you don't get it

    In todays edition of all things gossipy in IT Sweden, aka Computer Sweden, swedish union SIF manages to make complete fools of themselves. They actually attach a physical CD to an ad supposedly containing their latest tv ads. Filmed by famous-in-Sweden director Felix Herngren no less - it says so on the cover.

    SIF just spent a lot of money saying that they basically have no clue how modern communication is done (YouTube comes to mind) or that they from an environmental point of view do not mind some 50 000 cd’s thrown away.

    Howard Lewis Ship Is Funny When Angry

    Bitten by IE once again: “Side note: I talk a lot about the importance of Feedback, that tools should clearly identify problems and guide you to solutions. On a grading scale of A - F, IE would receive the grade take out back and put down like a rabid dog on this issue. And many others.”

    (Via Tapestry and HiveMind.)


    Jag har passerat 33-årsstrecket och är nu riktigt 30-something. Känns förvänansvärt bra. Jag tror att mångas 30-årskriser är helt onödiga, det visar sig att det faktiskt är roligare att vara 35 än 25.

    I am also a ...

    … a talent!

    imageimage You’re a risk-taker, and you follow your passions. You’re determined to take on the world and succeed on your own terms. Whether in the arts, science, engineering, business, or politics, you fearlessly express your own vision of the world. You’re not afraid of a fight, and you’re not afraid to bet your future on your own abilities. If you find a job boring or stifling, you’re already preparing your resume. You believe in doing what you love, and you’re not willing to settle for an ordinary life.

    Talent: 64% Lifer: 23% Mandarin: 49%

    Take the Talent, Lifer, or Mandarin quiz.

    I am really old

    I am actually 53 days older than the universe, I had no clue.

    I never imagined I'd defend Kent Beck.

    Long time, no blog. Too much holiday and managemental duties to keep me away from the development trenches. But I keep up with what others are writing and it has mostly been discussions about code standards and how stupid people think George W. Bush is. Oh, and that really weird C# vs Java thingy.

    But hey presto! Things are living up again! And let’s start of with that good girl Chiara who I enjoy immensely but not necessarily agree with.

    I don’t think Kent Beck has neither the expertise nor the talent to make decisions about how programmers should work.

    Uhhm … how shall I put it … how can I express how much I disagree? When I first was introduced to XP I hated it, since it was shoved down my throat, much the way french geese are fed. Turning point #1 was when I went to, the most excellent, JAOO conference where Kent held a keynote speech. That sort of took my blind hatred away. Then at next years JAOO Martin Fowler had a half-day tutorial in the planning game. My world has not been the same since. We now run our home-grown version of it, pair-programming and all. We twist the idea of the customer on site since we’re a product company, we use JIRA instead of the orthodox way of the cards and a few other things. Oh yeah, we sit down at our morning meetings too.

    The point I’m trying too make is that there in my mind are few people in the world better suited to speak out on developer practices than Kent Beck. He, Martin Fowler and Alistair Cockburn my top three sources of wisdom.

    I think Rickard is an alien!!

    From what I’ve read I wouldn’t be surprised if he thought you were one too ;-)

    I'm going to Javapolis

    I’ll be attending the conference part of Javapolis. Anyone else?

    IBM vs. Amazon

    For the love of software development - what the hell is this about? IBM, anyone?

    IBM vs. Amazon: “ The Internet has been amazingly quiet about IBM’s litigation against Amazon. It feels to me like maybe the biggest Internet story of, well, maybe, ever. I haven’t gone and read the IBM patents yet, because reading patents always depresses me. If the titles mean anything (not always a sure bet), this might mean that IBM has finally managed to figure out how to set up that Internet Tollbooth that we’ve always been afraid of. If you’re interested in ‘Presenting Applications in an Interactive Service’, ‘Storing Data in an Interactive Network’, ‘Presenting Advertising in an Interactive Service’, ‘Adjusting Hypertext Links with Weighted User Goals and Activities’, or ‘Ordering Items Using an Electronic Catalogue’, apparently IBM thinks you need to pay them for the right to do any of those things. If the courts agree with them, it’s time for me to find a new line of work.

    (Via ongoing.)

    IDEA vs Eclipse

    At Lecando we are long time licensees of IntelliJ IDEA. But since Eclipse is free and open source is good, I have given it a serious try in my spare time. After 2 months I’ve returned to IDEA. Much faster, more intuitive and less weird views of everything (“Do you want to switch to the Java view for your Java project?” Uhhm … yes?). As Jon once said: Eclipse is bloat, IDEA is not.

    Eclipse strongest points in my view are incremental compiling and a nice JUnit integration.

    The worst part though: it is slow. Really. If you’re an Eclipse user and don’t agree, try IDEA out and see for yourself.

    Also, I find it not really focused on what is trying to do. It is a Java IDE, but with it’s micro kernel architecture it can also handle your PHP, Python, Ruby and it can be that IDE toaster oven you always wanted. But editing anything else but Java is done in a very basic fashion. JEdit does IMO a better job of being your versatile handle-everything editor.

    IP Expo 2017

    One of the main takeaway points of a microservices architecture is that individual services should be replaceable, scalable, deployable etc. Unfortunately most traditional CMS solutions are modeled as heavy frameworks which are hard to replace and encourages a data model based on “pages” which makes redesign cumbersome.

    In this talk Marcus Ahnve will show how a headless CMS can be used with success in a microservices environment, enabling the promises of replaceability.

    Advantages of a headless CMS includes:

    1. The same content can be made available on several platforms, with simultaneous updates

    2. Increased security as the CMS is hosted on a separate server and site only reads from it.

    3. The content structure becomes more clear when formatting and presentation is done separately.

    4. A more flexible architecture when the backend code is not written and run inside the CMS but uses it as an external service.

    IPhone for sale with extra services

    There is an iPhone for sale on the swedish site Blocket:

    Apple iphone for sale with extra services

    Funny part translated from swedish: “… I can include the telephone number to my friend who helped me unlock it”

    Icebears Out, Polar Bears In

    Aslak reminded me that there is no such thing as an icebear. Tag line changed.

    Intial report from Javapolis

    So I arrived yesterday to Antwerpen, and have just sat through the keynote. It was basically a shameless plug battle between Sun and BEA. The most interesting thing was Bill Roth talking about WebLogic “in the coming years” supporting “languages that might take off”. This is in line with what Jon wrote some time ago. Rails on WebLogic? Could be interesting, if not for no other reason but to gain a wider acceptance for Rails.

    Is Sun making a comeback?

    I am seeing signs in the sky that Sun is making a comeback.

    • Textdrive is switching from FreeBSD to Solaris
    • Rumors that ZFS might be ported to Mac OS X
    • Tim Brays presence and statements on the RoR podcast from Canada on Rails
    • Sun makes smart moves like supporting PostgreSQL

    And not one of them is related to Java.

    It is time to stop listening to James Gosling

    It seems that Sun is using James Gosling to spread FUD regarding any technology that competes with Java. He created Java, and he is a techie and techies have high standards and are always honest - right?

    He came out slinging against Harmony a year ago, and now he is at it again with Ruby and PHP:

    PHP and Ruby are perfectly fine systems, but they are scripting languages and get their power through specialization: they just generate web pages. But none of them attempt any serious breadth in the application domain and they both have really serious scaling and performance problems.

    He is either grossly misinformed or he is making things up. Either way it is time to stop listening. Too bad.

    (Via Loud Thinking.)

    It's been a while

    image reminds me that it has been more than 8 years, or 2932 days to be exact, since I logged in the last time. So I agree with them when they say that a lot has happened since then :).

    JFokus 2018

    This talk will show you how to use provisioning tools in order to automate server setup. Starting from a basic Debian image, we will launch a server on DigitalOcean using Terraform and provision it using Ansible.

    Jag var där

    Jag var där. Jag var där. Jag var där.

    Jag lyckades för många pengar komma över en biljett till “A Night With Martin L Gore”. Och det var värt varenda öre. Nalen är ingen optimal lokal, scenen är låg, men jag hade tur och lyckades få en riktigt bra plats. Jag stod i mitten, sju meter från scenen, samtidigt som Martin sjunger Shake the Disease och In Your Room med endast pianoackompangemang. Hur djävla fantastiskt som helst.

    Det var extremt vanligt att folk sände vidare spelningen via mobiltelefon. Själv vill jag fokusera på konserten, men det är väl kul för den som får lyssna. På slutet av Shake the Disease, som avslutade hela konserten, tog Martin mobilen av en i publiken och sjöng in i den. Undrar om den som lyssnade fattade vad som hände.

    Från och med nu delas världen in i två delar. Vi som var där och ni andra.

    Jag var där.

    Java is the new C

    This could actually turn out to be quite important down the road:

    Writing Solaris Device Drivers in Java: “‘We present an experimental implementation of the Java Virtual Machine that runs inside the kernel of the Solaris operating system. The implementation was done by porting an existing small, portable JVM, Squawk, into the Solaris kernel. Our first application of this system is to allow device drivers to be written in Java. A simple device driver was ported from C to Java. Characteristics of the Java device driver and our device driver interface are described.‘”

    (Via OSNews.)

    Java vs the JVM

    Tim Bray on the JVM being the good part of Java:

    “But the Java language just doesn’t seem like the interesting thing about Java, these days.”

    I wish more Java programmers would agree to this. One of my observations at JFokus the other day was that a lot of people really like Java the language, and are going through hoops to implement their ideas in it.

    Stephan Janssen has created a kick ass new version of in Flex/Air, but he wants to redo it all in JavaFX script, just so that it is Java. Rickard Öbergs new framework for composite oriented programming could be useful, but in my opinion it introduces enough new concepts to qualify for a whole new language. Lipsticking on top of Java makes it feel verbose and clumsy. After a year of Ruby I have very little patience for Java interfaces.

    (Via ongoing)

    Javaforum in Stockholm Wrap Up

    I spent yesterday evening at Javaforum. Ola Bini held a great presentation of JRuby that really showed what can be accomplished today and what we can expect in the future.

    Ola is not only an über hacker, he is a great guy too. When asked what work is done with Ruby in Sweden today, he was kind enough to mention the work we’ve done at Valtech with Rails, which of course got him a well deserved beer later.

    The guys from Interface 21 did a so-so job presenting Spring AOP. I might be biased as I have been in AOP-land and left it, but in my opinion their presentation skills were far better than the actual content.

    During after-beer Ola and I discussed the state of Java and agreed that the greatest part of the Java platform is the JVM. It will most probably survive Java the language and be a platform for a multitude of languages. It was therefore funny to read Mike Bowlers blog post today about exactly the same thing.

    All in all a good evening.

    Javapolis Wednesday

    Javapolis is held in a combined conference center / movie theater complex. This makes for very comfortable chairs, really good audio and no daytime sunlight what so ever. So far the talks I’ve been to have been really good.

    It seems that my problem with wifi jas something to do with size - I can send short emails, but not long. Also, it seems that I have to keep my posts short to get them to my server. This for €20/24 hrs :(

    Javapolis. EJB3 Persistence

    Linda DeMichiel together with Mike Keith again walking us through the new EJB3 API. I must say that I like the idea of the one, true, unified O/R mapping framework. Also providing a decent set of default values id really smart - the table mapping is reminiscent of Rails. I wonder what all the app server vendors think of the fact that it can be run outside of EJB? This is another reason that you most probably can get by with Spring in most cases which really must upset the app server vendors and especially JBoss.

    Javapolis: Access Wifi at the Metropolis

    If you have a Mac and want to use the Proximus wifi at the Metropolis, Safari or Firefox won’t help. I got through using Omniweb.

    Javapolis: Bitter Java Server Faces

    This was another packed session, even though according to raised hands less than 10% of the audience actually uses JSF. Maybe people where there gathering arguments to not use it? The talk was very detailed and I can’t help think that JSF seems to be incredibly complex. One advice to get JSF right was to “avoid HTTP thinking”. That is the exact reason why I don’t like component based web frameworks.

    Javapolis: EJB3

    EJB intro with Linda de Michiel. I remember listening to Linda presenting EJB2 at JavaOne 2000 saying that now they had fixed everything that was wrong with EJB1. I must say that is quite a deja-vu listening to her talking about how EJB3 fixes everything that was wrong with EJB2.

    Javapolis: Java Puzzles

    The first talk I attended was More Java Puzzles with Joshua Bloch and Neal Gafter. While I normally find these kind of questions way too C++-ish (“can you tell what this piece of unreadable code does?“) Joshua and Neal presents it very well. I got four out of eight right by the way.

    Java Puzzles

    Javapolis: Keynote Thursday

    Apart from the RAD race price thingy, Graham Hamilton of Sun presented Mustang and Dolphin, the upcoming Java releases. What cought my interest the most is that Mustang will include Rhino, and Dolphin will provide a completely new byte code format for dynamic languages. Could it be that this is also related to BEA’s future support of “languages that might take off”?

    Javapolis: Mule

    Mule is a very different beast to me. It seems to be a swallow anything messaging bus where you can message anything anywhere using any protocol anytime. It seems really cool - I just wish I knew what to use if for. This is not at all to say that it has no use, it is just me that has not worked with anything similar before.

    BTW: Demos involving messaging are almost always cool.

    Javapolis: Running out of time

    I have 16 minutes left of my prepaid wireless connection, and I don’t feel like paying more for it. I have covered a few sessions for which the amount of text is too much for the network to handle, so I’ll post it when I get home. I’m right now listening to Scott W Ambler who is really an excellent speaker. More on him later.

    Javapolis: Spring Caching

    I’m a little disappointed with this one as I didn’t learn that much from it. As I managed to get one of the coveted seats next to a power outlet i am still here though :).

    Javapolis: Spring Update

    The room was packed when Javaland superstar Rod Johnson presented the new features in Spring 2.0. The new XML tags are quite nice as they reduce the amount of configuration code.

    Rod mentioned that the JPA implementation in Glassfish will basically be TopLink out of the box, making this a truly usable reference implementation.

    Javapolis: WebWork

    This talk had Jason Carreira presenting WebWork. It was good getting information regarding the WebWork/Struts merger straight from the source.

    In the Q&A session, people asked a lot of questions about tool support. This surprises me - why do people find this a necessity? Are people actually like Bill Roth of BEA who said in his keynote that he can’t write XML manually? Of course, he sells tools.

    Javapolis: Wicket

    Wicket provides a really excellent programming paradigm - plain HTML templates, really nice Java and no XML what so ever. My feelings are mixed though, as it is component based with weird URL’s. Also it uses the session by default. I really have to think about this one. I’m not that big a fan of component based web frameworks as I think that they are abtract away too much of the real world of stateless requests and responses.

    Javapolis: XOM Design Principles

    XOM Design Principles with Eliotte Rusty Harold. Eliotte is a very good opionionated speaker. While I do not agree with his view on the topic on humane interfaces, he does present some really good ideas.

    Quote to remember: “One out of three untested lines of code has bugs.”


    Jay-Jay Johanssons “Antenna” är det bästa Pet Shop Boys inte gjort sedan 1992. Klockren melankolisk pop á la PSB:s “Rent” med vissa stänk Portishead går den fullständigt gjuten. Ett impulsköp eftersom jag gillade singeln “On the radio” som klart förtjänar sin plats i lådan.

    Joining ThoughtWorks, Starting Office in Stockholm

    I am thrilled and honored to say that I will be joining ThoughtWorks starting June. Stockholm is the next pin on the ThoughtWorks world map and my job will be heading the operations locally.

    The Stockholm office will initially be manned by me and homeward bound Ola, but we plan to find and attract some of the great talent available here.

    It is really exciting to become a part of the excellent organization that is ThoughtWorks. I have already had the chance to meet quite a few of my future colleagues who all have shown that ThoughtWorks is made up of great people. Thanks for making me feel welcome.

    I am really looking forward to this, it will be hard work and a lot of fun.

    Jon Leaves ThoughtWorks For Google

    Jon is leaving ThoughtWorks to join Google

    Jon is one of the most brilliant people I have been fortunate enough to work with. Congratulations to Google to have hired him.

    Jonathan Schwartz says Sun will continue to support PostgreSQL

    My suspicion that Sun will not continue to support PostgreSQL after purchasing MySQL was unfounded:

    From Jonathan Schwartz blog::

    What happens to your commitment to PostgreSQL?

    It grows. The day before we announced the acquisition, and within an hour of signing the deal, I put a call into Josh Berkus, who leads our work with Postgres inside of Sun. I wanted to be as clear as I could: this transaction increases our investment in open source, and in open source databases. And increases our commitment to Postgres - and the database industry broadly. The same goes for our work with Apache Derby, and our JavaDB.


    Update: Josh Berkus says the the same thing

    Kent Beck on Ruby

    I always knew one day Smalltalk would replace Java. I just didn’t know it would be called Ruby.

    – Kent Beck

    Blaine Buxton links to this quote at ozmmdotorg.”

    (Via Mike Bowler’s thoughts.)


    Tycker att det är förbannat synd att Göran Kropp gick bort. Jag lyssnade på två av hans föredrag nör jag jobbade på Enator och hade förmånen att få möta honom efteråt när han sålde sin bok. En extremt fascinerande människa. Vila i frid.

    Larry: Chuck Norris Facts

    Really funny: A list of facts about Chuck Norris

    (Via Planet Ruby on Rails.)

    Lavalamps in action

    image Lavalamps in action Originally uploaded by mahnve.

    We’ve finally got our act together and got ourselves a pair of lavalamps. They are controlled by CruiseControl and green equals all tests passed.

    When reading about other people doing this, they say that these things need to be turned off every ten hours or so. The only warning notice on ours, bought at Clas Ohlson, says to not drink the fluid - duh.

    Layers Of Complexity

    Layers of Complexity at Smidig 2011

    I am in Oslo for Smidig 2011, where I gave a talk titled “Layers of complexity”. It centers around medium number systems and Cynefin framework in order to provide a model for software development and explain why we cannot use time based measurements in order to improve the process. It also mentions why time estimates are never correct.

    Later today at 18:00 I will give my talk on Taylorism and Mass Production at Oslo XP Meetup. Hope to see you there.

    Least wanted feature of IntelliJ 6.0 announced

    IntelliJ IDEA 6.0: Built-in Struts Support: “Starting from release 6.0, IntelliJ IDEA will provide Struts support out-of-the-box. The functionality is added by Struts Assistant plugin that is now bundled to IntelliJ IDEA. So you’ll get it without any additional download and installation”


    (Via IntelliJ IDEA Blog.)

    Leaving Lecando

    I’ve spent five good years at Lecando. When I started out, we had ~25 employees. After a year we cut down to 14. After another cut half a year later, we held on to a pretty steady 10 until this spring showed to be terrible if you where in the business of selling addons to IBM Workplace.

    Lecando will be employing 3.5 people this fall, none of them being me. I have been thinking about getting a new job for about a year now, so I am really looking forward to the fall and my new employment. More on that later.

    I wish Acke, Johan, Behe and Jimmy all the best for the future.

    Leaving Valtech, Joining Qwaya

    Friday was my last day as a consultant at Valtech, and starting Monday I will join the team of developers at Qwaya.

    This was the second time I was employed by Valtech. I originally joined them in 2005 after five years at Lecando. Back then, Valtech was one of only three companies in Stockholm actively promoting agile software development. (The other two was Agero and Citerus). I spent two years away from Valtech, first in product development at WeMind and after that trying to set up a Thoughtworks office in Stockholm. Neither of those two turned out the way I had hoped, so I was happy to return to Valtech in the fall of 2009.

    My consulting assignments these last four years has been very varied. I have been an agile coach, developer, tech lead, teacher, architech, you name it. However, the work I enjoy the most is when I get to work in a small team, doing actual software development. I sometimes use the metaphor that I like to play football more than I like standing on the side lines.

    There are many reasons why I am joining Qwaya. The main one is that I get to do actual development, I get to play. I am looking forward to joining a small team of talented developers, working with interesting technology, improving an already successful product. Another reason is how the company tries to create a place that will attract other talented people.

    Valtech is great place with fantastic people. I wish you all the very best in the continuing transformation to an digital agency. For myself, I am anxious to get started tomorrow morning. (Hopefully extra happy after a Broncos Superbowl win, fingers crossed)

    Linking Courage

    I was looking up DWR and noticed that they provided links to similar projects. It occured to me that that is usually a sign of a quality project, having the self esteem / humility to show the way to alternatives.

    Long time ...

    Det var ett tag sedan, en hel december har passerat. Julen tillbringades i tur och ordning i Stockholm (Julafton), Uppsala (Juldagen); Grövelsjön (Fram till nyår) och sedan hemma i Beverly Ängby igen.

    MBP Core 2 Duo Sweetness

    This is written on a spanking new MacBook Pro, the 2.33 GHz, 2GB version. Company issued, mind you. Now if that is not a good reason to work for Valtech, I do not know what is.

    The main reason I upgraded from my trusty 1.67 GHz G4 PowerBook was not speed, it was the possibilities of Parallels. I do quite a bit of evaluating and demoing of server configurations, and having it all available locally is a complete killer.

    The first virtual install was Buildix to convince a customer that Subversion and Trac is a viable platform.

    But of course it is wroooom-fast. Extremely responsive, and not hot. I currently have it in my lap - no problems what so ever. and Exchange

    If I could ask for one thing in Leopard, it would be the ability to answer Exchange invitations directly from As it is now, I either have to use the heavily dysfunctional non-IE Outlook web interface or fire up Entourage for the sole purpose of clicking ‘Accept’.


    I finally got around to installing the Markdown plugin for Wordpress, which I really should have done earlier.

    Markdown is my favorite text format, clean and readable. Read up on the Markdown syntax to understand why.

    Markdown based S5 in TextMate

    Happy happy joy joy

    (Via TextMate Bundles (svn).)

    Me and my X40

    Some time ago I got a new IBM X40. It is now running Ubuntu Hoary and I must say that it is really an excellent piece of hardware. Everything but the SD card reader works out of the box, which of course also goes to show what a great distro Ubuntu is. Get’em both.

    Me, an Ipod addict

    My name is Marcus Ahnve and I am an iPod addict.

    My iPod died on me the other day. That is when I realized that I am an addict. I got physically cold and I immediately realized that my next subway ride would be iPod less. I cannot ride the subway without an iPod.

    I had plans for this iPod. We were going to spend the fall and winter together, waiting for the iPhone to reach this dark corner of the world sometime next spring. Now I was left alone with no one to turn to.

    There are currently two iPods on my desk. I still have the old one as I just can’t let go yet, the other one is a 8GB iPod Nano. No moving parts this time, and the option to buy the Nike+ kit, which isn’t available for the iPhone anyway. I feel better, I will be able to ride the subway again.

    Merb, Leaner And Meaner Than Rails

    I have used Rails on a daily basis for almost a year now, and before that I was a night time hangaround. While I am definitely a happier programmer using Rails than anything built on Java, I still feel that it can get better.

    First of all I want more things to be plugins. And really, they should not be plugins at all but gems instead.

    Why plugins? We use RSpec instead of Test/Unit, HAML instead of erb and are seriously looking into JQuery instead of Prototype. And of course, we are using Mercurial instead of Subversion. All of this is of course possible to use in Rails, but a lot of things are sort of made for the default choice, such as generators generating tests, and plugins having the -x switch for Subversion. And I am pretty sure that this is the way DHH wants it.

    So, when 2.0 is now released, I see that the Rails community as a whole does not see the same problems as I do. If they did, they would have done more like the stuff above, instead of sexy migrations and ActiveResource.

    This is where Merb becomes really interesting. I have looked at it before not understanding its value, but now I see a framework that does everything I want Rails to do. Gems as plugins and very agnostic about templating languages, Javascript frameworks and even ORM frameworks - almost a heresy in Rails. I will definitely think about using it instead of Rails in the future.

    Mercurial Is My New Favorite VCS

    I am starting a new development project where I will do a lot of coding myself, at least initially. There will most probably be times when I have to work offline - perhaps a litte evening coding while at vacation with my family, definitely the days when I am home because the kids cannot be at kindergarten.

    So I had this initial thought - can I make a offline copy of the Subversion repository, make changes to it and merge it back when I come online again?

    It turns out that there are solutions for doing that - namely SVK and svn-mirror. However, while searching I around I also realized that there had been a revolution in the VCS world, and no one told me.

    In the wake of the BitKeeper mishap, it appears that several groups of people found it their mission to create the next great distributed versioning system. These days we have:

    These seem to the more prominent ones, but I am sure you can dig up a few that I have missed.

    To make a long story short, I have decided to use Mercurial for my next development effort. In fact I am using Mercurial for versioning all my files. It is ridiculously simple to set up versioning for an existing folder (hg init; hg add) so there is simply no reason not to.

    To learn more, I recommend reading this, this and this.

    Mercurial and 3G - hg pull in the middle of nowhere

    I am currently on my way home from northern Dalecarlia, and I am making full use of the 3G card. I had received a couple of update mails from our central Mercurial repo, so I tried to do an ‘hg pull’, and expected it to take a while. Lo and behold, I got all changesets within 15 seconds! This says a lot about Mercurials protocol, as the reception was so-so; no surprise as we are driving here:

    Driving between Särna and Älvdalen

    Microsoft Keyboards F Lock Key

    I use a Microsoft Natural Keyboard with my MacBook Pro - make that two, one at home and one at work. The function keys stopped working last week on the one at work which is a pretty big deal if you use Exposé as much as I do. I did the whole routine and could not find the problem. As the keyboard at home worked just fine, I started to believe that there was something wrong with the actual keyboard.

    Then I came across this post which finally explained to me that I have a key right next to the F12 key named “F Lock” which makes the function keys do other things than I want them to do. A key stroke later all is good again.

    The funny thing is that I have no idea how it got into this mode as I cannot turn it off again.

    Microsoft and Heroes

    I have never programmed anything using Microsoft products, but if I did, heroes happen here and source fource would make me feel embarrassed. Who are they targeting?

    Misunderstanding the Meaning of "Web Based"

    As I have been in charge of setting the administrative infrastructure at WeMind I continuously tried to use web based systems to limit the number of systems administered by us. We use Google Apps, Basecamp and outsource all our servers to Mathias and colleagues at GlobalInn.

    We have however run into problems when trying to find web based services that are preferrably local to Sweden, like accounting. Even if marketed as “web based”, they are all based on Internet Explorer using ActiveX or some other proprietary part of IE. As we use Macs at WeMind, these services are as available to us as any software packaged as a .exe file.

    I tend to see this in Sweden and not as much in other countries, or am I wrong?

    Mmm ... Powerbook.

    Wow. I am back in Mac land, which I left in 1996 when I started my career at IBM and turned into a PC drone. Now, after four days of pure Mac joy, it feels like I am never going back.

    This also goes to show what a cool company Valtech is. I mentioned this to Jon who got really jealous. Apparently the Thoughtworkers get company issued Dells and all Mac stuff is paid for by themselves.

    Mocking datetime in Python

    It might be that pythonistas really don’t like monkey patching, but as I couldn’t find a quick answer on how to mock time in Python I thought I write down here how I did it.

    It’s no big deal really, just replace datetime in the module tested with a local implementation. In my case I wanted to to mock datetime.utcnow and to match the call I created a class with utcnow as a static method.

    class TimeStandsStill:
      # define the methods you want mocked
      # Here we have
      def utcnow():
        return datetime(2015, 8, 1)
    def test_setup_result_without_error():
      my_module.datetime = TimeStandsStill

    Really, not a big deal.

    Mongoid and Embedded Relations

    I am experimenting with Mongoid and embedded relations. I have a class A that can have three named 1..1 relations to class B, and I found it quite problematic to get the reverse relationship setup. After specifying class_name and inverse_of everything started working as expected.

    class B
      include Mongoid::Document
      embedded_in :a, class_name: "A"
    class A
      include Mongoid::Document
      embeds_one :something, class_name: "B", inverse_of: :a
      embeds_one :completely class_name: "B", inverse_of: :a
      embeds_one :different, class_name: "B", inverse_of: :a

    Moving a Single Server App To Docker on AWS

    Last fall, we moved the Qwaya Facebook ads tool from a single host on Rackspace to a clustered Docker based environment on AWS. This is the first blog post of hopefully more that I’m writing to remember what we did. I’ve planned two more posts, one on how we handle CI and one on container orchestration.

    Docker Logo

    Why Docker?

    The task at hand was not “Move to docker”, it was “get out of single host hosting”. The old deployment consisted of some quite complicated Fabric scripts that was run from an arbitrary developers laptop. The source code repository did not match the deployment setup, so there was a lot of remote copy commands running around. I know that this is a very common way of deploying applications, but it brings a number of problems. For example, there are no build artifacts, making repeatable builds harder, and if the build fails halfway in you will have a broken system.

    To get away from this we saw three options:

    1. Build a local .tar.gz archive, copy that to the server and extract it.
    2. Build a debian package, get that to the server - either by copying the .deb file directly to the server or by using a local deb repo.
    3. Build a docker image and run it on the servers.

    Alternative 1 still involves a lot of manually copying files around when extracting the archive on the server. It also requires a separate server configuration step setting up all the OS dependencies needed, which is usually quite a hassle when upgrading a package.

    Using a .deb for deployment will declaratively take care of file copying, as well as stating the dependencies for your application. This is a big improvement on the .tar.gz solution, but we’re still dependent on Debian as a host distro.

    Docker improves on the .deb alternative by providing encapsulation - whatever our application needs is declaratively specified, and can be run in the same form on development machines and servers alike as it is largely ignorant of the host distro it is run on. Where the .deb states the dependency declaratively, the docker container includes it in full.

    Even though a young technology, Docker had passed 1.0 and we felt the momentum and usage was large enough to make us go for it.

    Building the Docker Containers Using A Subset Of The Files

    Building Docker containers is fairly simple using Dockerfiles. One problem we did have was that our repo has quite a lot of files like ext4 (don’t ask) build tools etc. These were numerous enough to choke the Docker daemon on build time.

    To make this work we had to copy the files to go into a separate build directory along with the Dockerfile and build the Docker container from there. The Makefile looks like this:

    $(DOCKER_BUILD): $(DJANGO_FILES) Dockerfile
        rm $(DOCKER_BUILD_DIR) -rf
        cp -r django $(DOCKER_BUILD_DIR)
        cp Dockerfile $(DOCKER_BUILD_DIR)
        cd $(DOCKER_BUILD_DIR) && docker build --rm -t $(IMAGE_NAME) .
        docker tag -f $(IMAGE_NAME) $(IMAGE_NAME):${BUILD_TAG}
        docker tag -f $(IMAGE_NAME) $(IMAGE_NAME):$(TIMESTAMP)

    Choosing CentOS As Host OS

    We tried out a number of alternatives. CoreOS was a very attractive alternative, but we were concerned what would happen if the etcd cluster lost consensus. Also we felt that the actual deploy process with systemd service files was a bit immature at the time. I’ve heard from people I trust that CoreOS has evolved since then.

    We finally decided to run our Docker containers on top of standard Linux hosts. After trying out a few distros we choose to go with Centos 7 for our Docker hosts. Given the choice today, we would probably have stayed with Debian, as Jessie’s kernel improvements and move to systemd makes it more suitable to Docker hosting that Wheezy.

    The hosts are built with Packer as described in a previous post

    Why Not Kubernetes, Deis etc.

    First of all, these platforms weren’t as a viable alternative nine months ago as they are now, things move really fast in the Docker space.

    Second, we wanted to limit the number of new things we introduced at the same time. Moving to Docker was a big step, and just running them as standard processes made the transition easier.

    I have no doubt we will move to something more PAAS’y in the future, but for now this works fine for us.

    Running Docker As systemd Services

    Our old server ran Debian and managed processes with runit, so our initial approach was to use the same setup for docker. Unfortunately we ran into problems trying to get runit and docker play together.

    Instead we looked to systemd. As an [Arch Linux][arch_linux] user I have been using systemd for quite a while now, and I have generally happy with it and the declarative way of specifying services. Docker works really well with systemd, and has some well documented examples over at the CoreOS site.

    Services are declared as such:

    Description=Dryleaf Backend
    ExecStartPre=-/usr/bin/docker kill backend
    ExecStartPre=-/usr/bin/docker rm -v backend
    ExecStart=/usr/bin/docker run --name backend \
    -p 8000:8000 \
    -e "DB_HOST=<db_host>" \
    -e "DB_USER=<db_user>" \
    -e "DB_PWD=<yeah_right>" \
    -e "DB_NAME=<db_name>" \
    ExecStop=/usr/bin/docker stop backend

    As can be seen, We’re still handling settings with environment variables, but in a next step I would really like to see us adapt something like vault and consul for service discovery and settings.


    We’ve been running this setup with a total of 60 containers on six machines for four months now, and have had very few hiccups - we’ve had to restart a machine once, and twice force restart a process. All in all it’s a great improvement over our old setup.

    Moving out

    I’m moving out of here, and into my own home. Thanks a lot freeroller.

    Must ... have ... power ...

    As I am constantly on the outlook for power outlets, Pragmatic Andys post on Travelling with power was really funny. > Battery life: the new frontier.

    So true

    (Via /\ndy’s Blog.)

    My New Job At Valtech

    I am really excited about my new position as a consultant at Valtech. After selling software products for five years, I am ready to go back into consulting.

    Valtech Stockholm is very strong Java shop and really into agile methodologies. This was the cause of my intitial interest with them. The thing that finally got me though was the interview process which really impressed me. I certainly was not sure that I would get through it myself, and I figured that if everybody working there had passed it, they must be a really exceptional group of people. That impression has intially been confirmed by spending a day and evening with them at a conference.

    As my wife also got a really cool new job, this fall is looking very bright indeed.

    My New Laptop

    I got a new laptop at work the other day. It is a Lenovo X230 which replaces the best laptop I ever had, the Lenovo X200. I carried the X200 around wherever I went for three years, and in that time I had to replace the battery once. Which is really simple: you buy a new one, take the old one out (no screws) and put the new one in. Oh, I replaced the old hard disk with an SDD one too. That involved taking one (1) screw out, pull the old one out and push the new one in.


    Lenovo might not make the prettiest laptops, but they have a feeling of being an engineers laptop that in my opinion no other brand is even close to matching.

    So, what’s the difference? The new one has a camera so I will finally be able to join Google Hangouts. Not that anyone ever invited me to one, but I am ready if it should happen.

    The screen is wider, and with a lower resolution than the old one. The old one was 1440x900, this one is 1366x768. The thing is, I actually think I prefer this one. The X200’s resolution was so high I couldn’t use my favorite font Profont, it was just too small. But on this screen it feels just right. I also get the feeling that the colors are more vivid, but that could just be that the old one was … old.

    However, the biggest change is the keyboard, which I was very suspicious of to start with. You see, Lenovo used to be only vendor that could produce a real fricking keyboard, and when they replaced that with something chickletty, I was in the FFFFUUUUUU camp.

    After spending a week with the new keyboard I have to say I was overly suspicious. The keyboard has a really good tactile feeling, and it produces a clear clicking sound which I find important. (My external keyboard is a Filco with blue Cherry switches to by colleagues delight)

    I also love that they made the keyboard backlit, but still kept the little lamp on the top of the screen.

    After a week, it feels like this one will make my old one the next best laptop I ever had.

    My Talk From Smidig 2007 Available Online

    I just found out that the talk I gave at Smidig 2007 is available online. If you think there is something wrong with the sound, it is in swedish.

    My laptop is working!

    After a lot of work my shiny new IBM R40e is up and running with almost working ACPI, internal network adapter and a 3Com 54g wireless PCMCIA card, all on Gentoo Linux.

    A Mini HOWTO: - Get an old PCMCIA card for the installation as the internal network adapter is not supported by the Live-CD - I choose the Gentoo Stable kernel which is working great - Do not enable PCMCIA in the kernel, emerge the pcmcia-cs package instead for continued setting up of the system. - Get the network card driver from Broadcom, the card is a BCM-5700. Compile it and put it in the /lib/modules/*kernel-version*/kernel/driver/net/ folder. Run update-modules and modprobe bcm-5700 Add it to /etc/modules.autoload/kernel-2.4 if needed - Get the ISL driver for the 3Com card. Follow the instructions closely, but patch the gs-sources kernel instead. I removed the pcmcia-cs package before compiling the kernel as it provides its own cardbus implementation. Supposedly only the card drivers can be compiled, but I didn’t try that. - Emerge the wireless-tools package. iwconfig is your friend. - ACPI is somewhat unstable, the battery information comes and goes in a undetermistic way. - The modem is supported by the HSF driver but that in turn does not support preemptible kernels. Choose whatever you want

    I’ll probably update this as I learn more. This is posted over wireless by the way :)

    My local browser war

    I switch browsers like others switch … something they switch very often. Why does it have to be so hard? All I want is a browser that:

    • Is small and nimble
    • Feels like a Mac application
    • Has good ad blocking support
    • Handles Flash on demand

    Safari locks up too often, and a number of sites do not work with it. Shiira is small and nice, but has no decent ad blocking. Firefox has lousy Mac integration and eats memory like there is no tomorrow. Flock just does not feel ready yet. OmniWeb has clunky ad blocking and is not worth the money.

    My current choice is Camino. It is lightweight and Macish but has terrible, CSS-based, out-of-the-box adblocking. But with the help of CamiTools that can be fixed and you also get the flash handled.

    Who knows, I might even be using next week.

    My name

    By the way I realized that my name is not mentioned here, and Jon keeps on calling me “boss”. This is corrected now.

    NFL på Viasat

    15 års väntan är över - äntligen kan man se amerikansk fotboll i svensk tv. Viasat Sport kommer att köra Monday Night Football live (kl 03.00 …) med repris dagen efter. Kommersiell tv när den är som bäst.

    Neal Ford: Static Typing is Communist Bureaucracy

    Last time I quoted Neal I for some reason ended up on TheServerSide - why they did not link to Neal directly is beyond me. Oh well, he is obviously on a roll, I totally love this one:

    Static Typing is Communist Bureaucracy

    (Via Planet TW.)

    NetNewsWire for free

    Great news, NetNewsWire is available for free and available for download!

    (Via Macfeber)

    Netcfg And USB Tethering

    In order to use netcfg for USB tethering, just configure it as a regular ethernet connection. The following worked for me, remember to modprobe usbnet.

    DESCRIPTION='A basic dhcp ethernet connection using iproute'

    New Job in Startup Land

    I almost forgot to mention it, but I have a new job. Again some might say.

    After being a consultant for 1.5 years with Valtech Sweden, I am back in startup land. This time it is really, really startup. We registered our domain last friday, we do not have a web site yet, we are all sitting in one room on broken chairs. Ok, one broken chair. Mine is actually the good one.

    It has only been three days, but boy, it is a lot of fun. The fact that you get to call all of the shots means that you can have things just the way you want them.

    I look forward to this spring with a sense of excitement, that I will be part of building something that actually means something to me. That means a lot.

    New Laptop Woes

    I got myself a new laptop the other day, a IBM T40e. It has a pretty good price performance with a 2.2 GHz Pentium 4M. While researching the laptop market it occured to me that most resellers still has not understoiod the difference between Centrino, Pentium 4M and Pentium 4. The vendor I choose happily listed the T40e as a P4 even though it in fact is a P4M.

    As a Gentoo fanatic I put the Live CD in an booted - no network. The Broadcom 5700 adapter was not supported out of the box, so after trying I few innovative ideas like creating a custom LiveCD, I suddenly realized that I could use my old Xircom card in the PCMCIA bus. Sometime the easy solutions are really hard to find, and sometimes I’m just a dork for not seeing them. This time it was the latter.

    OK. After that the install went smoothly. I got the Broadcom driver from their site and could eject the Xircom card. Lm-sensors simply does not do IBM, so I had to turn to ACPI. It provided quite some headache, but after reading a lot about it I did at least get the battery stuff going.

    Then we had the 3Com wireless PCMCIA card. The nice people of Rutgers University had put together a driver that supposedly should work. After working a _lot_ with it and having a little private kernel patching festival, finally it compiled and I was a happy man. Until I rebooted, that is. The laptop simply did not boot with the 3COM card in it. OK, so I had to do a little more tweaking. Eject the card, and do a hard power off.

    So I started the laptop up again just to get me a large fat kernel panic in my face.

    Something had barfed on the Reiserfs b-tree and it would not start again. OK, boot with the Live CD and fsck, right? Wrong.

    To make a long and sad story short but equally sad, my almost ready killer laptop was gone. Reiserfs could only recover the disk by doing a rebuild-tree. I could identify most folders, but since heartbeat applications like bash were not recovered, I simply had to start over again.

    And this for two measly failed startups.

    Needless to say, my new setup is running Ext3 and Resiserfs will never be used on a computer fo mine for a very very long time.

    And as for the Gentoo install guide referring to Reiserfs as “rock solid” - yeah, right.

    New Post Over At Valtech Labs

    I published a new blog post today over at Valtech Labs in Swedish about the difference between the swedish words “agile” and “nimble” (lättrörlig). In short, while they once meant the same thing, agile has lost a lot of its meaning. Instead of trying to change things back, we should let agile mean whatever people think it means, and use a more descriptive word, like nimble, to describe the process we once called agile. Which of course means XP :).

    New home

    I moved my stuff over from freeroller to here. I used to have a more personal blog here and leave the techie stuff at freeroller, but it got kinda old. This is the tech department and is gonna be in english. If you happen to wander into the other parts, they are in melodic swedish. Translations can be made available upon request.

    Not everybody is into Euro 2008

    Not everybody was following the Euro 2008 final:

    Peter is not that interested in football I guess

    Congrats to Spain for a well deserved win anyway. I’ll tell Peter about it over lunch tomorrow.

    Not speaking at RailsConf Europe

    I just got a mail confirming that I will not speak at RailsConf Europe this fall. I had submitted a proposal named “Version Control in Rails using Mercurial” which was going to show the benefits of using a distributed version control system when developing a Rails app. My opening line would have been “Hi, I am Marcus and I have been Subversion free for six months”.

    For some weird reason, so many people in the Rails community - and the open source community as whole - still talk about Subversion as something great. It is not. Subversion is decent at best if you are comfortable knowing that you are using second or third best tools, but believe me, it is a crap choice knowing the alternatives in distributed version control.

    I really wanted to point all this out to the a larger audience so that we maybe will move beyond the Subversion centric mess which is the Rails community today. Oh well, maybe next year.

    For a very entertaining and opinionated view on version control systems, watch Linus Torvalds most awesome presentation on Git at Google.

    Notes From Smidig Open Space on Why Agile Isn't About Development Anymore

    Today at Smidig 2010 I sponsored an Open Space session on the topic “How and When did Agile System Development Stop Being About System Development”

    We had a very good discussion, and these are the notes we managed to gather, in the order they were discussed:

    • It’s Scrums fault
    • It’s easier to sell with soft skills arguments
    • Agile is trying to sell into other fields where the technical practices don’t apply.
    • Obsolete knowledge in management, old Cobol programmers not up to date with todays technologies.
    • As people speak more at conferences, the less they program.
    • More attention to people who are good at talking, and devs normally aren’t.
    • Using wrong metaphors, i.e. factory, to explain process to managers who do not understand leads to wrong process.
    • Recipient of system development does not understand the problem of why engineering practices are important.
    • Soft skills are easier to acquire.
    • Average organizations have average employees. Does not want to take responsibility, not that interested.
    • Management who does not understand the process they are running.
      • Is this partly developers fault?

    Thanks all who joined in!

    Nya skivor

    Det har landat nya skivor i högen. The Klerks, Tyskarna från Lund, Saint Etienne samt Melody Club. Recensioner kommer.

    OK Go

    Oh so brilliant.

    Alan Francis: Quite the best pop video I’ve seen for AGES: “ OK Go on YouTube

    (Via Planet TW - Alumni.)

    Oh man ... I'll continue buying ecological eggs

    I saw this on Boing Boing and it is just staggering what people can do. As mentioned you have to watch the video clip. And think about what you buy.

    Oh, another thing

    For all the good reasons, yak shaving is the thing to do these days.

    Ola Bini: JtestR 0.1 released

    Ola has released JtestR 0.1. It seems to b a great tool for those doing Java development. I can personally not imagine doing any development these days without RSpec.

    On Blogging

    I started blogging back in 2002. At that time I was working at Lecando, where I was lucky enough to be doing Java development and experimenting with XP together with some ridiculously bright people like Jimmy, Johan, Jon, Håkan and Visar.

    Back then, Java was where it was happening. All the new things happened in Javaland, and we did our best to try out the new things; TDD with JUnit, CI with CruiseControl.

    I spent a lot of time then reading blogs. Most of the blogs I was interested in were hosted at FreeRoller, a platform run by Anthony Eden, today perhaps more famous for DNSimple.

    All the cool kids blogged on FreeRoller. It featured a top list of the most read post at the moment, on which you most often found smart posts from Rikard Öberg or rants from Hani Suleiman. I once held the top place at that list, ahead of Rickard, for something like four hours. I was immensely proud.

    If I remember it correctly, FreeRoller turned into JRoller, which apparently still exists today.

    The thing was, we had actual blog debates back then. If you wanted to comment on a blog post, you wrote a blog post of your own, linking to the original post. I know, sounds crazy. But I remember it as a slower, more thoughtful way of debating and writing. Like many others, my blogging has halted considerably as I started using Twitter and Facebook. And while being limited to 140 characters forces you to condense your thinking, it is not the best way to find the nuances of a topic. Writing a long piece is like preparing a presentation, you - hopefully - think things through, and get a better, more detailed view of the topic at hand.

    I’ve come to realize that I miss writing as much as I did back then. Also, I’ve found that the less frequent I write, the more I feel that a new post has to be really good. Writing more often takes that away. In that regard, this post is one attempt to break that barrier. Hopefully, it will help.

    One hour talks are too long

    JFokus has the traditional format of speakers talking for an hour, which is way too long. Every speaker I have listened to has spent more than half of their allotted time providing context and explaining why they are talking about whatever they are talking about.

    I so wish that they would have used lightning talks.

    One of those days ... ?

    On the train to work this morning I proudly realized that my PowerBook had an uptime of 30 days. The fact that Macs can do this is so weird to my non-mac colleagues that they almost don’t believe it.

    Well, the God of Failing Computers saw me in my hubris, and promptly crashed my computer, just like that, and would not let it restart. It finally showed some signs of life when I got to the office and plugged it in.

    I am a big fan of geektool, and use it to display console.log. This was a good thing because I noticed a whole lot of lines saying that the /tmp directory was missing. When I looked into it, /private/tmp, which /tmp symlinks to, was indeed missing and that caused a lot of mayhem.

    I recreated the directory manually, and things have been smooth since. But it was quite a scare.

    After that my day has, shall we say, not been smiling at me. Let’s really, really hope that this is not an indicator for tonights big game against Paraguay.


    No more tweet summaries here. Thanks Ben.


    Proponents of RUP, the golden methodology of 1998, is trying revamp it as OpenUP.

    My first reaction is positive - browsing the Work Products I cannot find any required UML diagram. But after a while I get the feeling that they have fixed the implementation without getting the big picture.

    It is still has four phases, delivering a feature complete project after the transition phase. No lean, incremental deliveries to production, but how could they? It explicitly defers deployment and operation leaving it to other parts of the organization.

    But this is my favorite one:

    OpenUP is minimal, complete, and extensible. It’s the minimum amount of process for a small team.

    No, it is not minimal and it is not complete. It is less lipstick on the pig.

    P900 rocks!l.

    I’ve got myself a SonyEricsson P900 which no doubt is the coolest gadget ever. I’m writing this sitting on the bus while at the same time listening to some ogg tunes. Awesome!

    Pair Programming

    The pair programming thing turned up on TSS and ended up with the usual “You suck” enlighments with the occasional, surprisingly non-embarassed, opinions on whether or not the Struts API is easy to understand (sic).


    If you don’t like to pair program don’t do it. I am not going to tell people what to do.

    Unless of course you work where I work. In that case, share the (wireless) keyboard. The reason being code quality, and development speed.

    We used to have a problem with code quality. Not code resulting in bugs necessarily, but code that was not 100% in terms of maintainability etc. We did of course have code reviews but it seemed that we could not get enough of them. Enter PP, with continuous code reviews. Code quality has never been better. Of course, all of you people out there who don’t like PP are probably very, very good programmers who don’t never had this kind of problem, right? :-)

    PP answers our need for speed. No, I have no benchmarks, but take my word for it. At our place development is faster since we switched to PP. Cedric, normally somebody whose opinion I highly respect, has started sharing the managerial opinion of two people at keyboard equals half the productivity:

    […] the combination of developers + QA engineers can work wonder, and you will get twice as much done than XP will ever allow.

    Please! I don’t know who said it first, but the speed of development hardly depend on how fast you can type, whatever the superpowers of your QA department. I can accept a lot of reasons against PP, but that one is, in my very humble opinion, plain rubbish. Sorry.

    Rickard is from what I understand an ultra talented programmer. > The point of pair programming, as I’ve understood it, is not > actually the programming itself, but the exchange of ideas.

    However, he’s missed the full point of PP. Exchange of ideas is good, of course, but in my opinion it’s the notion of continuous code reviews, which incorporates a lot more, that does it.

    This almost turned into one of those TSS rants. Ouch.

    Palm Tungsten

    Jag har haft min Palm Tungsten i typ tre veckor nu. I förrgår kom ljudpatchen som går att man kan använda den som mp3-spelare.

    Ovärderlig pryl.

    Parallels - Crap International Version and Customer Support

    Once I got my hands on my new MacBook Pro, I did what mostly everybody else does - I bought a copy of Parallels Workstation for Mac. I need it mainly for running local servers so I can do demos of server environments etc.

    For various reasons, we (Valtech) bought the license from the local retailer at the same time as the laptop. Big mistake. You see, if you buy Parallels from a local retailer in a non-english speaking country, you get a special, international, version. This version is not downloadable from the site, and has it’s own line of activation keys, so you cannot use the regular downloads from the site.

    Now, that should not be a problem, should it? Well, it is. To make a long story short, I could not get the fine feature of NAT networking going. I did all the huffs and puffs of uninstalling, restarting etc, but to no avail. At the same time, the regular version worked swimmingly, apart from the fact that it would not accept my activation key.

    So, I figured it was time to contact Parallels support. My idea was that due to the reasons above I could trade my malfunctioning international activation key for a working regular one. I mean, I had paid for their product and could prove it by sending the key I had.

    Enter the Kafka world of Parallels customer support. I have to date sent them eight emails with an ever increasing level of anger. The first replies misunderstood my request, thought that I had lost my key and offered me tips on how to get that back. When I finally got my point across Parallels stopped replying. I had to send two more emails to get an answer. They now understood the nature of my request but there was nothing they could do about it. Instead I should take my product back to the local retailer for a refund, and then buy a new license from Parallels directly.

    The local retailer Macoteket referred to the swedish importer who will not return calls or emails. And Parallels still won’t give me a new key.

    The moral of the story is: if you are about to buy Parallels Workstation for Mac, make damn sure that you buy the standard version. The international one is crap, much like their customer support.

    There should still be hope for VMWare on the Mac.

    Update: Macoteket eventually refunded our purchase and I rebought the standard version. Too bad it took so much effort.

    Patrick Kua: Explaining Your Rituals

    Pats posts on team building and coaching are always a refreshing read. His latest on explaining rituals is no different and something I myself is notoriously bad at.

    (Via Planet TW)

    Patting Myself On the Back

    It’s not that often that I get to say “told you so” - ask my wife, coworkers or basically anybody - but I found this old blogentry mentioning Phoenix, now better known as Firefox.

    Told you so.


    Rickard is using mozilla 1.2b. I used it until I stumbled into the Phoenix world, where everything is lighter and oh so fast.

    Seeing is believing, try it out.

    Playing to win, culture style

    This Saturdays edition of Dagens Industri had a really interesting column by Jan Åman, former curator of Färgfabriken. He writes about how you can either move forward or secure your back, and how the world is run by people watching their backs and making sure that decisions can never be questioned.

    It is very close my favorite XP slogan “playing to win” and what I talk about in my presentation on Agile Documentation. A good read, but unfortunately only in the paper edition.

    Powerpoint corruption and lies

    image Powerpoint corruption and lies Originally uploaded by mahnve.

    I am so intensely mad right now. I have spent the afternoon working on a presentation I am to give at lunch time tomorrow.

    To make it short: Powerpoint crashes, and takes my file with it in the fall. I can’t open it anymore.

    I am redoing my presentation right now - in Keynote.

    Coming up with the title of this entry cheered me up a little. You have to know your New Order to understand it.


    I submitted my soul to iTunes an hour ago, as Depeche Mode so far has released their new single on the net only. Since I’m an avid loather of DRM this was not an easy step, but I really couldn’t help myself.

    The song? Classic Mode stuff - really, really good.

    Presentation About Test Driven Development

    I will do a presentation on ‘Successfully Using Test Driven Development’ at .NetAkademin Tuesday September 16th. This talk will cover stuff like BDD, outside-in but also how the test-driven approach is used on the project as a whole.

    To match my .Net experience, we will touch on frameworks and tools for .Net, but focus on the ideas and philosophies behind them, making it a very platform independent presentation.

    The event is first and foremost for clients and members of .NetAkademin, but any seat not taken by them is available to the public.

    Problems With VirtualBox When Regenerating Box With Veewee

    We’re experimenting using veewee to create our vagrant boxes. However, when we tried to regenerate them, the disk was never attached and the installation halted.

    We tried deleting the whole VM directory to no avail, the disk still was never mounted. It was only after trying to mount it manually in the VirtualBox GUI that we saw that VirtualBox keeps a sort of registry of disks.

    To solve the problem - open the Virtual Media Manager, remove the old disk and restart the veewee install process.

    Quote of the day

    I need to remember this one:

    Chuck Reid: “In theory, there is no difference between theory and practice; In practice, there is.” image

    (Via Quotes of the Day.)

    Quoted in Computer Sweden

    I am quoted in todays issue of Computer Sweden on BDD. It is a well written article even if I do not agree with Emil Gustafssons quote in the end where he states that BDD doesn’t bring that much new things to the table. I think that people looking at BDD for the first time might perceive it as such, but I must say that there is a clear difference in both approach and outcome.

    Quoting Quote of the Day: Assaf

    Quote of the Day: Assaf: “I never saw a programming language that can cure stupidity, only languages that add safety caps so they look safe, while slowing you down.”

    (Via Raganwald.)

    RE: The war is over and Linux won

    At least in the server world, Linux has won.

    Here in Sweden, Microsoft has an inexplicable stronghold, even in the server room. The last time Craig Larman, Valtechs Chief Scientist, was here he noted that nowhere did he see as large proportion of server side windows as in Sweden - and Denmark.

    I don’t know what makes swedes pay for stuff others get for free. Perhaps the high taxes have made us used to money disappearing?

    RSpec 1.1 is out!

    RSpec 1.1: “The RSpec Development Team is pleased as glug (that’s kind of like punch, but more festive) to announce RSpec-1.1.0.”

    Woohoo! We’ve used RSpec since the 0.7-ies and I personally could not be happier with it. The RSpec community is really pushing the boundaries for testing/speccing frameworks and is now the standard for all others to follow.

    (Via David Chelimsky)

    RSpec and Autotest

    I am getting all parts of my Rails development environment settled. In addition to vanilla Rails, I am currently using RSpec, Selenium and Autotest. I am seriously considering Haml and Sass as well.

    When googling arounf to learn more about Autotest, I realized that people are using together with Growl. It works out-of-the-box with Test::Unit, but RSpec needs a little tweaking. I took the basics from here and modified to my liking. The following is what my .autotest looks like.

    module Autotest::Growl
      def self.growl title, msg, img, pri=0, stick=""
        system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{stick}"
      Autotest.add_hook :ran_command do |at|
        puts "at: '#{at.results}'"
        output = at.results.slice(/(\d+)\s.*specifications?,\s(\d+)\s.*failures?/)
        puts "out: #{output}"
        if output =~ /[1-9]\sfailures?/
          growl "Test Results", "#{output}", '~/Library/autotest/rails_fail.png', 2 #, "-s"
          growl "Test Results", "#{output}", '~/Library/autotest/rails_ok.png'

    RSpec, Autotest and views

    The current incarnation of autotest seems to assume that you are using integrated views. If not, you can modify the rspec_rails_autotest.rb file to run the view specs as well:

    # when %r%^app/views/layouts/(.*)\.rhtml% then
    #   ["spec/views/layouts/#{$1}_spec.rb"]
    when %r%^app/views/(.*)\.rhtml$% then

    Your view spec must be postfixed with “_view_spec.rb” for it to work

    Update This works out of the box now.

    Rails Marketing Is Really Good

    DHH’s post about the Rails 2.0 is incredibly well written. It is almost as he is showing off a unknown past as a PR agent when he talks about Rails not supporting commercial databases out of the box:

    But that doesn’t mean the commercial databases are left out in the cold. Rather, they’ve now been set free to have an independent release schedule from the main Rails distribution.

    This sort of well formulated marketing has been known to render some sour remarks from the rest of the open source web framework world. My belief is though that when they ask themselves “Why are people so attracted to Rails, my framework of choice is just as good or even better”, sentences like the one above are probably a large part of the answer.

    Rails is moving from SVN to Git

    A year ago I was frustrated over Rails’ close ties to Subversion. But as Rails is moving from SVN to Git, the future is looking bright. The only bastion left I can think of is RubyForge.

    Rails, PostgreSQL and Time

    I just noticed that the mapping between PostgreSQL’s Time Without TimeZone column type maps to Rubys standard Time class. Which gives the following behavior in script/console:

    >> t = TimeEntry.find(1)
    >> t.time
    => Sat Jan 01 23:00:00 +0100 2000
    >> t.time =
    => Wed May 09 19:02:07 +0200 2007
    => true
    >> t = TimeEntry.find(1)
    >> t.time
    => Sat Jan 01 19:02:07 +0100 2000

    Am I very anal to find this … sloppy?

    Ray Davies

    Man bör lyssna på Kinks “I’m Not Like Everybody Else” åtminstone en gång i veckan.

    Ray Davies, forts

    … och man bör hålla med.

    Re: Humane Interface

    Martin Fowler writes: “If you only try to provide the minimum, you end up with multiple clients duplicating code for common cases.”

    Or one billion jakarta.commons packages

    (Via Martin Fowler’s Bliki.)

    Really good books

    While at Lecando, I was quite proud of the library of computer books we assembled oveer the years.

    These days as a consultant for Valtech, my employer does indeed have a library, but as I am almost never at the office it is not really accessible.

    I have therefore started to buy the books that I find necessary for my daily digital life out of my own pocket so that I can have access to them whenever I want. These are the ones I have got so far:

    While looking at the list I couldn’t help but noticing that I really like the Pragmatic books. I am equally surprised that I have so far not felt the urgent need for any of the O’Reilly titles

    RedHat 8

    Har precis fått in RH8 hemma, och det ser helt enligt ryktena riktigt bra ut. De antialiasade fonterna blir riktigt bra, synd bara att de inte funkar i alla program. Däremot blir det lite antigeek varning på att det inte finns en konsol-knapp default i menyraden.

    Inte heller denna version är en Windows-killer, men om de får fortsätta lite så kan det nog bli något riktigt bra. Personligen blir jag glad den dag jag slipper Windows helt och hållet. Idag använder jag det för spel och musik. Spel kan med fördel spelas på ett TV-spel och musik skulle jag gärna ha en Mac för. Med det skulle jag kunna slippa MS helt och hållet - toppen.

    Referrer spam pains

    I just upgraded this site which is running b2Evolution so that I would get a the new referrer spam filter function up and running, which is long overdue.

    After that I spent a good half hour in phpMyAdmin to delete all hits from the offending sites. Jeez, it’s so many! And why in good heavens name would anyone, ever, click on the link Weirdos.

    Reinstalling Windows

    During the Christmas break, I have installed and set up Windows on my Lenovo X1 Extreme laptop. That might sound slightly stupid as it came installed with Windows, but as with every other non-Mac laptop I’ve owned/used over the last 20 years, I wiped the disk and installed Linux on it. Now it was the other way around.

    I now do development on Ubuntu using Windows Terminal, editing in VS Code on Windows or IntelliJ in Ubuntu using X410.

    The last time I had Windows installed on a development machine was way back in 2000. Since then, I’ve been on Linux for a brief break for MacOS between 2005 and 2009. The reason I broke this streak is, of course, WSL 2. It was reasonably painless to setup, and the development experience is Linux as I am used to it.

    At the same time, I have to hesitantly admit that it is comfortable using a widely supported OS - I can use software from say Adobe and the fingerprint scanner on my laptop, which is still not supported on Linux.

    All in all, it is a smaller change than I expected, and I have so far not had any reason to regret my choice.

    Release numbering

    Cameron states an excellent release numbering system, coincidentally the same as we used back in the days at Lecando:

    • A ‘dot-zero’ release (like 3.0) is allowed to drop deprecated APIs, change an API in a manner that could break binary compatibility, or change the JDK version requirement.

    • A ‘dot-X’ release (like 3.1) is only allowed to add features and APIs, but should not break any binary compatibility.

    • A ‘dot-X-dot-Y’ release (like 3.0.1) is a service pack, designed to correct specific problems, and not to introduce new features.

    Over time we’ve found that this system works extraordinarily well because of its simplicity, although it’s not going to get us to version 10.0 anytime soon. (At least I hope not, as that would mean that we were breaking compatibility too often!)

    This numbering scheme disqualifies the ones I dislike the most: the weirdly named .5 releases that adds a lot of functionality, but not enough for the powers that be to consider it a full “dot-zero” release.

    (Via /dev/null.)

    Releasing Sinor

    Almost a year and a half ago, I wrote about how I had built my own blog frameworky thing. In that post I wrote that I was happy with the result. Unfortunately, it didn’t last long.

    The problem was that the tool I had built did too much. It found all the markdown files, converted them to HTML using Mustache templates and wrote the result to other files. All paths etcetera were hardcoded, the code was tied to the content in a way I strongly diskliked. Each change required everything to be rebuilt. Come to think of it, the only thing I liked was the choices of templating technology I had picked - Markdown and Mustache.

    Over the last years, I have come to realize that I like make, basically because it’s fast, it’s available everywhere, it can run things in parallell and it’s really good at handling file dependencies. So, instead of always rebuilding everything, I wanted a makefile for my blog to look something like:

    PAGES_SRC_FILES=$(wildcard site_src/pages/*.markdown)
    PAGES_BUILD_FILES=$(patsubst site_src/pages/%.markdown, $(BUILD_DIR)/pages/%.html, $(PAGES_SRC_FILES))
    $(BUILD_DIR)/blog/%.html: site_src/blog/%.markdown
        build-a-blog-page --template blog-template.mustache $< >$@

    So, realizing that this would be a good way to design my tool outside-in, I wrote a complete Makefile, specifying how I wanted the “build-a-blog-page” to work.

    Redesigning my tool did take a while, as the new version looks very little like the old one. It is still written in Python, as I find the Markdown support with Metadata and CodeHilite very nice. I have named the result Sinor. It is not a complete blogging framework, but it will convert Markdown to HTML, as well as generate Atom feeds and archive pages. What’s not to like?

    I have tried to be as clear as possible in the README on how to use it, Thanks to Jimmy for helping me proofread it.

    This is my first pip package, so I might have messed it up totally, but it worked when I tested it. I am planning to release an AUR package for Arch Linux as well. Anyways, perhaps someone else will like it. If so, enjoy.


    I avdelningen inspirerande låttitlar kom jag idag tillbaka till Ride’s makalösa “Leave them All Behind”. Man kanske skulle sätta ihop en lista på låtar som får en att känna sig lite bättre än alla andra.

    Rooted Galaxy Note

    I got a new Samsung Galaxy Note today and after some trial and error I managed to root it.

    I basicallly followed the instructions here with a few additions. I changed the binary in the to my system Android SDK adb, I added a udev rule for the phone:


    and finally I needed to run sudo adb devices once before running

    Migrating from my old phone using Titanium Backup now.

    Ruby Code Completion in TextMate

    For some reason, there has been very little fuss over the fact that TextMate now offers code completion for Ruby using the rcodetools gem. It is all still in svn, so you have to check it out manually.

    Log for r6455

    [NEW] The Ruby bundle now includes an rcodetools-backed completion command on option-escape.  This command is capable of very accurate completion for any accessible Ruby objects and methods, without needing to see you type it first (as TextMate’s default completion requires).

    Ruby DSL's vs YAML vs XML

    I am using Ruby based DSL’s for a number of tasks in my current project. But one day it struck me - am I using the right tool for the job, could there be a better, more simple solution?

    Some DSL’s I use are simply declarative and look something like this:

    quiz "Let's ask stuff" do
      question "What is 1+1?" do
        alternative "2", :correct => true
        alternative "3"
      question "Vad is 2+3" do
        alternative "1"
        alternative "Infinity"
        alternative "Don't know"
        alternative "5", :correct => true

    I find that quite readable, but it requires me to maintain code that handle the DSL. So I figured, what if I used YAML? It is simple, and using it would mean less code to maintain.

    After doing some experimenting, this is what I came up with:

    quiz: Let's ask stuff
      - question: What is 1+1
          - text: 2
            correct: true
          - text: 3
      - question: What is 2+3
          - text: 1
          - text: "Infinity"
          - text: "Don't know"
          - text: 5
            correct: true

    In my opinion, the YAML is not as readable as the Ruby DSL. I also find it more error prone as those dashes are sort of tricky.


    <quiz name="Let's ask stuff">
      <question text="What is 1 +1">
          <alternative correct="true">2</alternative>
      <question text="What is 2+3">
          <alternative>Don't know'</alternative>
           <alternative correct="true">5</alternative>

    With the correct schema, errors can be avoided, but it is just too much text in there, it gets heavy and verbose.

    The verdict was to stay with the Ruby DSL’s - their readability and flexibility are well worth the effort of maintaining a separate parser - which is quite short really.

    Ruby and MySQL on Tiger

    Lots of people have had problems with Ruby and MySQL. The ever so pragmatic Rails book links to a popular solution which involves installing the MySQL gem and specifying the path to the MySQL. This did not do the trick for me, and I’ve failed trying different alternatives after that. Today I came across PJ Hyett’s idea of installing Ruby-MySQL from source. It worked like a charm.

    Ruby on Rails on Ubuntu

    I feel I just have to try Ruby on Rails, I mean everybody else is doing it and I don’t want to feel left out.

    So I started setting it up on my X40 which runs Ubuntu. There is still no deb available for it, you have to use the Ruby Gems system to set it up. I dont know if this is good or bad - it seems like a Ruby CPAN and my feelings towards Perls CPAN are mixed. I once ended up with two Perls on a Red Hat box when using it to set up Request Tracker. Let’s hope Gems works better.

    To start out I had to apt-get rdoc and libzlib-ruby. After that it is installed. Whohoo. What now?

    Ok rails ~/work/rortest … Bang. Some dependency is missing. Let’s search Synaptic to see what could possibly make it tick.

    libwebrick maybe? Nope.

    libmysql-ruby? Nope.

    eruby? No.

    libdbi-mysql. Noo.

    libwhatever-ruby. Nothing works.

    Maybe there’s some info on their site? Hmm … there are instructionson how to install it on Debian unstable which involves apt-getting the all ruby libraries known to man - but who cares - let’s try that.

    Whohoo! It works. Let’s see some of the Ruby love in the browser then - it is indeed there.

    Ok. Now for the database tweaking. Why three databases? I guess I’l find out.

    Yaml is really, really nice.

    Ok, according to the site, all I have left is to develop my Rails application, so I guess that is what I will do. Wish me luck.

    Update: There are now instructions for how to set up Rails on Ubuntu.


    This tutorial on RubyOSA is great. I have never got around to learn AppleScript, and now it seems like I never will.


    I am at the SIME07 conference in Stockholm. It is is a conference focusing on entrepreneurship, media, Internet etcetera, at a pretty high level. At the conferences I normally attend people speak about what thay have done. This one has a lot of “what do you think will happen” going on.

    This morning there was a very interesting panel with three venture capitalists on stage, giving feedback to three companies pitches, and VC strategy in general.

    Perhaps not spot on for what I do every day, but providing a nice new perspective on things.

    SLADOS (swedish)


    This is a talk I gave at the Agila Sverige conference dinner 2015-06-03. This is the Swedish version, but there is an english version available too.


    God kväll, chefer och konsulter!

    Mitt namn är Marcus Ahnve och kommer från SLADOS, Safe Lean Agile Devops Scrumban. Namnet generas en gång i månaden av ett litet skript som söker på Google efter trendiga agila ord och sätter ihop det till en uttalbar förkortning.

    Innan jag sätter igång, låt mig bara vara väldigt tydlig att SLADOS är för dig. Och dig. Och dig. Och du är längst bak som försöker smita iväg. SLADOS är för alla, även de som inte vill ha det.

    I den moderna mjukvaruvärlden så mäts allt på hur agil du är. Och vi vet att du är trött på att vara mindre agil än de andra. Det är så tråkigt att hämta barnen på dagis, och träffa Lisas djäkla mamma som bara “äh, men vi har ju en velocity på 314 nu då”.

    SLADOS är för dig! När agil utveckling blivit metodernas motsvarighet till en dansk glass med 3 kg glass och grädde i en strut stor som en vägkon, med en chokladboll på toppen, då är vi där och hjälper dig att tjäna pengar på den.


    Ni har kanske hört talas om det Agila Manifestet. Ett gäng skäggiga hippies träffades i mitten av ingenting, gjorde hippiesaker en helg och kom ut ur dimman med följande:

    Manifesto for Agile Software Development

    We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, we value the items on the left

    Observera hur de påpekar att det är sakerna till höger som faktiskt har värde, men att de “värderar” det till vänster mer. Det är ungefär samma sak som när föräldrar säger till sina barn “Ja, vår bil är värdefull, men jag värderar grytlappen du gjorde i slöjden mer”. Det är för väl att det till slut kom in några ekonomer och röjde upp i den här röran.

    Nu undrar ni, men var är affären i allt detta? Det är precis det jag tänkte berätta för er.

    SLADOS Manifesto for Agile Software Development

    We heard that others had uncovered better ways of charging money for developing software by talking a lot about it and letting others do it. We want a part of this.

    Så, välkommen till SLADOS, det enda du behöver komma ihåg för att överleva i den agila djungeln.

    Vi tillhandahåller best-practice kunskap och modern, banbrytande merchandise. Traditionella agila processer pratar om lärandet av agilitet, att det är som att följa en stig med en odefinierat mål. Det är säkert toppen om man är ett Linuxanvändande linssoppeätande grottmiffohippie, men för oss som vill tjäna pengar så finns SLADOS. SLADOS låter dig vara precis så agil som du vill samtidigt som du fortsätter arbeta på samma trygga sätt du alltid gjort.


    Traditionella Safe, Lean, Agile Devops Scrumban metoder för mjukvaruutveckling misslyckas ofta med att leverera mjukvara som uppfyller de i förväg uppställda kraven på tid och på budget, vilket ju är det minsta man skulle kunna kräva av något som kallar sig för metodologi.

    En del säger att det är karaktäristiskt för mjukvaruutveckling och att man inte kan förutsätta hur lång tid någonting tar om man inte gjort det innan. Vi säger att man man inte försöker tillräckligt mycket.

    Och när folk inte försöker tillräckligt mycket, vad behövs då? Helt rätt, management. Att tala om för folk vad de skall göra är vad ni chefer är bra på, och SLADOS kommer att få er att briljera.

    Att hantera alla metoder

    Vi vet att problemet med att vara agil inte är att ändra ledarskapsstil, korta ned feedbackloopar eller att lära sig tredje versen till Kumbaya till nästa retrospektiv.

    Nej, det stora problemet för dagens agila organisationer är att hänga med i det eviga flödet av nya agila metoder som dyker upp, med alltmer orimiliga namn såsom:

    • Scrum
    • DSDM
    • Crystal Clear
    • Lean
    • Kanban
    • Scrumban
    • Leanban
    • Kanbanban
    • KanbanOps
    • LeanOps
    • Rupban

    Idag introducerar SLADOS ett produktpaket som hjälper er att hantera er agila-metod-portfölj. Alla SLADOS enterprise kunder kommer att få en kopia av vår kvartalsvisa utgåva av Agile Methodology Radar, där våra agila marknadsföringsexperter listar vad som är inne och vad som är ute i den agila världen.

    Agile Methodology Radar

    Med tanke på agilrörelsens rötter i Japan så är det här inte så konstigt, det är helt enkelt som Pokemon - man måste fånga alla. Detta leder oss till en annan SLADOS produkt som vi lanserar: samlaralbumet Mina Agila Metoder.

    Mina Agila Metoder

    Här kan man samla kort på alla agila metoder samt sina favoritagilister. Man kan ta med sig albumet till agila konferenser och byta kort, man kanske har en dublett på säg Leanban, eller så kan man ha den liggande på soffbordet där hemma.


    Alla dessa metoder har naturligtvis också certifieringar, vilket ni som representanter för seriösa organisationer naturligtvis vill att era medarbetare skall ta del av. Det blir väldigt många certfieringar.

    Som SLADOS kund har man tillgång till de officiella SLADOS-certifieringarna. De är i sin tur är paraplycertifieringar för alla submetoder som SLADOS innehåller. Man prenumererar helt enkelt på ett visst antal certifieringar, och om det kommer fram en ny metod typ LeanbanOps som tas upp av SLADOS, så blir man automatiskt certifierad även i den. Vid eventuell tvekan vill jag påpeka att våra certfieringar är certifierade av de allra bästa certifieringscertifierare.

    Det är inte nödvändigt, eller möjligt för den delen, att skicka era anställda på någon faktiskt utbildning i samband med certifieringarna. Det innebär ingen praktisk skillnad mot tidigare, det är ju inte så att certifieringar innebär någon skillnad i kunskap. På det här sättet så tjänar vi pengar och era anställda missar ingen värdefull produktionstid. Total win-win.

    Enterprise Scale

    Om en mjukvara släpps och ingen har mätt velocity, finns den? Kanske hos några användare, men inte i din nästa 360-review.

    Riktig mjukvara definieras inte av vad som byggs utan av vem som bygger den. Att skriva Hello World är enkelt, att göra det med 1000 utvecklare, förlåt, heltidsekvivalenter, är svårt.

    Ett litet team skriver bara koden som behövs, men om det inte räcker? Vad händer om man dessutom vill ha Rose-diagram, en IEEE expertkommitee på Hello World, dokumentation, patent, samt en klar och tydlig arbetsbeskrivning med toll gates, dead lines, avstämningar?

    Var är er Scrum nu?

    För detta räcker inte de gamla metoderna.

    Ikväll introducerar SLADOS enterprise konceptet Constraint driven development, där begränsningen är att du inte får använda mindre än 1000 utvecklare.

    Vem har tid att ändra i en organisation om man rattar ett projekt med 1000 utvecklare? Ingen. För våra enterprisekunder som har problem att få intern acceptans för agila metoder erbjuder vi även möjligheten att få officiellt branda om sin traditionella metod som en accepterad, auditerad agil metod. Här samarbetar vi naturligtvis med våra certifieringscertifierare.


    SLADOS är en helhetslösning för att bli agil och för att navigera den ocean som är den agila världen. Vi ser till att ni kan fortsätta göra det ni alltid gjort, och bara byta namn.

    Att andra helt annorlunda organisationer kommer att förbättra sig via verklig förändring kommer bara att öka entusiasmen för er nya metod.


    De vanligaste frågorna vi får:

    Q: Hur förhåller sig detta till CMMI och ITIL?

    A: Som tre Legobitar som passar jättebra ihop.

    Q: Är det kompatibelt med SharePoint?

    A: Ja.

    SLADOS Talk At Agila Sverige

    I gave a dinner talk yesterday at the Agila Sverige conference which was fairly rantish about the state of the agile world. The text of the talk is available here (in swedish).


    Bernard commented on my thoughts on schema evolution. > I do not see why schema evolution is harder to handle in Prevayler > than it is with a relational database. Changing relations is always > a problem whatever the storage strategy you use.

    Hmm, let’s see. Maybe I was very using traditional thinking. My thoughts were that it is easier to transform bare data as it is less to transform. You take the old data and insert it into the new code, which is all you need because you don’t want the old implementation anyway.

    But you’re saying that with Skaringa I transform the Java object graph to XML, transform that XML data using XSL to a new XML format matching the new code and deserialize it. Whoomp, there it is? Sounds very nice. > Next, do you truly believe SQL is the best way to query your object > model?

    No, not my object model, not at all. However, we may have to provide a tabular data model for analysis purposes outside the scope of our application. The standard way to access this is using SQL. This is the only reason I want it

    I also have this nagging feeling that many customers will want their data in a RDBMS because just because it has always been there. What would we do there? Delete and insert for every snapshot?

    This morning Jon had a good way of formulating what I wrote on the two persistence needs: “RDBMS do two things: OnLine Transaction Processing and OnLine Analysis Processing. After Prevayler we only need OLAP.” > Well, stay tuned, or better help the people working on the XML > export for Prevayler. As said before, SQL is in my opinion not the > best thing because it requires mappings between your objects and > your relation database. And ODMG API would probably be better. > Carlos Villela wrote a XPath query demo

    We will definitely work with Prevayler to enhance this functionality. As for JXPath, already there :-).

    Saying hello to our old friend Ant

    Alef Arendsen ponders on whether to switch from Ant to a Ruby build tool. At Lecando we just this week finished migrating away from a Ruby based build system we called Raven. Our former employee HÃ¥kan speaks in his blog entry from way back then about the enthusiasm we shared. Of course, Håkan speaks of our migration from Maven, the build tool from hell of which one should not speak.

    So we’ve now gone full circle - Ant - Maven - Raven - Ant. So what happened and why?

    Our build.xml used to be a trillion lines long and quite unmaintainable. When we first saw Maven we thought “Easy targets due to standard directory organization, automatic dependency downloads and we will probably read that really nice webpage thingy very often. Way cool, we want that”. Since we never have hesitated to throw new fun explosive stuff onto our e-learning fire we pushed all our directories around, picked up the ball and ran with it.

    I looked at our old project.xml file today. Man, that thing is ugly. As Cedric points out, Maven is really four languages, and Jelly is one of them. Ouch.

    At that time we were bitten by the Ruby bug due to a number of reasons, two of them being Jon, head chef of Damage Control who had just left us for new frontiers, and Anders Bengtsson who used to work for us but is still a good friend of some of the guys. This combined with our craving for a shiny new build system made us roll up our sleeves and start to build our own build system in Ruby, Raven.

    When you start to build a new file system you most probably start with the easy pieces. “Let’s see … compile? That’s good - we need to compile in our projects. And we can set our classpath in a really non-obtrusive way. Oh, this feels so good, I’m glad we’re doing this. And next … Test? Awesome, we’ll be done in no time.”

    … A little later …

    “OK. it is not a good as in the beginning but we’ll refactor it. Now we just need to build the docbook docs, package the war, pack it up in a ear, zip that up with all external docs and whatnots and we’re done.”

    Spoiler: The resulting build was as hard to maintain as the previous ones had been, albeit in a prettier syntax.

    I believe it is exactly the same thing as when you start out with your Ant build file. As long as you’re setting up the compile and test part everything is really clean, but when you get into the specifics that is needed for your app like for example signing an applet - we used to do that - things get dirty. And it does not matter what language you do it in, it is complicated even in plain English, or Swedish. (“Take those files and sign them with that certificate file over there to produce an applet as a jar for Netscape, and when your done you take the same files and sign them again, but this time with that certificate file over there for Explorer, and, oh yeah, make it a CAB file. Don’t mess up or the browser barfs”)

    While we were doing this, things happened in Ant land. Imports and Macrodefs solved a lot of problems, making build files readable. IDEA even provides code completion and refactoring support for Ant. As you might suspect, we did not have that for Raven. We slowly accepted fate and began the walk back into XML. However, among the brackets are a few goodies in addition to the ones above.

    Ants platform independency is king. Visar, our designer guy, can run the app from his Windows box as well as we do on our Linux ones. I know, Ruby is supposed to be platform independent, but unfortunately it works in the same way Python does it - almost.

    We have even rolled our own CruiseControl in Ruby. We really did not like CruiseControl two years ago so we might not use it now either, but at least now we have the choice. I’ve read a lot of good things about it recently and if it is good enough for Mike Clark it must be good enough for us as well.

    To sum it up, Ant is a standard which in itself might not be the best thing at all, but with all the support for it it certainly comes out on top for us.

    Schema evolution

    Jon and I had a pretty heated discussion today over serialized objects. The background is as follows:

    Using Prevayler, you will have a file on your disk with your serialized object graph. This stores the state of your application, but, very important, also the implementation of that state. When deserializing the object graph, you do not retrieve properties that are set on “new” objects, you are retrieving the object itself. Like, duh.

    This introduces a problem when changing the object schema. If you update your application and the new runtime has a different set of classes, you’re screwed. Sure, changing the name of a property or class can easily be done, but what if relations are changed?

    Now to my thoughts: The problem is that the serialized object holds too much info in the upgrade scenario. We don’t want to know the implementation then, we only want the state. We thus need to transfer our snapshot from a serialized form to a form with less info. If we can do this we get away from what Joshua Bloch in “Effective Java” describes as making our private code be a part of the API. Using this, we can insert this data into a upgrade program and setup the new object graph. This is not ideal but it works. (Agree so far Jon? :-)

    One good thing about a relational database is that it stores a bare minimum of information regarding system state. This means that the dynamic implementation, your runtime, can change and the static, stored, state is changed with a minimal effort. This is truly Good.

    But that is not really what is good with a relational database. What is good is the tabular data model. It could as well be described in another format such as any homegrown xml-format. So what is good about relational databases?

    I can’t believe I’m writing this, but the good part about relational databases is, argh!, SQL. It is the standard way of retrieving information that is the catch. It is Crystal Reports and Excel. People want this. Not me. Other people. I wish we could just do a XML-serialization, which is all we need for updates, but I know customers will want the SQL support so that they can use their tools. Anyone know of any XML tools with SQL support? (Probably very common, I haven’t looked yet)

    A long time ago somebody suggested that Java should provide a versioning system, so that a class is not only defined by its name but also by it’s version. I suddenly realize that this is new no 1 of my “Things I want included in Java” list. This would solve the schema evolution problem since every new version of a class could have a constructor that took the old version of the class as an argument.

    As I see it, persistence is needed in two different ways. 1. In the running application where the data is strongly coupled with the code and performance is very important. 2. Snapshots for data analysis and updates. This data needs to be “flexible” but performance is generally not an issue

    To me, RDBMS solves number 2 very well. I used to think it was half decent at no 1 as well.

    Ok, to sum it up, I want to be able to convert the Prevayler snapshot to an XML equivalent. I want that to be readable through SQL. I want a Java to handle versions. I want World Peace and free ice cream.

    Screencasts with Wink

    I’ve tried a few tools to do screencasts, my favorite so far is Wink.

    Notable features:

    • Easy to use
    • Manual capturing
    • Insertion of text into images
    • Multiple export formats

    Separating the View And the API

    Assaf writes about using Hahlo and Fluid, and I find this paragraph especially interesting:

    A great Web app uses persistent, readable URLs for every interesting resource. Twitter does that, so it’s pretty easy to share links to people, statuses and other points of interest. Hahlo hides the entire user interface behind a single URL, but it works extremely well because Hahlo is just a front end, Twitter is the system of record. If I need to link, I wouldn’t be using Hahlo links anyway (although link discovery is missing in the current version).

    Perhaps this is a good way to both have the cake and eat it? Have a restful, share nothing API, which is accessed by a separate GUI app built in say Seaside that can use state as much as it wants.

    Setting Browser DPI Settings in Linux

    I have a Lenovo X1 Carbon that has a 14 inch screen with a 2560x1440 resolution. While not quite Retina Display quality, it still has enough pixels to make everything on the screen appear tiny with a regular 96 DPI setting. Trying to fix this in browsers by increasing font sizes breaks quite a few sites, while custom DPI settings works better.


    Open about:config and set the property layout.css.devPixelsPerPx to the desired value, in my case 1.3.


    To change DPI settings in Chromium, start it with --force-device-scale-factor=<value>. If you don’t want to launch chromium from the terminal you can edit the .desktop file, on Debian it is located at /usr/share/applications/chromium.desktop

    Locate the line that looks like exec /usr/bin/chromium %U and edit it to look like exec /usr/bin/chromium --force-device-scale-factor=<value> %U, and you should be good to go.

    Setting up Bahnhof OpenVPN with Network Manager

    Setting up the OpenVPN on NetworkManager is easier than the official docs describe. Instead of manually entering all the data, you can use the client.ovpn file included in the .zip downloaded.

    When creating the OpenVPN connection, select “Import a saved OpenVPN configuration …“.

    Select 'Import a saved OpenVPN configuration'

    Then select the client.ovpn file. You probably want a better connection name than “client” so make one up and fill it in. Enter your username and password, save and connect.


    Shuttle Launch Seen From ISS

    If you haven’t seen these, you’re in for a treat.


    Förra onsdagen föddes mitt och Cecilias andra barn. Det blev en kille som skall heta Simon. Allt är toppen.

    Simple beats complicated

    Peter Krantz sent this clip from a Capoeira fight (rating: violent) which I see as a really good analogy for XP’s YAGNI and the simplest thing that could possibly work.

    Sinor 0.3.0 Released

    I just released 0.3.0 of my static blogging tool Sinor.

    Major new features in this release:

    • Tags support
    • Markdown can be used in archive pages
    • Improved command line API

    It can be installed either by pip install sinor or by downloading it directly from Github.


    Hela huset är en sjukstuga, Ellinor är fortfarande sjuk och har dragit med sig Cissi i fallet. Jag håller dock ställningarna. Dessutom fick humöret sig en skjuts uppåt igår när posten kom med min nya xbox. Ja, jag är en prylbög. Jag plockade hem den på Tradera för ett överkomligt pris, och fick med tre spel jag ville ha, och två som jag skall till TVspelsbörsen med för lite bytesverksamhet. Jag vill ha nya FIFA.

    Annars är det bara att fortsätta planera min födelsedag som infaller i övermorgon.

    Dessutom har jag startat en techie weblog. För den tekniskt intresserade.

    Skeleton For Responsive Design

    I just managed to get this site to display properly in a mobile browser with media queries, which means I am now among the cool responsive design kids.

    If you, like me, use Skeleton, it turns out that you shouldn’t forget this line in your head

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">


    In Swedish, biathlon is called “skidskytte”, or ski shooting. I always found these two-sports-in-one-sports kind of funny, because you can really just mash any two sports together and voilá: a new sports.

    So while I was learning Clojure I built a simple web site that generates new sports for you called Skidskytteroulette which basically means biathlon roulette. I know, not that funny in english.



    This is the English version of a talk I gave at the Agila Sverige conference dinner 2015-06-03.


    Good evening consultants and managers!

    My name is Marcus Ahnve, and I represent SLADOS, Safe Lean Agile DevOps Scrumban. The name is automatically generated once a month by a script that searches Google for trending agile words and creates a pronounceable acronym from them.

    Before I get started, let me just assure you that SLADOS is for you. SLADOS is for everyone, including you in the back leaving. SLADOS is for everyone, even those who don’t want it.

    In the modern software development world, the new yardstick is how agile you are. And we know that you’re tired of being less agile than the others. We know you hate picking the kids at kindergarten and having to listen Lisa’s stupid mom, “Well, our velocity is 314 now.”

    SLADOS is for you! In a time when agile software development has become the methodology equivalent of a large danish ice cream, meaning 3 kg ice cream och whipped cream in a wafer traffic cone, with a chocolate ball on top, we’re there to help you make money out of it.

    The Manifesto

    You may have heard of the Agile Manifesto. A bunch of bearded hippies met in the middle of nowhere, did hippie stuff for a weekend and came out of the fog with the following:

    Manifesto for Agile Software Development

    We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, we value the items on the left

    Please notice how they actually point out that it’s the stuff on the right that has actual value, but that they “value” the stuff on the left more. It’s like when parents tell their kids that “Yes, our car is valuable, but I value the painting you did in school today more”. I’m happy to say that finally some real economists are here to clear this mess up.

    Now, you’re probably wondering where’s the business in all of this? Well, I’m here to tell you.

    SLADOS Manifesto for Agile Software Development

    We heard that others had uncovered better ways of charging money for developing software by talking a lot about it and letting others do it. We want a part of this.

    So, welcome to SLADOS, your one-stop shop for surviving in the agile jungle.

    We provide best-practice knowledge and cutting edge merchandise. Traditional agile processes talk about learning agile as following a path with no clear destination. That’s probably great if you’re a Linux using, lens soup eating cave dweller, but if you, like us, want to make money, there is always SLADOS. SLADOS let’s you be exactly as agile as you want to be while continuing to work in the same comfortable way as before.


    Traditional Safe, Lean, Agile DevOps Scrumban software development approaches often fail to deliver software that meets business requirements on time and within budget, which is the least you should expect from a something that claims to be a methodology.

    Some people say it’s an inherent trait in software development, and that no one can predict things that hasn’t been done before. We’re say they’re not trying hard enough.

    And what’s needed when people aren’t trying hard enough? That’s right, management! Telling people what to do is what you managers are good at, and SLADOS allows you to excel.

    Handle All the Methodologies!

    At SLADOS, we know that the problem of being agile is not changing management ways, or shortening feedback cycles, or learning the third verse of Kumbaya for your next retrospective.

    No, the main problem for today’s agile organizations is keeping up the ever flowing stream of new agile methods that keep popping up, with even more ridiculous names like:

    • Scrum
    • DSDM
    • Crystal Clear
    • Lean
    • Kanban
    • Scrumban
    • Leanban
    • Kanbanban
    • KanbanOps
    • LeanOps
    • Rupban

    Today, SLADOS introduces a product package to help you manage your agile methodology portfolio. All SLADOS enterprise subscribers will receive a copy of our quarterly Agile Methodology Radar, where our agile marketing specialists lists what’s in and what’s not in the agile world

    Agile Methodology Radar

    Given the Japanese roots of Agile, it’s not so strange that we have all these methods. It’s just like Pokemon, gotta catch ‘em all. Which leads us to another SLADOS product that we’re launching tonight - the trading card album My Agile Methods.

    My Agile Methods

    This album allows you to collect cards with all different agile methods, as well as your favorite agilists. You can bring the album to your next agile conference to trade cards - you might have two Leanban cards for example. The album will also make a fine coffee table book.


    All these methods require certifications, which all you representing mature, serious organizations want your coworkers to have. That means a lot of certifications.

    All SLADOS customers have access to the official SLADOS certification. It is are in turn an umbrella certification for all sub methods that SLADOS contains. You simply subscribe to a certain number of certifications, and if a new method, say “LeanbanOps”, becomes popular, you will automatically become certified in that one too. At this point I want to stress that our certifications are certified by the finest certification certifiers available.

    There is no need, or even possibility, to send your workers for any actual certification training. This does not make any practical differences to what you may be used to, as a certification doesn’t imply any sort of knowledge of the certifiee. This way, we make money, your workers don’t miss precious production time, and you still get the certifications. Total win-win.

    Enterprise Scale

    If a software is released and no one has measured velocity, does it exist? Maybe for a few users, but not in your next 360 review.

    Real software is not defined by what is built, but by who builds it. Writing a “Hello World” is simple, doing it with a 1000 developers, sorry - full time equivalents, is hard.

    A small team only writes the code that is needed, but what if that’s simply not enough? What happens if you also want a Rose-diagram, an IEEE “Hello World” expert committee, documentation, patents, and a clear working procedure description with toll gates, dead lines and sign offs?

    Where is your Scrum now?

    The old agile methods simply aren’t enough here.

    Tonight, SLADOS introduces the enterprise concept Constraint Driven Development, where the limitation is that you’re not allowed to use fewer than a 1000 developers.

    Who has time to change an organization when you have to run a project with 1000 full time equivalents? No one. Many of our enterprise clients have a problem getting internal acceptance for agile methods. We now offer them the possibility to officially brand their traditional method as an accepted and audited agile method. In this, we’re of course working with our certification certifiers.


    SLADOS is a complete package to help you become agile and to navigate the ocean that is the agile world. We allow you to keep doing whatever you’ve been doing, and just change the name.

    The promise of other, completely different organizations, improving by actual change will help keep enthusiasm for this new process alive.


    The most common questions we get:

    Q: How does this fit together with CMMI and ITIL?

    A: Like three pieces of Lego that fit really well together.

    Q: Is it compatible with SharePoint?

    A: Yes.

    Smidig Videos Are Up

    The videos from Smidig 2008 are up. This is mine (in Swedish):


    I came back last night after two great days of conferencing at Smidig2007 in Oslo, Norway. The mornings where all lightning talks and the afternoons where reserved for open space discussions. I gave a lighnting talk on the experiences we have had at WeMind trying to implement a lean enterprise, and I initiated two open space sessions, one on the GUI artists role in an agile process and the other on what makes different languages have so different communities and cultures. I will expand on those in later posts.

    During the two days I had the pleasure of hooking up with Niclas Nilsson, Aslak Hellesøy and a bunch og other great people. It was very stimulating discussions and I am really motivated into doing a few new things with our own testing/speccing.

    It was all in norwegian, so all you non-scandinavian speakers out there are really missing out on something - finally a reason to take that class in swedish or norwegian you always thought about.

    Photos and a few deeper comments are due later, but for now: a big thanks to my norwegian friends for a great time.

    Snurrar just nu

    Lyssnar mest nu på:

    • The Sounds
    • Queens of the Stone Age
    • Ladytron
    • Marilyn Manson
    • White Stripes

    Soft Cell?

    Säg just i hotstuffs mail att Soft Cell släppt ny singel. Hallå, varför säger ingen nåt? Beställning på g. Skall kolla Diskodiktator också, namnet är värt 139 pix. Och så är det dags att skaffa Covenants alla skivor - bra!

    Annars kan jag varmt rekommendera Olle Ljungströms nya. Inga direkta hittar, men skönt eget.

    Ellinor headbangar till Metallicas Sad But True. :-)

    Some Very Basic Code Standards

    Whilst on the topic of aggravation:

    * Returns the url for the link
    * @return the url for the link
    * @param oFooUtil the foo util
    * @param sSomething the something
    * @param iAge the age
    public String getRelationPath(FooUtil oFooUtil, String sSomething, int iAge) {
    1. Do not name your methods deceptively and keep the correct information in the javadoc only
    2. Do not use hungarian notation. It is extra useless in Java as it is an object oriented language which means that many, many variables will be prefixed with o.
    3. Do not comment the obvious

    Speaking at DevLin 2011 with ShowOff

    I am in Linköping for Devlin 2011 where I will give a talk named “Git - Version Control You’ve Only Dreamt Of”. It is a one day conference organized by my friends at Responsive

    I did the slides for this talk in ShowOff, which allows me to write my presentation in text and version it in Git. Firefox 4 supports SVG well enough for me to use it for all my images. This allows me to just save and directly use whatever I draw in Inkscape, no exports required.

    Speaking at DevLin2012

    I will give my talk on “Design for Replaceability - Architecture For An Agile Lifestyle” at DevLin2012 Thursday next week. I was quite happy how the talk was received at JFokus, and will incorporate some of the great feedback I got. This time I will only have 25 minutes though, so I will either speak very fast or cut out some slides.

    I had a great time at DevLin last year and l reallly look forward to this years conference.

    Speaking at Smidig 2008

    I am happy to say that I will give one of the lightning talks at Smidig 2008. My presentation is about optimizing the whole product chain, from concept to cash, and stop focusing on projects as they fragment the organization and cause local optimization.

    Last years conference was great and inspired us here in Stockholm to do our own version in the form of Agila Sverige. I am really looking forward to going back to Oslo.

    Speaking at Smidig2007

    I just got an email saying that my lightning talk proposal for Smidig2007 was accepted. I will speak about the experiences we have had at WeMind when trying to run a lean enterprise.

    I am really looking forward to this conference, it is all lightning talks and open space.

    Spring Is In the Air

    Spring surprised us early this year, so we are currently blessed with a mild 10ºC. As everyone who has ever experienced it knows, the early days of spring after the long dark winter are just wonderful


    The photo is taken with my SE K610i, and stitched together with DoubleTake, which deserves a mentioning. I noticed today that I had lost my license for it, so I sent an email to EchoOne explaining the situation. I got a reply with my license within 4 hours. Great stuff.

    Steve Jobs and Agile

    I was listening to the podcast of the interview with Steve Jobs and Bill Gates, and this one thing struck me. When asked to predict the future, Bill Gates provided some insightful guesses, while Steve Jobs simply answered “I don’t know”. Twice. Steve’s explanation was that five years ago he would not have predicted what we have today, so therefore he does not trust himself to say what the next five years will look like.

    I have previously spotted Apple to be early agilists, and Steve’s position here enforces my claim.

    One important aspect of grasping agile in my mind is to accept the fact that you cannot predict the unpredictable. Instead of making detailed plans to support the illusion that you know what is going to happen, you say “I don’t know”, but then let that knowledge, that you actually do not know be the base for how you approach your work.

    I have many times been faced with the quest of predicting the future, “how long will it take?“. As I have become more experienced I have learned to say “I don’t know”, of course at the same time offering an alternative iterative approach that will eventually provide knowledge for better estimation. Sometimes that is not a popular answer, and the question is forwarded to someone who will answer it. Of course, they do not know, but the illusion of control is very powerful, so their answer is better received.

    I guess that many CEO are pressed to predict the future, by employees, share holders etc. And many times they probably provide an answer that they themselves do not believe in. It appears to me that Steve Jobs does not fall into that category.

    Stockholm Syndrome and blameability

    Sometimes I get the feeling that a lot of people in programming suffer from some sort of developers Stockholm Syndrome. I mean, everybody whines about clueless management, we’re not allowed to do this and that, yadda-yadda whine-whine.

    But then when presented with a option like Agile methodologies and XP which actually provides the power to decide about the things that should matter them as techies (because that is what XP is all about, you have the right to produce quality code given clear guidance under your own estimates and you go home by five etc), what happens? More whining.

    It’s so comfy to blame clueless management for giving to little time, selecting a inferior platform and prioritize features over quality code. Many developers are simply not used to accepting full responsibility for their work. They’ve grown accustomed to the safetynet of blameability and need somebody else to take the responsibility if something should fail.

    Kent Beck mentions courage as a essential factor for success. It is very true.

    Stockholm is not Portland

    Sitting in Stockholm reading blogs, it feels like being home on a friday night knowing that there is a great party going on and you are not going.

    Sun buys MySQL - what about PostgreSQL?

    There is one thing that strikes me in the Sun MySQL thingy - what about Sun’s previous commitment to PostgreSQL, where they say stuff like: “PostgreSQL for Solaris 10 is the open source enterprise database platform of choice”?

    PostgreSQL for Solaris

    Tim Bray comments on the deal and totally dismisses any alternatives:

    MySQL, you know, in my experience, it, well, Just Works. Runs great on our hardware and OS. Well, OK, GNU/Linux too. What else is there? For databases, nothing that matters.

    I strongly prefer PostgreSQL over MySQL, and I have previously used Sun as a reference for it. Perhaps no more.

    Super Sunday

    Om två timmar brakar det loss. NFL:s bästa anfall (Oakland Raiders) mot NFL:s bästa försvar (Tampa Bay Bucs). Jag hoppas på Oakland.

    Svensk fotboll

    Man får fälla ned blicken, bita ihop och erkänna att Djurgården är värdiga svenska mästare i fotboll, och att det nog dessutom är bra för svensk fotboll att de är det. De spelar en offensiv och modern fotboll som är den sorts spel som behövs spridas för attvi någon gång skall ha chans att passera kvarten i VM.

    Däremot är det deppigt hur dålig allsvenskan är. Djurgården och Malmö etta och tvåa, två lag som kommit upp de senaste åren. Vad säger det om standarden? Lägg till detta det faktum att vi får gå tillbaka till AIK’s Champions League äventyr för att hitta den senaste insatsen som ett svenskt klubblag gjort utanför våra gränser som inte kändes direkt pinsam.

    Jag skulle nästan bli glad om DIF fixar hem Linderoth och/eller Zetterberg och ser till att kanske med lite tur ta sig till CL. Det skulle nog vara bra för alla.

    Symptoms vs. Causes

    There latest storm in the teacup that is Swedish IT is caused by the national news agency TT decision to move from OpenOffice to Microsoft Office, mainly because ‘I (head of development) do not want to sit here wondering how I will connect OpenOffice with a hundred eleven other systems’. I believe ‘a hundred eleven’ is a long form for ‘a lot’.

    This has in almost deterministic fashion caused people from both sides of the OSS-MS divide to wave their party flags. But no one asks the to me more obvious question - why do you connect your office suite with all those systems, and why is that a problem if you do not have Microsoft Office? Seems more like an architecture question if you ask me.

    Synten lever

    Fick hem Soft Cells nya singel “Mono Culture” i fredags. Toppen. Lite Chemical, samtidigt som Dave Ball är lika bra som vanligt på arrangemang.

    Skall snart få hem hela albumet, samtidigt som Covenants nya landar. Vad vore man utan Hot Stuff?

    Tung musikhöst, snart kommer Suedes nya också.

    System Fonts

    Lately I’ve noticed people mentioning the use of system fonts in web design. Supposedly it all started with Medium a year ago, described in this article. The idea is that the web experience should not differ that much from what the rest of the client UI looks like.

    I think this is great, I’ve felt for a long time that the web should settle on some sort of UI toolkit for the most common tasks. It’s like the whole world is doing a Kai’s Powertools, if you remember that.

    However, it turns out that I’m not better than anyone else, as I’ve been using custom fonts on this site. In the spirit of continuous improvement, I’ve switched to system fonts by using approach B mentioned in the article above, which hopefully should work out for everybody. Please ping me if it looks weird somewhere.


    Tyskarna Från Lunds platta är unik. Den bästa beskrivning jag kan ge är att de är synthmusikens Victor Borge, ni vet den där skojige danske farbrorn som spexade vid pianot.

    Musik och humor brukar bli Svenne Rubins. Kul text, kass låt. Grejen med TFL är att de lyckas skapa musik som i sig refererar till annan, gärna tysk, musik. Alphaville-slingor i Scorpions-covern “Still Loving You” är enormt tyskt och enormt kul. Min dassiga tyska gjorde att jag inte kopplade vad “Eis Auto” handlade om genom att läsa titeln. Nu vet jag hur det hade låtit om Ralf och Florian hade fått uppdraget att skriva glassbilslåten.

    Victor Borge skämtade på samma sätt med den klassiska musiken som TFL går med synthen. Stort. Detta är en humorfylld kärleksförklaring till synthmusiken, rekommenderas för er som kan er Kraftwerk.

    Tech Day By Init 2017

    En praktisk genomgång av verktygen, hur och när man använder dem, där allt körs live.

    Testing BloGTK

    Testing to blog from BloGTK. I’m not sure that I really see the point of this. It maybe good for off line use, but then I’d probably use JEdit and save it as a .txt file anyway. Oh well.

    Testing mo:Blog

    I’m in the subway on my way to my moms boyfriends daughters birthday party, using the time to test blogging from my Palm. Seems to work quite decently actually.

    The Four Programmers

    A must read

    (Via Labnotes.)

    The Good Pragmatic Developers

    Java in 2008: “These are people who aren’t religious and aren’t close-minded and just want to Get Shit Done. Oh, and they’ve already got a lot of it done and they aren’t interested in discarding that investment.”

    (Via ongoing)

    The Lazyweb

    Yesterday I twittered that I was trying to find a version of Ruby that both cc.rb and Rails likes. Last night, Wordpress plugin Twittertools posted yesterdays twitters to this blog. And this morning, I have an answer from Alexey Verkhovsky what the good versions are. Gotta love the lazyweb.

    The Programming Language Is Your Most Powerful Tool

    Ola is so spot on with this one:

    A New Hope: Polyglotism: “The one thing that I am totally sure if is that we need better tools. And the most important tool in my book is the language. It’s interesting, many Java programmers talk so much about tools, but they never seem to think about their language as a tool. For me, the language is what shapes my thinking, and thus it’s definitely much more important than which editor I’m using.”

    I do not know how many discussions I have had with Java developers who questions Ruby et al. because there are no IDE’s with the same feature sets as those found in Java.

    (Via Ola Bini on Java, Lisp, Ruby and AI)

    The Wifi Access is Getting Worse

    This is a short test to see if I can post at all :(

    The closing of script tags

    I found a bug in my HTML code today running Firefox 3. <script> tags must supposedly be closed by a </script> and not by the less verbose but obviously wrong <script/>, as explained in this dismissed bug report.

    If you insist on using <script/> FF3 will punish you with a blank page caused by the body tag being self closed, <body/>. Sort of: “You close your script tags like that - I’ll close your damn body tag like that. Now, how do you like that???”

    I had no clue. Sorry.

    The correct Telenor Mac downloads

    I signed up for a two year plan for mobile 3G internet from Telenor, which also happens to be my current cellular carrier. Their current offer is really good, SEK 200 a month, fixed price.

    However, the link they provide to download drivers for Mac points to an old version which does not install on my machine. To get the latest and greatest. go to Option: wireless technology

    Update: Never mind. Globetrotter Connect is truly useless. I gave up and purchased Launch2Net, very expensive but it just works.

    The iPhone is truly a phenomenon

    One thing that strikes me at SIME07 is how many times iPhone is mentioned. The iPhone is not even announced here in Sweden, but still people talk about it without providing any sort of context, and this is a primarily non-techie crowd. The Blackberry by comparison was available in the US for a long time before coming to Sweden, and very few people knew about it at the time. The way the iPhone is a marketing success is truly remarkable.

    The name

    Why “Head On”? Because it’s a really awesome song by never-as-famous-as-they-deserved The Jesus and Mary Chain. And a good attitude when tackling problems.

    The power of the OpenOffice2 file format

    The Oasis document format is really cool. My wife who is an architect (the original house building version, that is) - had created a presentation in PowerPoint with a lot of images, and the resulting file was 100M+.

    I opened that file in OpenOffice2 and saved it as an .odt file. Then I unzipped it, bulk opened all images in the Gimp and changed their resolution. Finally I zipped it all up, an the presentation was now 8M and looking just the same. Ah, the power of openess.

    Things I Have Actually Used

    Robby Russell is a constant source of information on Ruby and Rails, I have used his instruction on how to set up Rails and PostgreSQL on Mac a number of times. It is therefore fun to see that I have actually used 3 out of the 5 things he wants to know more about::

    RSpec User Stories

    We were very early adopters of this one, we started using it the same day it hit trunk in a useable form. Everyone should start using it today - I cannot speak highly enough of it. The only thing I miss is a Fit-style table approach to rules, but I have my own thoughts about that one.

    Using Selenium with RSpec

    We have used the now outdated spec/ui library at WeMind. Today we use RSpec Stories almost exclusively for acceptance testing. My position is to use Selenium only where you really need it, for example to test Javascript functionality.


    I have used it for the dynamic hiding of speaker info for Agila Sverige. Not at all enough to judge a library by, but it feels a lot sweeter than Prototype/RJS.

    JSSpec (BDD for Javascript)

    Yeah, I wanna know more about this as well.

    Using the Google Charts API with Rails

    Same here.

    Other than that I would love to try out:

    • Seaside - I have dabbled with it but nothing worth mentioning.
    • CouchDB

    Thomas Looy: How Long is a Piece of String?

    Thomas Looy: How Long is a Piece of String?: “- Use working software as the only measure of the progress on a project (no more 90% completed tasks);

    • Measure using smaller sized tasks. Smaller tasks give you better measures than larger ones and will also give you a larger sampling of measures that can be used for meaningful statistical evaluations. Smaller tasks are also completed sooner and therefore give you measurements sooner that you can begin to use to extrapolate to a meaningful project complete date.”

    (Via Planet TW.)

    Hear, hear.

    ThoughWorks Free Seminars in Stockholm

    ThoughtWorks will give two free seminars at Berns Tuesday April 21 2009.

    The morning one is given by me and will be on the business value of agile and lean, and how it can be the competitive advantage in difficult times.

    In the afternoon my colleague Zack Exley will give a behind-the-scenes look at the technological side of the Barack Obama campaign.

    Both of the talks will be kicked off by our chairman Roy Singham who will give his view on why he believes Scandinavia has a great future in the software development world.

    You are welcome to attend either one of these - or both of course.

    For registration and more info please visit:

    ThoughtWorks Hosts A Track and Speaks At Scandinavian Developer Conference


    ThoughtWorks cohosting and speaking at the Emerging Technologies track at the Scandinavian Developer Conference. Ola will speak about JRuby and I will give a presentation with a title stolen from XP: ‘The Simplest Thing That Could Possibly Work’.

    It is a one day conference which I am really looking forward to - Kent Beck keynoting is reason enough to be there. See the full program here.

    ThoughtWorks Sweden Gets A Roommate

    ThoughtWorks Sweden will move in with our great friends at Agical at the end of this month. Our new address will be

    ThoughtWorks Sweden Västerlånggatan 79 2tr 111 29 Stockholm Sweden

    Personally it will be the first time I have an office in Old Town - cool.

    ThoughtWorks Sweden Is Open For Business

    ThoughtWorks Sweden has come a long way since I last posted anything about it. We have ourselves a nice office downtown, with proper phone numbers and pretty business cards.

    This means that we are available for consulting gigs, primarily in Stockholm, but we can serve basically all of Scandinavia. With ThoughtWorks global organization behind us, we offer software delivery in Java, Ruby and .Net as well as agile coaching and consulting. We are also keen to show off our products Mingle, Cruise and Twist.

    Call us, email us, come by the office for a coffee or lunch. We look forward to hearing from you.

    ThoughtWorks Mäster Samuelsgatan 60, 8 tr. 111 21 Stockholm

    Office: +46 8 5500 2100 Skype me: mahnve email me: mahnve at thoughtworks dot com

    ThoughtWorks to open an office in Stockholm?

    I just talked to Sid Pinney and Ola Bini of ThoughtWorks, and it seems that ThoughtWorks might open an office in Sweden. That would be a welcome injection to the swedish consulting market where too many players favor quantity over quality.

    Three Tickets To Agila Sverige 2008 Available

    Another thing: ThoughtWorks is sponsoring Agila Sverige 2008, and we have three tickets to give away. Send me an email or add a comment to this post if you want one.

    Throw Out the Experts


    I’ve always been a fan of Netscape, but at the same time I never liked the Communicator idea - everything in one package. I don’t have a one piece stereo either, I’m just not that kind of guy. The Phoenix webbrowser is just right for me, it’s fast and lightweight and does not bring anything else down with it if something goes wrong. If Mozilla blows up it takes the mail session with it. If, using Windows, IE blows up everything is gone, reboot and grab a coffee.

    It was therefore a pleasure to see the announcement of Thunderbird which is the mail client version of Phoenix. I have always preferred the Netscape mail client so this is truly good news. Now, if somebody could fix a Palm address book integration to go with it, I’m would be incredibly happy.

    Time For Some Nepotism (Not So Shameless Plug)

    If you are in the Stockholm area and in need to move your teeth around ever so slightly, look no further than Vasastans Tandreglering. You will get truly professional treatment which will leave your teeth in those straight lines you dream of.

    Of course this is my moms new business I am talking about. Good luck mom, you’re the best.

    Time estimates

    Joe is asking for ideas regarding time estimates.

    First of all, read Planning Extreme Programming by Martin Fowler and Kent Beck. Even if you don’t want to do XP it provides excellent ideas for planning.

    The book promotes “the gummi bears principle” meaning that estimates should not translate to calendar time. Instead stories should be measured relatively to each other. So if story A is a 2 and story B is slightly harder, then it is a 3. This requires an upstart period where you “calibrate” your measures. But after a while you get quite good at it.

    To really get away from calendar time thinking, we give stories “time points” which can be from 1 to 5. This helps developers to not think in terms if time, but instead sort of grading the stories.

    At the end of each iteration, we sum up how many time points we did. This is our velocity and stories for the same amount of time points are planned for the next week.

    It is by no means perfect, but better than any other technique I’ve tried.

    Todo.txt and Zenity

    I’ve switched back and forth a lot to try to find a todo list solution that works for me. Gina Trapani’s todo.txt is the latest one, and while not perfect I do find it useable.

    I have two zenity scripts mapped to keyboard shortcuts that allows me to quickly add and check off todo’s:

    Tool Support Should Be Loosely Coupled

    I just read the following in a month old post on the RSpec list:

    As someone who uses an IDE, I find dealing with multiple SCMs is a real pain, and one of the cool things about Ruby has been that (traditionally) nearly everything’s in Subversion

    It might be that Rails will have hard time keeping up with new stuff, both technically and culturally, since it tied really close knots with everything that was cool 2005.

    Tools, again

    Computer Swedens developer columnist Tobias Fjälling the other day answered the question “What should a good development environment include?”. (Måsten i en bra utvecklingsmiljö - Computer Sweden).

    Tobias list:

    1. Auto-complete
    2. Refactoring
    3. Navigationsupport
    4. Extendability
    5. Speed
    6. Debugger
    7. Code templates

    I find this to be spot on what Ola wrote about the other day which I already quoted:

    It’s interesting, many Java programmers talk so much about tools, but they never seem to think about their language as a tool.

    Tobias seems to be a good guy, I am giving him the benefit of the doubt and assume that he forgot.


    Bästa jullåten alla kategorier var i alla fall Tyskarna Från Lunds “Actung Xmas”. Jag föll som en sten första gången jag hörde den på P3. Klockren Kraftwerkpastich. Det enda man undrar är om bandet är “på riktigt” eftersom det verkar vara någon slags avknoppning från Varanteatern. Texterna är ju ganska humor i och för sig.


    TripIt Invitations All Over The Place

    I managed to send an invite to TripIt to everyone in my GMail addressbook this morning. This was unintentional, I guess either I am stupid or the TripIt interface is unclear.

    Anyway, as I have 500+ email addresses in GMail, and some are people I have mailed once, this might turn out to be quite awkward. So sorry about that if you got the mail and wonder why the hell I sent it.

    Unit Testing Performance

    Yesterday we discovered a small but annoying performance bug: when getting a list of languages from the JVM we did not cache them but kept on retrieving them, which turned out to be quite slow.

    So, like the good guys we are we wanted to have a test that ensured that the error was not reintroduced. We looked at JUnitPerf which seemed to be appropriate - it decorates a unit test and times it. The only problem here was that we were talking about that good performance was 800 ms, and bad performance was 1800 ms. Such timings can randomly fail on a slower computer or a computer that was busy doing something else. We do not like that kind of tests.

    So instead my colleague Jimmy came up with a much better idea: Make the test a Runnable, and run it a large number of times. In our case the good performance was 800 ms the first time and virtually nothing after, but the initial bad performance was 1800 ms every time. Then we set the timeout to 5 seconds, giving enough slack for slow, bogged down test machines, but still catching the bug if reintroduced. Good stuff indeedy.

    Upgraded and imported

    After upgrading to the latest WordPress release, I realized that I could import my early blog posts from the FreeRoller days using RSS. It was a lot of fun to read some of the old ones again and remember what was discussed four years ago. Prevayler anyone?

    Upgrading again

    Having two kids does limit blogging quite substantially. I still managed to upgrade to the latest and greatest version of b2evolution tonight which took quite a while. I managed to screw up the db upgrade, and when I tried restarting it choked on all table modifications and creations. So I had to step through all of the scripts and comment out all sql that flunked. PHP is quite unreadable really.

    Using Dependency Injection for GUI coding

    My colleague Jimmy and I spent a lunch the other day discussing client application GUI editors. We both agreed that the ones we know suck quite majorly since they create code can’t be touched, does not allow for any sort of creative programming etcetera. On the other hand, it is quite handy to see the GUI develop - not that the result always looks like the one drawn though.

    So instead he made the case that you should have a window continuously rendering the code you’re writing. Sort of like seeing the GUI develop while you code instead of watching the code die while you draw the application GUI.

    That seemed to require the GUI code to not do anything useful - be a good dumb window basically. The problem with almost all GUI code however is that listeners are implemented as anonymous inner classes, becoming impossible to mock out

    Dependency Injection to the rescue! Have all listeners talking to external whatevers become parameters in the constructors. Then they can easily be mocked, the GUI code is clean and decoupled and the sun is shining. Now, it shouldn’t be too hard to have a Beanshell2 based Java code reading GUI-viewer, should it?

    Since we’re not in the business of making client applications - anymore, that is - we haven’t tried it yet, but I’m eager to try it.


    In Sweden we tend to sing at parties, and at university so much that a standing toast master is elected for a year at a time. I held this honorable position back in the early 90’s.

    As there is no school of civil engineering at KTH anymore, some of our old traditions have died out, and some songs aren’t sung anymore.

    In order to preserve the culture of that old civilization, I built a web page with all the songs available at

    The site is built with Hugo using Semantic UI.

    Valtech Days in Dallas

    I’ll be traveling to Dallas, Texas this weekend to speak about agile documentation at Valtech Days.

    I am looking forward to attending other sessions, the rest of the conference is looking really interesting. If you are in the area and want attend the conference, I believe there are still a few seats available.


    Trying out the VimPress plugin, posting directly from Vim. Seems really sweet.

    Vintage Computing

    The Ahnve family spent the afternoon at the Stockholm Technical Museum. It was the last day of the Vintage Gaming exhibition, and man, did they have hardware to reminisce about.

    I first stopped by an old Commodore Vic-20, my first computer which my dad bought me in 1983. It was running a Tetris clone, programmed by the computers owner two years ago. He also showed me the flash card add-on card I suppose he soldered himself which replaced the tapedrive. Awesome.

    I then met Niklas whom I worked with at TeliaSonera a few years ago. He showed me an Atari 800 and some Nintendo 3D thingy. They even had an original Atari game console from 1976. Wow.

    I found a Donkey Kong Game and Watch on sale for SEK 800. So cool.

    All this time my wife stood confounded and suggested that they should have a designated place for bored spouses.


    Detta är definitivt den tid på året då man undrar varför man inte flyttar söderut. Mulet, fuktigt och kallt.

    En pensionsrådgivare sade en gång att om man bor mer 50% av året i tex Frankrike så får man ut sin pensionsförsäkring oskattad. Just idag känns det som extra bra argument att tillbringa de senare oktober-mars i ens liv någon annanstans.

    WPS Makes the Best URL's

    You can count on Websphere Portal Server to create the longest URL’s ever known to man:!ut/p/c1/hY3RCoIwGEafKP5myy7nDm3gU4kXOaN7CJikBoUPn-ToLvs-y4PhwM9xE9-CTf_CvPk79BBzwdZ6faQEYG1cAVSloojawTDjER-4YOtaVskhpCUS4KU6yQrnUGVsz2ee1t-yvHHxP44d8CymYfC0o5W5q8UnyTc4Vg9Txe4fRc4DF2GMxOvAEeRL3J/dl2/d1/L2dPQSEvUU93Q2dBISEvWUJweGx4dHcvNl9FTUhVOUIxQTBPQVZGMDIzOEFDM1FBMzgxMS82X0VNSFU5QjFBME9BVkYwMjM4QUMzUUEzOEgzLzZfRU1IVTlCMUEwT0FWRjAyMzhBQzNRQTM4SDQ!/

    Try sending that via Twitter.

    Watching the keynote

    I am following the keynote via IRC and MacRumoursLive. Why am I like so many others totally intrigued by this? I suppose a lot of people would say that it is the gadget freak in me who wants to own everything coming out of Cupertino. But to me, this is not about the gadgets per se. It is about seeing progress being made, Others make progress as well, but nobody packages it as well as Apple does.

    Web vs. Client

    For a long time, I’ve wanted to make the switch and start using online apps, but there has always been reasons that have kept me back. It seems that Dion and I share the same opinion on this one, and he sums up the problem very well.

    Weird Wifi Access

    The wifi access here at Javapolis is really weird. Surfing the web works like a charm, so does receiving mail. Sending mail seems to be a hard thing to do, as it works half the time. However, when refreshing NetNewsWire, I get no updates. That combined with the fact that I can’t post with MarsEdit makes me suspect that Proximus has some really funky settings for their wireless network.

    What He Said

    I have used Mercurial for over a year, and started using Git on Agila Sverige. I really like Git and I have therefore kept a draft blog post trying to capture why I like better than Mercurial.

    That draft was just deleted since I essentially share Dustin Sallings thoughts on the differences between Mercurial and Git. Apart from the Gnu Arch and Darcs parts - what he said.

    What is Gosling talking about?

    I most certainly hope that James Gosling was quoted out of context in this article. The way he talks about open-source is comes out very … Balmery, which is disturbing. Why is he talking about open source as a place where “any old person could check in stuff” - that is not the way it is done and he knows it. He should know it. Which is also why enterprise customers are not running away from well-kept open source projects like Linux and Tomcat.

    Not doing the “open source is the one true path” dance, let me still be very clear:

    1. Server side Java would be nowhere near the size it has today were it not for the open source community.
    2. I care about being legally clean, and it is not a nightmare (Disclaimer - I live and work in Sweden.). Gosling joins Bill and Steve using the GPL to scare people, and it is just stupid. We all know not to use GPL’d code in our commercial products and it is such a relief then that the vast majority of the server side libraries are not licensed under the GPL.

    This really made me upset in the “somebody I thought I knew did something really wrong”-way . For Gosling to come out with this blubbering, he really must be concerned over Harmony.

    What's Wrong With People?

    When parking my car today at the supermarket to take care of the weekend grocery shopping, I noticed this guy returning to his car that was parked in a spot reserved for disabled people. He was obviously not disabled, and his car did not sport the sticker required in Sweden to use handicap parking spots.

    It really gets to me when people think that rules applies to everybody but themselves and handicapped people be damned, so I walk up to him and tells him that he seems to have lost his handicapped parking permit. This guy, in his fifties, loses it and basically tells me to go to hell, get a life and drop dead.

    What the hell? How come people become so narcissistic that not only do they act totally immorally, but when told about it they have the balls to say that I am wrong?

    Does this happen elsewhere, or is this a Swedish phenomena?


    Bäst, bäst, bäst just nu: “United States of Whatever” med Liam Lynch. Måste ses och höras. Jag lyssnar på den på repeat - och den är 1 minut och 26 sekunder lång.

    When It Just Doesn't Work

    When everyone else is writing songs about their love for GMail, I am reverting to old school mutt. It is simply the fastest way to read and manage large amounts of mail (The Rails mailing list comes to mind).

    However, the default install did not work out for me, it mishandled international characters and formatting which made it unusable. After trying a bunch of options it finally came down to this:

    port install mutt-devel -ncurses -pop -imap

    Now, of course pop and imap had nothing to do with it, but I am using the most excellent offlineimap so I do not need them.

    When Revolutions Stagnate

    I am subscriber of the Test Driven Development mailing list as well as the RSpec ones. One thing that strikes me continually is the lack of innovation and new ideas in the former one, as opposed to the flurry of brilliant ideas constantly coming out of the RSpec one. It seems to me that communities stagnate and that the people who once were the revolutionaries turn into keepers of their own revolutions ideas. The free thinkers become conservative.

    Guy Kawasaki gave a brilliant keynote on the MySQL conference, talking about innovation. He said that the only way most people think about how to improve themselves is by using the tools they know more proficiently. No makers of horse carriages became car manufacturers. And the original TDD’ers are still talking about the same things they did five years ago. The revolution has moved on.

    Where is IBM in Rails?

    I have absolutely no clue as to why David Heinemeier Hanson would hold any suspicious thoughts toward Sun. To me, given the big boys in the playground, they are the good guys. But reading it made me realize that I have not heard of IBM in a very, very long time.

    Big Blue was quite quick to join the Java bandwagon, remember VisualAge for Java? But in the new world of dynamic languages IBM, apart from a few developerWorks articles, is not to be heard from.

    And this from a company who once was a strong proponent of Smalltalk? In my mind, if there is a mystery man, he and his cat is sitting in an IBM campus somewhere.

    Why I don't like Fit

    I don’t like Fit. Believe me, I want to like it, I have tried to like it. I mean, Ward Cunningham created it for crying out loud, the man is a genius, so I am probably just missing something - right?

    Every time I have looked at Fit, I always like the parts that handle column fixtures. They are clean and easy to read and generally does a really good job. Buth then we get to weird cousin Row Fixture which is not at all that easy to read and uncle Action Fixture which just won’t stop and finally family FitLibrary which does all good things but are utterly unreadble - which probably is due to my lack of experience, but then again wasn’t this intended for non-programmers?

    Geoff Bache told me at XP2006 to look into FitLibrary and Erik Lundh suggested that I read the book on Fit. So now I have done just that, and I still don’t like Fit. As a language that is.

    What the book did explain clearly, which I find the truly awesome part of Wards invention, is the idea of executable requirements written in advance. It is soo XP that you just have to love it. And I finally get why you should test the logic layer and not through the UI. Happy now?

    But the book did not address all my concerns. It does not talk about the problems with version control; if you choose to work with Excel based Fit tests you will not be able to track changes as they are binary files. Neither does it suggest how Fitnesse pages are to be kept in version control. Also, all Fit formats are hard to follow if you track changes by commit messages by email.

    The Fit syntax is in my opinion a table based DSL for writing acceptance tests. How many other programming languages do you regularly use that are table based? Excel? It is awesome for column based calculations which is the same as Column Fixtures, which I like. I alreay wrote that. But the rest is just … ugly.

    A better solution in my opinion would be a Markdown based documentation format, where code formatted text, the indented one, is executed as tests just like tables in Fit. Could probably easily be turned into a Wiki if needed. For testdata I would use Yaml. Now if I could just find the time :)

    Why REST is good and SOAP is evil

    On behalf of my employer Valtech, I’ve written a piece on why I dislike SOAP, and favor REST. I originally wrote it in english, but the published version is in swedish.

    For some REST preaching in hum-humpty-dum-dee-dum’ish go to

    Update: As suggested by people more intelligent than myself, anchor tags really should have text inside them to be useful :).

    Why Scrum is not enough

    These days when I talk to people who claim to have adopted agile development, they say they use Scrum. While standup meetings and iterative development with regular demos are good, it is simply not enough. Chris Brown posted the strip below which sums it up pretty good:


    (Via Planet TW.)

    Why The Software Factory Fails

    This talk explains the industrial history of taylorism and mass Production and how it affects the every day work of software developers today, and why it is so hard to introduce agile methods in most organizations.

    I gave this talk the first time 2008 and have given it on numerous occasions since then, refining it as I have learnt more. I was interviewed regarding this talk in Javalobby

    I have given the talk at DevSum 2008, JavaZone 2009 where it was filmed, Valtech Days 2009, [Scandinavian Developer Conference 2010][sdc2010], Agile Prague 2011, XP Meetup in Oslo, and with a number of clients.

    Why does Sun not provide a Java Communications API for Linux

    Why on earth doesn’t Sun provide a Java Communications API for Linux?

    Good thing IBM does.

    Why the Term 'Architect' Doesn't Cut It Anymore

    Some time ago, there was a lengthy debate on the Agile Sweden mailing list regarding the term “Architect”, and what it means. My position is that the term has become synonymous with the paper or PowerPoint architect, and I therefore try to stay clear of it. Other people haad other opinions.

    Neal Ford has changed his title, and describes why in a brilliant way:

    Neal Ford: From Architect to Wrangler: […] “The title of ‘Architect’ for software developers has gotten so diluted that its meaningless anymore. In fact, its almost pejorative because so many ‘paper’ architects give it a bad name. I’ve gotten ‘Oh, dude, I’m so sorry’ looks from people when I tell them I’m an architect, assuming that I’ve had a head injury or something and can’t do real development work anymore.

    […] It’s a shame that, because we have no real industry-wide certifications, the nominally most advanced title has been co-opted by so many people divorced from reality. I’ve had to defend decisions made for SOA initiatives in front of ‘Architectural Review Boards’ by people who last wrote code in COBOL. Can they really make good decisions about modern technology if they never touch it?

    (Via Planet TW.)

    Widgets monitoring automated builds

    Mike Clark at Pragmatic Automation blogs about a new CruiseControl widget to monitor CruiseControl Builds by using the new Tiger widget thingys.

    The Mac CC Widget

    Funny enough that I’ve spent some time meddling with something similar for Luntbuild and Gnome. But I have to say, that as far as graphics go, I have some catching up to do.


    Wireless Again

    My old 3Com Prism54 card for some reason did not work anymore on Linux. I finally gave in a bought a new MadWifi one which worked out of the box. Sweet!

    Word. Why?

    Why in the name of one trillion unused functions of which the one you actually use doesn’t work can something so completely dysfunctional as Word ever become so successful?

    Update: Yes, a lot of aggravation was the cause of the rant above, and yes, I actually have to use it as Pages can’t handle .dot files or quite complex table based company headers and footers.

    WordPress 1.5

    I’ve upgraded to WordPress 1.5 and the upgrade was really a breeze. The problem with the new default theme is that it is probably too good looking - people won’t change it and my blog will look like everybody elses. Dammit.

    Words don't come easy: MoSCoW and BDD

    I had a interesting conversation with Kevlin Henney at Øredev regarding the word ‘should’ and its usage in Behaviour Driven Development. Kevlin does not like ‘should’ as he feels it is too vague in many circumstances. And I have to agree with Kevlin.

    Sometime you are speccing something like “the title of the index page should be ‘ - the worlds largest social network’“, which might be something that we will change in the future. ‘Should’ is a good choice of words here.

    Another time the spec says ‘when the nuclear reactor overheats it should shut down.‘. ‘Should’ is not a good choice of word here. I’d much rather say that the nuclear reactor must shutdown, as to really say that we have no other option.

    So, let’s use both. Use ‘should’ when describing a something might change, and ‘must’ when describing something carved in rock.

    This might also help using the specs as an executable requirement. At the moment all specs are valued the same, every fail breaks the build. Perhaps there is a value in saying that certain specs are really important and should never fail. We could have different colors for different types of failure.

    Perhaps there is a use for the rest of MoSCoW?


    Wrote my own static blog thingy

    I have slowly realized that Jekyll isn’t for me. After evaluting a few alternatives like Pelican I decided to write my own, and I have to say that I’m happy with the result.

    Not that what I have written is better than Jekyll in any measurable way, but it just that it suits my needs. For example: I use Mustache templates which I strongly prefer over Liquid, and as the Python Markdown library supports metadata and Pygments code formatting out of the box, I find that the original post format is clearer.

    The plan is to start blogging more often. Being able to condense something to 140 characters is a valuable trait, but so is writing a whole article on something. I used to do it more frequently, and I have realized that I miss doing it.

    XP 1.0 is better than XP 2.0

    Alan Francis: Jobs, etc.: “[…] being an old-school XP-er who thinks Kent got right the first time and only dug a deeper hole trying to re-explain himself. ”

    Well put. XP 1.0 is mostly brilliant, whereas the additional value of 2.0 could could have been published in a short addendum.

    Kent Beck is probably the hero of the geeky part of my life and I am sorry to say that I find the quality of his work receding. Whatever he wrote or spoke about before, it was always empirically based and with a very appealing rebel touch. It seems to me that he is becoming more and more theoretical. For example, I found his keynote at XP2006 about “responsible developing” very abstract.

    Let’s hope that the book he is releasing this fall proves me wrong.

    (Via Planet TW - Alumni.)

    XP shop.

    Chiara wants to work where Jon works, which is where I work too.

    I wanna work where that boy works.

    Just so you know, we’re an XP shop :-).

    What time did Mr.Tirsen arrive?

    Our morning meetings are at ten. I believe he was in by then.

    As for the rest, sticking to architectural guidelines etc … too bad. “Do the simplest thing that can possibly work” and “You Ain’t Gonna Need It” are our mottos. Works wonders with architecture too, but it requires them “best and brightest” to come down from their ivory towers and start contributing to the code. I know a few people who feel that coding is below their skill level and dignity, so they won’t. Whatever, they will be the first to go when the revolution comes :-).

    XP, One Last Thing

    I realized that after defending PP vigourously, it would be a good idea to second what Jon wrote about XP and the synergies of the practices. Which of course, Kent Beck stated already in the white book. (The XP’ers know what I’m talking about. To the rest, it’s the first of the commie XP books.). PP is a part of a bigger, grander scheme, and seeing is believing. (Now, this might be mistaken for some Scientology offspring. One of the main differences is that you are allowed to read the books. :-)


    I am currently in Oulo, Finland, attending XP2006. I have so far attended really excellent tutorials by the Poppendiecks and Mike Cohn. I am writing this waiting for a session on DSL to start.

    This is by far the most social events I have been to, which probably is helped by there only being 200+ people here.


    Joe Walnes seems to be a really smart guy. He has released XStream, which to me seems like the only XML serializing library you will ever need.

    YUI Grids

    I had to straighten up the CSS for our public website, and I thought of looking into YUI Grids as I had heard lots of good things about it. It took me less than two hours to completely redo the layout, and the the end result was a better design, less custom CSS and better browser portability. I am a convert.

    before_filter and with_scope

    I will be speaking on the Rails Recipes Meetup here in Stockholm tomorrow. My topic will be on recipe 28 in Chads excellent book, how you can use with_scope to DRY your code.

    Whilst I have looked quite deeply into the subject - it is quite small actually - there is one thing I have yet to find out. Chad mentions that you can use wrap your actions with scoping using a before_filter.

    The thing is that the author of the patch for nested scopes provides a plugin to enable just that, but he uses an around filter which utilizes funky metaprogramming to do just that. He has a whole blog entry about it.

    I’ve asked twice in the IRC channel without any answer, and I’ve posted a question on the books forum.

    Does anybody know if a before_filter can be used?

    git Is Winning The DVCS Battle With git-svn

    I’ve been using distributed version control for over a year now, and if it is up to me, I will never use a centralized VCS again.

    When I evaluated the alternatives last year, I choose Mercurial as the DVCS we are using at WeMind. The reasons were:

    1. Usability - git was quite obscure back then
    2. Speed - bazaar and monotone was quite slow
    3. Large enough uptake - OpenSolaris and Mozilla started using Mercurial at the same time.
    4. Runs on all platforms, if we ever employed someone who wants to use Windows
    5. Built in Python which could be a good think if I ever wanted to extend it

    A year later we are happy with Mercurial, but the landscape has changed. In particular I am seeing a huge growth of people using git, especially within the Ruby community. Which in itself is something I am happy about.

    The biggest reason I see for git’s resurgence is git-svn. It allows people to start using git locally while still having Subversion as the backend, and when everyones ready the switch is easy.

    There is a hgsvn in the Mercurial world, but it is read only, so you cannot push your changes back to Subversion. I strongly believe that the Mercurial community should focus on this if it wants to regain its momentum.

    Git still has weak support for Windows, but that seems to be a non-issue in the Ruby world.

    I am pretty agnostic about which DVCS will be the dominant one. The most important thing is that people are moving away from the centralized VCS’s.

    For a great post on the subject, read what Dave Dribin has to say about it

    has_many :through and callbacks

    Reading this a little bit earlier would have saved me a lot of time. In short: callbacks such as :before_add does not work with has_many :through, and the documentation does not tell you that. To get callbacks, add them to the join model.

    iChat Video Only For LAN Internal Use?

    Me and Peter Krantz just tried to get an iChat video chat going, just to test it out. We never got it going.

    We forwarded a gazillion ports on our routers, turned off the firewalls on our laptops but to no avail.

    The thing is, had we managed to get it working it would still have been way too hard to set up for any sort of reqular use. And how often do you have access to the router anyway?

    This tells me that iChat is primarily made for internal, LAN based use. Am I wrong? Too bad if I am not.