Blog
Setting up a guest network with Unifi APs
I’ve been pretty happy with the Unifi wifi access points I picked up a few months back, but one of the things I hadn’t managed to replicate over my old setup was a guest wifi network.
If I went all-in and bought a Unifi router, this would probably be fairly trivial to set up. But I wanted to build on the equipment I already had for now. Looking at some old docs, I’d need to get trunked VLAN traffic to the APs to separate the main and guest networks.
Blog
Running the UniFi Controller under LXD
A while back I bought some UniFi access points. I hadn’t gotten round to setting up the Network Controller software to properly manage them though, so thought I’d dig into setting that up.
Blog
Improved JS Mandelbrot Renderer
Eleven years ago, I wrote a Mandelbrot set generator in JavaScript as a way to test out the then somewhat new Web Workers API, allowing me to make use of multiple cores and not tie up the UI thread with the calculations.
Recently I decided to see how much I could improve it with improvements to the web stack that have happened since then. The result was much faster than what I’d managed previously:
Blog
What is in the SafeWA QR Codes?
Earlier this month, the Western Australian government introduced the SafeWA contact tracing app, which relies on users scanning a QR code at a venue or event in order to be added to the online register. The app doesn't request location permission, so it is solely linking your SafeWA user account with the information in the QR code.
The QR codes were quite large, so I was kind of curious what data was held inside them.
Blog
Converting BigBlueButton recordings to self-contained videos
When the pandemic lock downs started, my local Linux User Group started looking at video conferencing tools we could use to continue presenting talks and other events to members. We ended up adopting BigBlueButton: as well as being Open Source, it's focus on education made it well suited for presenting talks. It has the concept of a presenter role, and built in support for slides (it sends them to viewers as images, rather than another video stream).
Blog
Using GAsyncResult APIs with Python's asyncio
With a GLib implementation of the Python asyncio event loop, I can easily mix asyncio code with GLib/GTK code in the same thread. The next step is to see whether we can use this to make any APIs more convenient to use. A good candidate is APIs that make use of GAsyncResult.
These APIs generally consist of one function call that initiates the asynchronous job and takes a callback. The callback will be invoked sometime later with a GAsyncResult object, which can be passed to a "finish" function to convert this to the result type relevant to the original call.
Blog
Exploring Github Actions
To help keep myself honest, I wanted to set up automated test runs on a few personal projects I host on Github. At first I gave Travis a try, since a number of projects I contribute to use it, but it felt a bit clunky. When I found Github had a new CI system in beta, I signed up for the beta and was accepted a few weeks later.
While it is still in development, the configuration language feels lean and powerful.
Blog
GLib integration for the Python asyncio event loop
As an evening project, I've been working on a small library that integrates the GLib main loop with Python's asyncio. I think I've gotten to the point where it might be useful to other people, so have pushed it up here:
https://github.com/jhenstridge/asyncio-glib
This isn't the only attempt to integrate the two event loops, but the other I found (Gbulb) is unmaintained and seems to reimplement a fair bit of the asyncio (e.
Blog
Building IoT projects with Ubuntu Core talk
Last week I gave a talk at Perth Linux Users Group about building IoT projects using Ubuntu Core and Snapcraft. The video is now available online. Unfortunately there were some problems with the audio setup leading to some background noise in the video, but it is still intelligible:
The slides used in the talk can be found here.
The talk was focused on how Ubuntu Core could be used to help with the ongoing security and maintenance of IoT projects.
Blog
Performing mounts securely on user owned directories
While working on a feature for snapd, we had a need to perform a "secure bind mount". In this context, "secure" meant:
The source and/or target of the mount is owned by a less privileged user. User processes will continue to run while we're performing the mount (so solutions that involve suspending all user processes are out). While we can't prevent the user from moving the mount point, they should not be able to trick us into mounting to locations they don't control (e.
Blog
ThinkPad Infrared Camera
One of the options available when configuring the my ThinkPad was an Infrared camera. The main selling point being "Windows Hello" facial recognition based login. While I wasn't planning on keeping Windows on the system, I was curious to see what I could do with it under Linux. Hopefully this is of use to anyone else trying to get it to work.
The camera is manufactured by Chicony Electronics (probably a CKFGE03 or similar), and shows up as two USB devices:
Blog
Experimenting with C++ Reflection
For a number of projects I've worked on at Canonical have involved using GObject based libraries from C++. To make using these APIs easier and safer, we've developed a few helper utilities. One of the more useful ones was a class (originally by Jussi Pakkenen) that presents an API similar to the C++11 smart pointers but specialised for GObject types we called gobj_ptr. This ensures that objects are unrefed when the smart pointer goes out of scope, and increments the reference count when copying the pointer.
Blog
Extracting BIOS images and tools from ThinkPad update ISOs
With my old ThinkPad, Lenovo provided BIOS updates in the form of Windows executables or ISO images for a bootable CD. Since I had wiped Windows partition, the first option wasn't an option. The second option didn't work either, since it expected me to be using the drive in the base I hadn't bought. Luckily I was able to just copy the needed files out of the ISO image to a USB stick that had been set up to boot DOS.
Blog
u1ftp: a demonstration of the Ubuntu One API
One of the projects I've been working on has been to improve aspects of the Ubuntu One Developer Documentation web site. While there are still some layout problems we are working on, it is now in a state where it is a lot easier for us to update.
I have been working on updating our authentication/authorisation documentation and revising some of the file storage documentation (the API used by the mobile Ubuntu One clients).
Blog
Packaging Python programs as runnable ZIP files
One feature in recent versions of Python I hadn't played around with until recently is the ability to package up a multi-module program into a ZIP file that can be run directly by the Python interpreter. I didn't find much information about it, so I thought I'd describe what's necessary here.
Python has had the ability to add ZIP files to the module search path since PEP 273 was implemented in Python 2.
Blog
NBN talk at PLUG
Earlier in the week, I attended a PLUG discussion panel about the National Broadband Network. While I had been following some of the high level information about the project, it was interesting to hear some of the more technical information.
The evening started with a presentation by Chris Roberts from NBN Co, and was followed by a panel discussion with Gavin Tweedie from iiNet and Warrick Mitchel from AARNet.
James Bromberger introducing the panel: Chris Roberts (NBN Co), Gavin Tweedie (iiNet) and Warrick Mitchel (AARNet)
Blog
pygpgme 0.3
This week I put out a new release of pygpgme: a Python extension that lets you perform various tasks with OpenPGP keys via the GPGME library. The new release is available from both Launchpad and PyPI.
There aren't any major new extensions to the API, but this is the first release to support Python 3 (Python 2.x is still supported though). The main hurdle was ensuring that the module correctly handled text vs.
Blog
Javascript Mandelbrot Set Fractal Renderer
While at linux.conf.au earlier this year, I started hacking on a Mandelbrot Set fractal renderer implemented in JavaScript as a way to polish my JS skills. In particular, I wanted to get to know the HTML5 Canvas and Worker APIs.
The results turned out pretty well. Click on the image below to try it out:
Clicking anywhere on the fractal will zoom in. You'll need to reload the page to zoom out.
Blog
Using Mozmill to Test Firefox Extensions
Recently I've been working on a Firefox extension, and needed a way to test the code. While testing code is always important, it is particularly important for dynamic languages where code that hasn't been run is more likely to be buggy.
I had not experience in how to do this for Firefox extensions, soEric suggested I try out Mozmill. which has been quite helpful so far. There were no Ubuntu packages for it, so I've put some together in my PPA for anyone interested:
Blog
linux.conf.au 2011
I've just got through the first one and a half days of LCA2011 in Brisbane. The organisers have done a great job, especially considering the flooding they have had to deal with.
Due to the venue change the accommodation I booked is no longer within walking distance of the conference, but the public transport is pretty good. A bit more concerning was the following change to the wiki made between the time I left Perth and the time I checked in:
Blog
Bagels
I made some bagels last night. It was my second time using the recipe, so things went pretty well. The boiling process gives the crust an interesting chewy texture I haven't seen with other bread recipes I've tried.
I used this recipe (half wholemeal flour, half white), but made 12 slightly larger bagels rather than the 18 the recipe suggested. I increased the boiling and baking time a bit to compensate.
Blog
Launchpad code scanned by Ohloh
Today Ohloh finished importing the Launchpad source code and produced the first source code analysis report. There seems to be something fishy about the reported line counts (e.g. -3,291 lines of SQL), but the commit counts and contributor list look about right. If you're interested in what sort of effort goes into producing an application like Launchpad, then it is worth a look.
Comments: e - 27 Oct, 2009 Have you seen the perl language?
Blog
Seeking in Transcoded Streams with Rygel
When looking at various UPnP media servers, one of the features I wanted was the ability to play back my music collection through my PlayStation 3. The complicating factor is that most of my collection is encoded in Vorbis format, which is not yet supported by the PS3 (at this point, it doesn't seem likely that it ever will).
Both MediaTomb and Rygel could handle this to an extent, transcoding the audio to raw LPCM data to send over the network.
Blog
Watching iView with Rygel
One of the features of Rygel that I found most interesting was the external media server support. It looked like an easy way to publish information on the network without implementing a full UPnP/DLNA media server (i.e. handling the UPnP multicast traffic, transcoding to a format that the remote system can handle, etc).
As a small test, I put together a server that exposes the ABC's iView service to UPnP media renderers.
Blog
More Rygel testing
In my last post, I said I had trouble getting Rygel's tracker backend to function and assumed that it was expecting an older version of the API. It turns out I was incorrect and the problem was due in part to Ubuntu specific changes to the Tracker package and the unusual way Rygel was trying to talk to Tracker.
The Tracker packages in Ubuntu remove the D-Bus service activation file for the "org.