ACCU World of Code
-
Writing: The Ethical Programmer (Part 2)
My latest Becoming a Better Programmer column was published in the November CVu (25.5). It’s the second part of my mini-series on The Ethical Programmer. This instalment deals with our attitudes towards other people, and finally formulates our own H…
-
Writing: The Ethical Programmer (Part 2)
My latest Becoming a Better Programmer column was published in the November CVu (25.5). It’s the second part of my mini-series on The Ethical Programmer. This instalment deals with our attitudes towards other people, and finally formulates our own H…
-
Paging in a REST API
Series: What is REST?, A Basic REST API, Paging, Search, Security, Token, OpenID. We consider some choices of how to provide paging through a list resource in a REST API. Slides: Paging in a REST API. Code: poemtube on github.
-
A Basic REST API
Series: What is REST?, A Basic REST API, Paging, Search, Security, Token, OpenID. I’ll walk you through the code of a simple REST API I am writing to be a kind of YouTube for poetry. Slides: A Basic REST API. Code: poemtube on github.
-
Avoid backslashes anywhere in Java code (Java error “illegal unicode escape”)
Did you know you can insert unicode-escaped characters, anywhere in a Java program? Most of us are familiar with using unicode escapes like this: String pound = “\u00A3”; but in fact constructs like \u00A3 can go anywhere, including in a comment. This …
-
What is REST?
Series: What is REST?, A Basic REST API, Paging, Search, Security, Token, OpenID. The basic concepts of REST APIs: Slides: What is REST?. Code: poemtube on github.
-
Bash arrays
Bash arrays are a lot like Bash Associative Arrays, but with numbers as keys. Here’s a quick reference. Basics $ declare -a MYARR # Create an array $ MYARR[3]=foo # Put a value into an array $ echo ${MYARR[3]} # Get a value out of an array foo $…
-
Using if:set, unless:set etc. with macrodefs in Ant
In a previous post I outlined how to use if:set and unless:set to execute tasks conditionally in Ant 1.9.1. Unfortunately, this does not work with macrodefs. When I try to execute a macrodef conditionally like this: <project xmlns:if=”ant:if” …
-
Using if:set, unless:set etc. to execute a task conditionally in Ant
I’m not sure anyone except me is still struggling on with using Ant, but just in case, here is a nice thing. In Ant 1.9.1 they added a useful feature: instead of needing to use the <if> tag and similar from ant-contrib, you can conditionally exec…
-
Writing: The Ethical Programmer
The latest C Vu magazine from ACCU is out now. It contains my latest Becoming a Better Programer column. This month it’s called The Ethical Programmer; the first instalment of a two-part series on ethics a…
-
Writing: The Ethical Programmer
The latest C Vu magazine from ACCU is out now. It contains my latest Becoming a Better Programer column. This month it’s called The Ethical Programmer; the first instalment of a two-part series on ethics a…
-
Vim for Fun
I have recently got quite excited about Vim (the text editor), so here is a video showing you the basics. I use it because I enjoy learning it. Slides: Vim for Fun.
-
Capturing lvalue references in C++11 lambdas
Recently the question “what is the type of an lvalue reference when captured by reference in a C++11 lambda?” was asked. It turns out that it’s a reference to whatever the original reference was too. This is just like taking a reference to an existing …
-
Capturing lvalue references in C++11 lambdas
Recently the question “what is the type of an lvalue reference when captured by reference in a C++11 lambda?” was asked. It turns out that it’s a reference to whatever the original reference was too. This is just like taking a reference to an existing …
-
Working with others in git
Series: Why git?, Basics, Branches, Merging, Remotes Now I’ve covered almost everything you need to understand the basics of how git works. In this video I discuss how to clone, pull from and fork remote git repositories, and how to send patches and ma…
-
Merging in git
Series: Why git?, Basics, Branches, Merging, Remotes The last video covered how to make branches and simple merges. This time we look at what to do when you want just one change from another branch (cherry-picking) and how to merge two branches when th…
-
Speaking: Running Effective Rehearsals
I’ll be speaking at The Worship Collective conference in Cambridge, UK on June 29th. This is an awesome event for musicians and worship leaders. I’m leading a seminar entitled Running Effective Rehearsals. Obviously, this is a really pract…
-
Speaking: Running Effective Rehearsals
I’ll be speaking at The Worship Collective conference in Cambridge, UK on June 29th. This is an awesome event for musicians and worship leaders. I’m leading a seminar entitled Running Effective Rehearsals. Obviously, this is a really pract…
-
Behaviour of Java String.split() when some answers are the empty string
Can you guess the output of this program? class SplitTest { static void split( String s ) { System.out.println( s.split( “;” ).length ); } public static void main( String[] args ) { split(“”); split(“;”); …
-
Checking the case of a filename on Windows
Windows generally uses a case-insensitive but not case-preserving file system. When writing some code that is intended to be used on Linux as well as Windows, I wanted it to fail on Windows in the same cases that it would fail on Linux, and this meant …
-
Branches in git
Series: Why git?, Basics, Branches, Merging, Remotes Last time we discussed starting a project and committing changes. Now we look at how to create branches, which are one of the main reasons for having source control. We’ll cover creating branches, sw…
-
Writing: Bug Hunting
The latest C Vu magazine from ACCU is out now. It contains my latest Becoming a Better Programer column. This month it’s called Bug Hunting and, as you might guess, is about the art of debugging code. This was inspired by conversations with…
-
Writing: Bug Hunting
The latest C Vu magazine from ACCU is out now. It contains my latest Becoming a Better Programer column. This month it’s called Bug Hunting and, as you might guess, is about the art of debugging code. This was inspired by conversations with…
-
Passing several values through a pipe in bash
I have been fiddling with some git-related shell scripts, and decided to try and follow the same approach as git in their structure. This means using the Unix system where each piece of functionality is a separate script (or executable) that communicat…
-
Goodness in programming languages, part 4 – Ownership & Memory
Posts in this series: Syntax, Deployment, Metaprogramming, Ownership There is often a trade-off between programming language features and how fast (and predictably) the programs run. From web sites that serve millions of visitors to programs running on…
-
How to use git (the basics)
Series: Why git?, Basics, Branches, Merging, Remotes Git is a very powerful tool, but somewhat intimidating at first. I will be making some videos working through how to use it step by step. First, we look at how to track your own code on your own comp…
-
Using gnome-mplayer to play DVB radio without asking whether you want to resume
When I launch gnome-mplayer to play back radio over my TV card (DVB), it asks me whether I want to resume from where I left off, which doesn’t make sense for this kind of stream. I couldn’t find a way to switch this off, but a little hacking with gnome…
-
C++14 “Terse” Templates – an argument against the proposed syntax
Today I attended two excellent talks by Bjarne Stroustrup at the ACCU Conference 2013. The first was an inspiring explanation of the recent C++11 standard, and the second, “C++14 Early thoughts” was an exciting description of some of the features that …
-
Visual Lint and Windows Driver Kit (WDK) projects
We have recently been working with Don Burn on PC-lint analysis of Windows Driver Kit (WDK) projects, and he has written an interesting article on the subject titled “Another Look at Lint” in the March-April 2013 issue of the NT Insider. Within the art…
-
Visual Lint and Windows Driver Kit (WDK) projects
We have recently been working with Don Burn on PC-lint analysis of Windows Driver Kit (WDK) projects, and he has written an interesting article on the subject titled “Another Look at Lint” in the March-April 2013 issue of the NT Insider. Within the art…
-
setUp and tearDown considered harmful
Some unit test frameworks provide methods (often called setUp and tearDown, or annotated with @Before and @After) that are called automatically before a unit test executes, and afterwards. This structure is presumably intended to avoid repetition of co…
-
Why use git for source control?
Series: Why git?, Basics, Branches, Merging, Remotes Putting your code in git is fast, flexible and powerful. You can track versions on a single machine, or scale up to thousands of people working together, with sub-teams, reviews and cherry-picking of…
-
Set the volume in OpenBox/LXDE (or on the command line) with PulseAudio and Ubuntu
I am switching to LXDE, and enjoying it, but a few things require some manual config before it’s just how I like it. To control the sound volume with the volume buttons, the default LXDE config in ~/openbox/lxde-rc.xml contains an entry like this: <…
-
Everybody loves build.xml (test-driven Ant)
In the previous post we looked at how it is possible to write reasonable code in Ant, by writing small re-usable blocks of code. Of course, if you’re going to have any confidence in your build file you’re going to need to test it. Now we’ve learnt some…
-
Everybody hates build.xml (code reuse in Ant)
If you’re starting a new Java project, I’d suggest suggest considering the many alternatives to Ant, including Gant, Gradle, SCons and, of course, Make. This post is about how to bend Ant to work like a programming language, so you can write good code …
-
Dry run mode for Ant (ant -n, ant –dry-run)
I am working on the problem of writing Ant build files in a test-driven way. One thing I found myself needing was a “dry run” mode, like many Unix tools have. For example, make has the -n or –dry-run option, which shows what it would have done, but do…
-
My First Raspberry Pi Game ” Part 12 ” Scoring, done!
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. Today, we finish! Our game is almost done. All we need to do now is let you play several times, and give you a score at the end. First, becaus…
-
My First Raspberry Pi Game ” Part 11 ” Being less rude
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. We’ve nearly finished our game. Next on our list is to fix that bug where you can’t exit some of the time, and make our code a bit tidier in t…
-
My First Raspberry Pi Game ” Part 10 ” Red square
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. We’re writing a really simple game – you have to press a key when you see green, and not press a key when you see red. I’ve been promising for…
-
My First Raspberry Pi Game ” Part 09 ” Lots more words
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. We’re writing a really simple game – you have to press a key when you see green. This time we’re going to add lots of instructions on each pag…
-
My First Raspberry Pi Game ” Part 08 ” Success and failure
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. We’re writing a really simple game – you have to press a key when you see green. Today we’re going to wait for a key press. If we get one, we’…
-
My First Raspberry Pi Game ” Part 07 ” A green circle
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. We’re going to write a game that tests your reactions – press a key when you see green, but don’t when you see red. Today we see some of what …
-
Launching an OSGi app on the command line
I am a total beginner on this topic, but here is what I have found so far. Please correct me, advise me etc. in the comments. A colleague has written a program based on OSGi, which is a framework for obfuscating everything “modular” software, which I t…
-
My First Raspberry Pi Game ” Part 06 ” A better class of waiting
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. Today we wait, but better, while we show the ready screen we made last time. In the process we cover two of the most important things you need…
-
My First Raspberry Pi Game ” Part 05 ” Say something
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. Today we will write some writing on that blank screen we made last time. But first, a couple of tricks (we are doing magic after all). We’re g…
-
Windows 8 Pro on an early 2009 iMac 21.5 (Core 2 Duo)
A couple of weeks back I thought I’d have a go writing a Windows Store App. To do this requires Windows 8. At the time I was running Windows 7 Home Premium on an early 2009 iMac 21.5 (Core 2 Duo). This had been installed using Boot Ca…
-
Windows 8 Pro on an early 2009 iMac 21.5 (Core 2 Duo)
A couple of weeks back I thought I’d have a go writing a Windows Store App. To do this requires Windows 8. At the time I was running Windows 7 Home Premium on an early 2009 iMac 21.5 (Core 2 Duo). This had been installed using Boot Ca…
-
My First Raspberry Pi Game ” Part 04 ” A small black screen
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. Today we will get an actual window to appear, with nothing on it! Last time we wrote a magic spell describing the bare outline of what how our…
-
Length of Open Source licenses
I have been choosing a license for my ficticious programming language, Pepper. One consideration is the complexity of the (combination of) license(s) used. Complexity may be related to length, so for your enjoyment, here are the lengths of some popular…
-
My First Raspberry Pi Game ” Part 03 ” It’s like a magic spell
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. Today we will write the very basic outline of our game. When we’ve finished it won’t actually do anything. In fact, it won’t even run. Writing…
-
My First Raspberry Pi Game ” Part 02 ” Saying hello
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Writing your first ever computer program on the Raspberry Pi. See Part 1 for how to get and set up the Pi. Today we will find out how to write a computer program, and how to run it. We’re going to write o…
-
My First Raspberry Pi Game – Part 01 – Before we start
Parts: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. In this series I intend to guide you through writing your first ever computer program. We will write our own game on the Raspberry Pi, which is a cheap-as-chips computer designed for learning about comput…
-
Running Dojo DOH tests in a browser without a web server
Dojo’s DOH requires a web server to run tests in a browser. But never fear: $ cd ~/code/dojo $ ls docs dojo util $ python -m SimpleHTTPServer & $ xdg-open http://localhost:8000/util/doh/runner.html Note that you will see some test failures, beca…
-
Bash associative array examples
Quick reference of things I discovered about how to use associative arrays in bash. Note: bash version 4 only. (See also Bash Arrays.) Basics $ declare -A MYMAP # Create an associative array $ MYMAP[foo]=bar # Put a value into an associative …
-
Running Dojo 1.7+ DOH unit tests on the command line with Rhino
To run your own DOH-based unit tests on the command line using Rhino: NOTE: this is Dojo 1.7 and above. For 1.6, there was a whole other cryptic incantation. Project layout Imagine your code is somewhere different from dojo, and another library you use…
-
Lambda functions timeline
I did a talk at work about lambda functions (anonymous functions), and something possessed me to make a timeline of when they were introduced into various languages. Some languages were born with them, and some grew them later – in the latter case I gi…
-
Goodness in programming languages, part 3 ” not doing the same thing more than once
Posts in this series: Syntax, Deployment, Metaprogramming, Ownership I’m going to use a word here – don’t stop reading: Metaprogramming. Does the language provide what you need to avoid repeating yourself? Repeating boilerplate code, algorithms and mos…
-
Specifying the directory to create SQL CE databases when using Entity Framework
In the last few posts I’ve been describing how to create instances of SQLCE in order to perform automated Integration Testing using NUnit and accessing the dB using Entity Framework. I covered creating the dB using both Entity Framework and the S…
-
Specifying the directory to create SQL CE databases when using Entity Framework
In the last few posts I’ve been describing how to create instances of SQLCE in order to perform automated Integration Testing using NUnit and accessing the dB using Entity Framework. I covered creating the dB using both Entity Framework and the S…
-
Integration Testing with NUnit and Entity Framework
This post gives a quick introduction into creating SQL CE dBs for performing Integration Tests using NUnit. In the previous post Using NUnit and Entity Framework DbContext to programmatically create SQL Server CE databases and specify the databse…
-
Integration Testing with NUnit and Entity Framework
This post gives a quick introduction into creating SQL CE dBs for performing Integration Tests using NUnit. In the previous post Using NUnit and Entity Framework DbContext to programmatically create SQL Server CE databases and specify the databse…
-
Visual Studio 2012 theme support
One of the unexpected (and I would suggest from the comments, unwelcome) changes sprung on developers in the Visual Studio 2012 Beta back in February was the “Metroification” of the development environment. However, eye candy (and eyesores!) come and g…
-
Visual Studio 2012 theme support
One of the unexpected (and I would suggest from the comments, unwelcome) changes sprung on developers in the Visual Studio 2012 Beta back in February was the “Metroification” of the development environment. However, eye candy (and eyesores!) come and g…
-
Tail Call Optimisation in C++ – lightning talk video
You can watch the Tail Call Optimisation in C++ lightning talk video, which I gave at the ACCU 2012 conference in April. You can also read the (clearer and more correct) writeup I did later: Tail Call Optimisation in C++ or the subsequent article publi…
-
Cool Raspberry Pi Projects
Someone claimed that everyone who has a Raspberry Pi has done what I did with it: try it out then file it in a drawer marked “must play with later”. To try and debunk this claim, here are some cool projects I have seen. Update: I made some videos on ho…
-
Scheme 7: Macros video
Series: Feel the cool, Basics, Closures, Recursion, Quotation, Lambda, Macros. Continuing the series on Scheme, this video explains the ultimate alternative – when nothing else is flexible enough, we can create our own bits of lanugage using macros. …
-
Scheme 6: Lambda video
Series: Feel the cool, Basics, Closures, Recursion, Quotation, Lambda, Macros. Continuing the series on Scheme, this video explains the lambda function, which allows you to define anonymous functions. It goes on to bend your mind with 2 examples of the…
-
Tail Call Optimisation in C++ published in Overload journal
You read it here first, but now you can have a paper version of “Tail Call Optimisation in C++”, published almost as-is, in Overload 109 the journal of ACCU.
-
Scheme 5: Quotation video
Series: Feel the cool, Basics, Closures, Recursion, Quotation, Lambda, Macros. Continuing the series on Scheme, this video explains on of the most powerful and unfamiliar features of Scheme: quotation. Quoting allows us to talk about and manipulate cod…
-
Scheme 4: Recursion – how to write functions in Scheme video
Series: Feel the cool, Basics, Closures, Recursion, Quotation, Lambda, Macros. Continuing the series on Scheme, this video describes the way you write code in Scheme: recursion. Recursive functions can be pretty efficient in Scheme, if you structure th…
-
Scheme 3: Closures video
Series: Feel the cool, Basics, Closures, Recursion, Quotation, Lambda, Macros. Continuing the series on Scheme, this video describes an important feature of functions in Scheme: closures. Closures allow functions to carry their “environment” around wit…
-
Scheme 2: Basics – pairs and lists video
Series: Feel the cool, Basics, Closures, Recursion, Quotation, Lambda, Macros. Continuing the series on Scheme, this video describes some of the things you will need to understand to be able to write real programs. I introduce pairs, lists, and navigat…
-
Scheme 1: Feel the cool video
Series: Feel the cool, Basics, Closures, Recursion, Quotation, Lambda, Macros. Here’s me trying to persuade you to be interested in a 40-year-old programming language, called Scheme, which is a type of Lisp: Slides for Scheme 1: Feel the cool
-
Generalising tail call optimised C++
This series: Lightning talk, Explanation, Performance, Generalisation. In previous posts I discussed the construction of some C++ that does the same job that the tail call optimisation does in some other languages. The example code given showed the cas…
-
JavaScript WTFs Videos
I recorded some videos of my JavaScript WTFs presentations: You can get the JavaScript WTFs slides. Update: all six episodes: JavaScript WTFs 1 – The Global Object JavaScript WTFs 2 – Equality and Inequality JavaScript WTFs 3 – Syntax JavaScript WTFs…
-
Closures in Scheme
Update: watch the video In this series on Scheme: Intro, Basics, Closures. Here’s a presentation I did recently, on Closures in the Scheme programming language. Closures are the way the environment in which a function was created hangs around with it a…
-
Performance of tail call optimised C++
This series: Lightning talk, Explanation, Performance, Generalisation. After I wrote a version of tail-call optimised code in C++ I became interested in its performance relative to normal recursion. The tail call version can process arbitrarily large i…
-
Tail call optimisation in C++
This series: Lightning talk, Explanation, Performance, Generalisation. Some programming languages make recursive programming more practical by providing the tail call optimisation. For a tiny talk at the recent ACCU conference I looked at how we might …
-
Lighting talk – Tail call optimisation in C++
This series: Lightning talk, Explanation, Performance, Generalisation. Update: watch the video Here’s the lightning talk I gave at the ACCU 2012 Conference: Tail Call Optimisation in C++ It’s about how you would generate C++ code that represents a recu…
-
Scheme: pairs, lists and recursion
Update: watch the video In this series on Scheme: Intro, Basics, Closures. Here’s a presentation I did recently, on the basics of the Scheme programming language. Scheme: pairs, lists and recursion
-
Introducing VisualLintGui
If you have been following me (@annajayne) on Twitter, you may have noticed me talking about something called “VisualLintGui”. This is actually the second of two projects (the first being VisualLintConsole – the command line version of Visual Lint) we …
-
Introducing VisualLintGui
If you have been following me (@annajayne) on Twitter, you may have noticed me talking about something called “VisualLintGui”. This is actually the second of two projects (the first being VisualLintConsole – the command line version of Visual Lint) we …
-
What timezone Python thinks I’m in
sudo aptitude install python-dateutil python -c “import dateutil.tz; import datetime; print datetime.datetime.now( dateutil.tz.tzlocal() ).tzname()”
-
Freeview dvb-t scan gives “tuning failed!!!” after 18th April switchover
Usually when the channel lineup changes, I just have to do this:$ scan /usr/share/dvb/dvb-t/uk-CrystalPalace > ~/.mplayer/channels.conf But this time it is failing with:>>> tune to: 505833000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:…
-
Scheme: feel the cool
Update: watch the video In this series on Scheme: Intro, Basics, Closures. Here’s a presentation I did recently, introducing the Scheme programming language (a dialect of Lisp). Scheme: feel the cool Metaprogramming is very powerful, but is usually so …
-
JavaScript WTFs
I recently did a presentation at work on “surprising” things you may encounter in JavaScript. I present it here for your delectation: JavaScript WTFs Sorting arrays was the one that wasted me the most time. Arrays in JavaScript are a neat hack on top o…
-
Goodness in programming languages, part 2 ” getting your code running
Posts in this series: Syntax, Deployment, Metaprogramming, Ownership The fancy word for what I’m talking about here is Deployment. How easy is it, once you’ve written your code, to get it running on someone else’s computer? What barriers are there to s…
-
Building jEdit from source
I have recently agreed to take over development of the JSLint plugin for my favourite editor, jEdit. To start developing I decided to build jEdit and its plugins from source, which wasn’t as easy as I would have expected (thanks to deffbeff for some po…
-
Goodness in programming languages, part 1 – syntax and layout
In this series I will comment on what I like in some of the languages I use. I will cover things that I find convenient, things that might lead me to write correct code, things that tend to make my code more readable, and possibly other things that I j…
-
ResOrg 2.0 has been released
It’s done. After a rather extended incubation period ResOrg 2.0.0.15 (the first public ResOrg 2.0 build) was uploaded earlier this morning, and the ResOrg product pages updated to match. If you have used ResOrg 1.x before, you will notice that the user…
-
ResOrg 2.0 has been released
It’s done. After a rather extended incubation period ResOrg 2.0.0.15 (the first public ResOrg 2.0 build) was uploaded earlier this morning, and the ResOrg product pages updated to match. If you have used ResOrg 1.x before, you will notice that the user…
-
Ethernet not working on Ubuntu with Realtek RTL8111/8168B
Thanks to rvdavid, the network on my new PC is now working, despite Ubuntu misrecognising it: How to Get Gigabit Speeds from RTL8111/8168B PCI Express Gigabit Ethernet controller on Ubuntu Linux. This is the kind of thing I had to do 10 years ago. I th…
-
FreeGuide usage stats
A long time ago I mentioned I’d added some (opt-in) usage tracking for FreeGuide. Here are the latest stats. I think they’ve held up pretty well given how much I’ve neglected the project…
-
Visual Lint and Atmel AVR Studio 5
From our perspective one of the more intriguing embedded environments to appear recently is Atmel’s AVR Studio 5. When I first saw a screenshot of this IDE (it was mentioned in a post in the CodeProject Lounge) it was immediately obvious that this was …
-
Visual Lint and Atmel AVR Studio 5
From our perspective one of the more intriguing embedded environments to appear recently is Atmel’s AVR Studio 5. When I first saw a screenshot of this IDE (it was mentioned in a post in the CodeProject Lounge) it was immediately obvious that this was …
-
Entertain your baby using your Android phone
Last night my friend and I uploaded the first version of Baby Distraction, an Android app featuring charming cartoon animals, vibration and sounds. I helped almost exclusively in an advisory capacity, but still am inexplicably proud of the result: it’s…
-
rdesktop swallows keyboard events
The Linux remote desktop client rdesktop grabs all keyboard events by default, which is good, because it allows e.g. you to Alt-Tab between applications and Ctrl-Alt-Del as if you were in front of the remote machine. However, it is also bad because you…
-
Reclaiming desktop space with Ubuntu’s window-picker-applet
For a long time I’ve customised GNOME to have a vertical task bar on the left and launcher buttons across the top. I’ve struggled with a long-standing bug with using a vertical panel, and I’ve sacrificed quite a lot of screen space to make enough room …