I recently created maas-code-reviewer , which is an AI agent that reviews code for the MAAS team at Canonical. While doing so, I learned a few things that I think are worth sharing. It’s actually quite easy to write an agent. But it’s also quite easy to write an agent that eventually will expose your secrets or delete your data. If you understand how an agent works, it’s not too hard to make sure…
As many of you, I often see the claim that an LLM, or rather an LLM agent framework (like Claude Code or GitHub Copilot), wrote 100% of someone’s code. I’ve always been curious whether this could be true or not. I started playing around with using LLMs in my daily work as a software engineer at the end of last summer. In the beginning it was truly a struggle. I used an LLM to write code, but I…
A while ago I got an Orange Matchbox, which is a Raspberry Pi running Snappy Ubuntu Core together with an Ubuntu branded case and a PiGlow . The Snappy image for Raspberry Pi recently got support for I2C , so I tried to drive the PiGlow using Python 3. It turned out it wasn’t trivial, since python-smbus doesn’t support Python 3 out of the box. Further more, you can’t install .debs in Snappy, so…
I bought a Linksys E8350 router to replace the router my ISP gave me as well as an old Linksys WRT610N router. I chose the E8350, since from the setup screenshots it looked like it could do VLAN tagging, which I need. I was disappointed at first, since the UI doesn’t allow you to do VLAN tagging for the LAN ports. But it turned out that with a little bit of hacking, it’s possible to do it. Doing…
The short version is that if you want to enable middleclick scrolling for Lenovo clickpads in Ubuntu, do this in a terminal: sudo add-apt-repository ppa:bjornt/evdev sudo apt-get update sudo apt-get dist-upgrade The commands above should upgrade the xserver-xorg-input-evdev package, as well as remove the xserver-xorg-input-synaptics and xserver-xorg-input-all packages. Next you need to create a…
In short, if you want to use web.go in Google App Engine’s Go runtime environment , check out my google-app-engine branch of web.go . Using that one you can start using web.go like this: package webgoexample import ( "http" "log" "os" "web" ) var server *web.Server func init() { server = &web.Server{ Config: web.Config, Logger: log.New(os.Stdout, "", log.Ldate|log.Ltime)} server.Get("/", func(ctx…
I often see code like this: message["To"] = formataddr((name, email)) This looks like it should work, especially since the docstring of formataddr() says that it will return a string value suitable for a To or Cc header. However, while it works most of the time, it fails if name is a unicode string containing non-ascii characters. It may look ok if you look simply read message["To"] , but as soon…
To start with, I think drive-by fixes are great. If you see that something is wrong when fixing something else, it can be a good idea to fix it right away, since otherwise you probably won’t do it. However, even when doing drive-by fixes, I still think that each landed branch should focus on one thing only. As soon as you start to group unrelated things together, you make more work for others. It…
I’ve been working on a new release/merge workflow for Launchpad. I’ve written it from the developers’ point of view, but I’d love some comments from users of launchpad.net , so let me try to explain how you, as users, would be affected by this change. The proposal is that we would decouple our feature development cycles from our release cycles. We would more or less get rid of our releases, and…
I made the transition from the Bugs team lead to the Launchpad Technical Architect quite a while ago. While the first time was spent mainly on satisfying my coding desires, it’s time to define what I’m going to spend my time as technical architect! My road map that shows the high level things that I’ll be focusing on is available here: https://dev.launchpad.net/TechnicalArchitect I’ll also be…