Author: Andy Balaam
-
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 …
-
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…
-
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…
-
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
-
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…
-
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…
-
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 …
-
My Address Book 1.9.0 – rewritten from scratch
Ordinarily, my motivations for doing open source work are clear: peer recognition and the satisfaction of knowing people are using my work. However, I’ve been distracted from that stuff recently because of my desire to scratch my own itch, by re-writin…
-
Switching workspace in GNOME via the command line
I use rdesktop to connect to some Windows machines, and it works beautifully. I like to allow it to grab keyboard input so I can switch and close windows on my Windows desktop without fear of accidentally doing something to the rest of my Linux desktop…
-
Anatomy of an interpreter: the Evaluator
Posts in this series: Lexer, Parser, Evaluator I’m still really enjoying writing my Scheme interpreter Subs, which can now succesfully run all the example code from SICP up to section 2.3.4. I’ve made the changes I mentioned I would in the Lexer articl…
-
How to ask technical questions in person
In a healthy team performing a technical task, there will be a lot of questions. Those questions will sometimes be asked by those with less technical knowledge, but (in a healthy team) there will be plenty of questions going back the other way too. Que…
-
Anatomy of an interpreter: the Parser
Posts in this series: Lexer, Parser, Evaluator Subs has reached version 1.3.4, which means that it can successfully run all the tests from chapter 1 of SICP. This is very exciting. Last time I explained a bit about the Lexer, which takes in a stream of…
-
Anatomy of an interpreter: the Lexer
Posts in this series: Lexer, Parser, Evaluator I have been having a lot of fun recently writing my Scheme interpreter Subs. I have never implemented a full programming language before, so I am learning fast (mostly through mistakes) and wanted to write…
-
Subs Scheme Lisp Interpreter
Why would you write a Lisp interpreter? I find that question difficult to answer, but the joy of open source is that I don’t have to answer it. Subs is a Scheme interpreter written in C++, and growing out of the excitement I have felt while reading Str…
-
Scalable Graph Coverage
If you’re interested in dealing with large directed graphs of dependent objects and want some tips on how to process them in a way that scales in terms of memory usage, you may be interested in the article I wrote for Overload, which is a journal of th…
-
Ubuntu Lucid upgrade – a catalogue of disaster and pain
I recently upgraded 3 machines to Lucid. I don’t recommend it. Broken after upgrade 2 out of 3 machines did not boot after upgrade to Lucid. One, an upgrade from Hardy, crashed hard during the upgrade (the screen was frozen with a prompt about lmsensor…
-
FreeGuide 0.10.11
I’ve made a new release of FreeGuide today, which contains minor bug fixes. I changed the stability rating on sourceforge to “Production/Stable” (previously it was “Alpha”). Maybe I should bump the version number next time to 1.0. Certainly all this 0….
-
Don’t design for performance until it’s too late
There is a piece of ancient wisdom which states: Premature optimisation is the root of all evil This ancient wisdom is, like all ancient wisdom, correct. However. It appears to have been reinterpreted as essentially meaning: Don’t design for perform…
-
Technorati appear to have broken openid delegation
I have just changed to myopenid and can delegate to them from my own openid URL by following the instructions here: https://www.myopenid.com/help#own_domain. Google don’t appear to let you delegate to them (i.e. have your own url). I’m really glad I ch…
-
NNDB 0.1
I’ve managed to get NNDB, my C++ data storage library which is almost, but not entirely unlike SQL, into a fit state for a release. You can create tables, set indices on columns, insert data, retrieve data using something like a SELECT, filter it using…
-
NNDB’s Not a Database
My latest project is called NNDB. I’ve worked with databases for quite a long time now, and for a while I’ve been thinking about how they work under the hood. I know very little about it, but I thought I could learn a bit by trying to implement somethi…
-
Diffident 0.3
My original plan for Diffident, the side-by-side diff viewer and editor that works in a terminal, was to implement basic editing capabilities before making another release. Of course, that turned out to be quite ambitious. It involves essentially imple…
-
CBeebies and other channels not working with mplayer
It turns out the scan command from the linuxtv-dvb-apps package (on Ubuntu Hardy Heron, anyway) isn’t writing the correct channels.conf, and this makes some channels not work for me, including CBeebies, CBBC Channel and CITV. The fix is to do as this p…
-
Firefox keyword search for finding C++ keywords
I often want to search the SGI C++ reference for a keyword. The best way I have found to jump straight to the page I want is to use Google’s “I’m Feeling Lucky” search limited to searching within sgi.com. You can create a Firefox keyword search to allo…
-
Flaws in the software patents system
Note: I am in favour of patents on inventions. I believe the current software patents system has a number of flaws (in decreasing order of importance to me): They attempt to close off the use of knowledge rather than open it up. If we were not filing …
-
IGCC – a real-eval-print loop for C/C++
When you first hear about the Read-Eval-Print Loop you might well think “So what?” as I did. What’s so great about being able to type commands interactively? But the thing is that it creeps up on you. Everyone already knows programming is an interactiv…
-
Diffident – command line side-by-side diff editor
I really like Beyond Compare, which is a proprietary diff program with all those little touches that make it a joy to use*. The way I write code at work generally involves a bit of hacking in jEdit, checking the code myself, and then reviewing the code…
-
Random background in GNOME
I’ve written a little script to show a different random background in GNOME every day, by looking inside your Photos directory. It will rotate them to be the right way up, if you have exiftran installed. Get it here: Random Background.
-
Analog literals
I love this: C++ Multi-Dimensional Analog Literals. I quote: Have you ever felt that integer literals like “4” don’t convey the true size of the value they denote? If so, use an analog integer literal instead:unsigned int b = I———I; It goes on …
-
Separate regular expressions, or one more complex one?
I have asked myself this question several times, so I thought it was about time I did a test and found an answer. If the user of your program can supply you with a list of regular expressions to match against some text, should you combine those express…
-
New Baby
Finally the number of people in our family is prime again. Mum, baby, siblings etc. are all really well and enjoying ourselves.
-
Talk in code
Last week we had an extended discussion at work about how we were going to implement a specific feature. This discussion hijacked our entire Scrum sprint planning meeting (yes, I know, we should have time-boxed it). It was painful, but the guy who was …
-
Fixing the vertical panel window list on Ubuntu Hardy
For a long time now I’ve been bugged by GNOME Bug 86382. Recent versions of GNOME have featured a window list applet which behaves badly when situated on a vertical panel (which is where I like to have mine). Older versions were ok except the buttons w…
-
An actual difficult bug fixed
Of course, I am bound to get a bug report immediately I have posted this telling me my fix breaks everything, but for the moment I am chuffed that I found, tested, and fixed a genuinely difficult bug. I am particularly proud because I wrote an automate…
-
FreeGuide 0.10.9
So let’s quietly forget FreeGuide 0.10.8, which basically didn’t work. I fixed the problem (which was some nasty threading thing) by making the initial “Choose Channels for XMLTV” call from the first time wizard not do the clever stuff of displaying er…
-
Wii repaired free!
A few weeks ago my Nintendo Wii started not accepting any Wii disks (but was still fine for GameCube ones… interesting). It made a clicking noise for a bit and then declared “Bad Disk” or something like that. I need my Wii. I watch all my TV through …
-
Another one
Due in March. Very excited.
-
FreeGuide 0.10.8
I am still working slowly on moving FreeGuide forward. Somehow it seems my itches for FreeGuide are all about making it less annoying for people who are trying it the first time. I guess this is motivated by my desire for world domination. Anyway, we a…
-
Debugging memory use and fragmentation on Windows using Address Space Monitor
At work at the moment we are putting a lot of effort into making our program not crash. Sensible, eh? It’s crashing because a) it uses an enormous amount of memory and b) it tends to fragment your remaining memory. One of the characteristics of this pr…
-
C++ is an expert language
Update: I should point out at the beginning that I love C++. Anything below which sounds bitter or critical is borne of a deep and growing love. C++ is a journey into worlds of beauty and strength. I assert that C++ is an expert language. What do I mea…
-
Templated test code?
At work at the moment, as part of an initiative to get with the 21st century, we are waking up to testing our code. Thus, I am writing a lot of unit tests for old code, which can be soul-destroyingly repetitive and very pointless-feeling (even though r…
-
Public bzr branch of FreeGuide
On the subject of distributed source code management, Dan Watkins has just informed me that the launchpad team have created a bazaar branch of FreeGuide’s code, so if you’re into that kind of thing, you can download the code from that instead of our ce…
-
Public git repo for GSSMP
Git is supposed to work when you upload your repository to an http server, but in reality, no-one except me seems to use it, and it’s nothing like as useful as having a proper repository that people can commit to etc. So, here it is: http://repo.or.cz/…
-
Finally released last.fm support for GSSMP
There was a weird bug in my last.fm support for GSSMP, where it would crash when run from the GNOME panel, but be fine when run from a terminal. After two bugs fixes from Charles Bailey, the problem seems to have gone away, so I’ve finally been able to…
-
lighttpd on Ubuntu – alias.url doesn’t work when included in a module config file
I’ve decided to use lighttpd on my new machine (which was generously given to me and features a 700GB raid array). My main reason for choosing lighttpd was the FLV streaming plugin for it that will make my Wii TV viewing experience a lot better. (It wo…
-
FreeGuide updated to latest XMLTV, and bug fixes
Check out a release candidate here: http://freeguide-tv.sourceforge.net/rc/ . So far I’ve only uploaded an RPM, but hopefully there’ll be a Windows exe and some other packages soon. Update: Windows installer now uploaded too. Test it! It’s got better c…
-
duckmaze 0.2
I’ve finally released to the world the secret extra duckmaze levels. They’re contained in the 0.2 release, which is also faster, and doesn’t freeze time. (As far as I know.) It’s got 18 levels, and a level editor, which means you can make more. Do it….
-
Caution: numbers that feel prime may be divisible by 3
Caution: numbers that feel prime may be divisible by 3. For example, 51 and 57. Conversely, numbers that feel divisible by 3 may be prime. For example, 61, 89 and 97. Nominations for least prime-feeling numbers that actually are prime: 89 and 101. Nomi…