17/03/2009
The Quest for the Perfect Hacking Keyboard is indeed an eternal one. Over the years, I had great many keyboards and most of them went the way of the dodo. Recently, despite not having other Apple products, I tried the (wired) thin Apple aluminum keyboard. As I prefer very thin keyboard over thick ones, and laptop-style keys to the big M Type keys; it was a very good match. However, after a while, I got unnerved by the extra, useless keypad. In short, the keyboard is too long: as I am right handed, it’s always somehow in the way of the mouse so I started looking for a better keyboard. Again.

So I got the Apple aluminium keyboard, wireless version.
Read the rest of this entry »
27 Comments |
hacks, Life in the workplace, programming, Zen | Tagged: Apple, Apple Aluminium Keyboard, Bluetooth, Caps Lock, Capsoff.org, hacking, Happy Hacking Keyboard, Keyboard, Model M, Thin Keyboard |
Permalink
Posted by Steven Pigeon
11/03/2009
Yesterday someone dropped on the IRC channel where my fellow programmers, computer enthusiasts, and I hang out to get help to find a bug. He uses one of the paste sites (like pastebin.ca, pastebin.com, or rafb.net), pastes his piece of offending code, and so we get a look at the code. Of course, I go over the short program, notice a mistake in the scanf but it took me a full two minutes to notice the loop:
for (c=0; c++; cwe don’t read what’s actually written, but what we think is written, unless we pay the utmost attention to the code—what we should be doing anyway, but do not always. Usually, you zero in on that kind of bug rapidly, as you guide your search from the bug’s symptoms which leads you to defect’s approximate location. If you’re like me—write a little, test a lot—you find those bugs right away most of the times. However, even if you zero in rapidly, you still get a coarse-grained location: module, class, function.
Read the rest of this entry »
Leave a Comment » |
algorithms, C, hacks, Life in the workplace, programming, Zen | Tagged: automatism, automatisms, bugs, C, debug, debugging, Delphi, duh!, efficient code, Fortran, functional programming, Incremental Coding, IRC, Pascal, programming, Turbo Pascal |
Permalink
Posted by Steven Pigeon
17/02/2009
Ad hoc compression algorithms always sound somewhat flimsy, but they still have their usefulness whenever the data you have to compress exhibits very special properties or is extremely short. Universal compression algorithms need a somewhat lengthy input to adapt sufficiently to yield good compression. Moreover, you may not have the computing power (CPU speed, RAM and program space) to implement full-blown compressors. In this case also, an ad hoc algorithm may be useful.
Digram (bigram, digraph, bigraph) coding is one of those ad hoc algorithms. Digram coding will compress text (or any source, really) by finding pairs of symbols that appear often and assigning them codes corresponding to used symbols, if any.

Let us see in detail what digram compression is, and how effective it really is.
Read the rest of this entry »
2 Comments |
algorithms, C, data compression, hacks, programming | Tagged: ad hoc, average code length, bigram, bigraph, compression, Digram, digraph, efficient code, simple, text compression |
Permalink
Posted by Steven Pigeon
03/02/2009
Yesterday, at least at the time I am writing this entry, I spoke about the Zune and its time bug that caused so many of the devices to just freeze on boot. It its clear that this bug is the result of poor testing (in addition to a poor implementation of a conversion using loops rather than explicit divisions and moduli) and this week, I’d like to tell you about one of my tricks to debug code.
Read the rest of this entry »
2 Comments |
C, C99, hacks, Life in the workplace, programming | Tagged: #define, C Preprocessor, debug, design by contract, fence, GNU CPP, GNU CPP bug, GNU CPP bug no it's not a bug we won't fix it, macro, Magic Numbers, memory allocation |
Permalink
Posted by Steven Pigeon
20/01/2009
In a recent blog entry, Jeff Atwood makes the case that “hardware is Cheap, Programmers are Expensive”, basically arguing that in a lot of cases, it’s cost-efficient to add cheap, faster, hardware to a performance problem rather than investing time to actually enhance the code at the algorithmic and implementation level.
I do, however, disagree with him on many points.
Read the rest of this entry »
4 Comments |
algorithms, hacks, Life in the workplace, programming | Tagged: Better Software, Distributed Computing, Minimalism, Parallelism |
Permalink
Posted by Steven Pigeon
13/01/2009
The original Hungarian notation is due to Charles Simonyi who invented it sometimes while he was working at Xerox Palo Alto Research Center—the Xerox PARC that gave us the mouse and the first graphical user interfaces. The basic principle of Hungarian naming convention is to prefix the variables with one or many particles, encoding alternatively its type or its intend. This lets programmer write prgszNames as a variable name, which is perfectly legible to one well versed in Hungarian; however, but looks mostly like gibberish to just anyone else.
I recently changed my mind about the Hungarian naming convention. I don’t think it’s that stupid anymore.
Read the rest of this entry »
Leave a Comment » |
C, C99, Life in the workplace, Object Oriented Programming, programming | Tagged: C, Hungarian Notation, Microsoft, Naming Convention, PARC, POD, PODs, Xerox |
Permalink
Posted by Steven Pigeon
05/01/2009
The faulty code was leaked some time last week, and I’ve looked at it, and, well, it’s surprisingly clean (despite the obvious defect and how they should’ve found it before releasing it (see here)).
Have a look at the ConvertDays routine.
Read the rest of this entry »
3 Comments |
algorithms, C, C99, embedded programming, hacks, Life in the workplace, Operating System, programming | Tagged: Date Conversion, Microsoft, Source Leak, Unit Testing, Zune |
Permalink
Posted by Steven Pigeon
31/12/2008
The few Zune users where alienated today when they discovered that their Zunes just froze during boot. Apparently, a mysterious bug.
The cause of the bug was rapidly diagnosticated. According to Itsnotabigtruck on Zuneboards, the bug can be traced back to a defective date conversion routine. I reproduce here the code for you:
year = ORIGINYEAR; /* = 1980 */
while (days > 365)
{
if (IsLeapYear(year))
{
if (days > 366)
{
days -= 366;
year += 1;
}
}
else
{
days -= 365;
year += 1;
}
}
Can you see what’s just wrong about that code?
Read the rest of this entry »
10 Comments |
algorithms, C, embedded programming, Life in the workplace, programming | Tagged: Date Conversion, Laughingstock, Microsoft, Total Lack of Common Sense, Unit Testing, Zune |
Permalink
Posted by Steven Pigeon
30/12/2008
The cost of virtual functions is often invoked as a reason to C++’s poor performance compared to other languages, especially C. This is an enduring myth that, like most myths, have always bugged me. C++ myths are propagated by individuals that did not know C++ very well, tried it one weekend in 1996, used a bad compiler, knew nothing about optimization switches, and peremptorily declared C++ as fundamentally broken. Well, I must agree that C++ compilers in the mid-90s weren’t all that hot, but in the last fifteen years, a lot have been done. Compilers are now rather good at generating efficient C++ code.
However, the cost of calls, whether or not they are virtual, is not dominated by the the call itself (getting the address to jump to and jumping) but by everything else surrounding the call, like the stack setup and argument passing. Let us debunk that myth by looking at what types of calls are available in C and C++, how they translate to machine code, and see how faster or slower they are relative to each other.
Read the rest of this entry »
22 Comments |
assembly language, C, C99, database, hacks, Object Oriented Programming, programming | Tagged: C, calls, code generation, Compiler, micro-optimization, Object Oriented Programming, optimization |
Permalink
Posted by Steven Pigeon
23/12/2008
In Tunnels of Doom!, I wrote that the disjoint sets algorithm is one of the very few algorithms every programmer should know. That got me thinking. Should? What about must? If everyone must know about disjoint sets, what other algorithms must every programmer know about?
I made a “top ten” list of algorithms and data structures every programmer must know about.
Read the rest of this entry »
19 Comments |
algorithms, data compression, database, embedded programming, programming, Uncategorized | Tagged: array, Artificial Intelligence, Binary Search Tree, Binary Tree, Chess, disjoint set, Dynamic Programming, genetic algorithms, graph, graph algorithms, hash function, hash table, hashing, list, lookup table, memoization, one way function, QuickSort, Radix Sort, search, sorting, state space, state space search |
Permalink
Posted by Steven Pigeon