Random notes from mg

a blog by Marius Gedminas

Marius is a Python hacker. He works for Programmers of Vilnius, a small Python/Zope 3 startup. He has a personal home page at http://gedmin.as. His email is marius@gedmin.as. He does not like spam, but is not afraid of it.

Sat, 31 Dec 2005

Seven segments

An interesting Python programming contest ended today. The task was to write the shortest Python module for converting a string of digits to seven-segment display format. The module was to be used like this:

>>> from seven_seg import seven_seg
>>> print seven_seg('0123456789')
 _     _  _     _  _  _  _  _
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_| _|

Solutions were measured with the Unix command wc -c seven_seg.py.

The shortest solution (by André Roberge, who is apparenly some kind of a genius) is 117 characters long. My best try was this 120-character-long one-liner of obfuscated Python:

seven_seg=lambda i,j=''.join:j(j(' _   _|_|_  | |'[ord('f\xda($\xbaDFZ64'[int(d)])>>r&14:][:3]for d in i)+'\n'for r in[6,3,0])

(Replace \xda and \xba with actual 8-bit characters, and make sure the file has no trailing newline to get a 120-byte long file.)

There is also a 30-character-long cheat that fools the test suite into thinking it is a valid solution:

class seven_seg(str):__eq__=id

It was fun to read about various solutions by other people in this thread on comp.lang.python, and in other places.

Update: Read André's Deconstruction of the 117-character solution (with insightful readers' comments about the Chinese Remainder Theorem).

posted at 00:33 | tags: | permanent link to this entry | 0 comments

Sun, 04 Dec 2005

Subversion troubles

I keep my home directory in a Subversion repository. A month ago that repository broke down. Subversion developers were unable to help me without access to the repository, which I didn't want to grant, since my repository contains some private data (Jabber account passwords and the like).

I spent a day debugging the problem until I found the cause (a loop in a data structure). Then I was too busy to do anything, and a month went by without regular backups. Two days ago I finally hacked a workaround and managed to extract a nearly complete repository dump. All is well again, except for my confidence in Subversion, which is a bit shaken.

All of my Subversion repositories now use the fsfs format. I only had troubles with the bdb format so far.

posted at 16:27 | tags: , , | permanent link to this entry | 0 comments

Putting ~ into Subversion

Backups: everyone knows they're important, but no one does them until they lose data (or barely escape losing data, if they're lucky).

My old laptop's old hard disk almost died once, and that made me think about backing things up. I read an inspiring article by Joey Hess, and decided to keep most of my home directory (all the numerous small files) in a Subversion repository on a remote server. It worked quite well for almost a year. I changed the hard disk, got a new laptop, and switched Linux distributions (Debian to Ubuntu), and every time all I had to do was install Subversion and check out my home directory.

I can also check out various subdirectories (such as ~/bin, ~/.mutt, ~/.vim) on other machines, and keep useful scripts and configuration files synchronized.

I have a shell script 'autocommit' that runs svn add and svn commit for a few common places (Tomboy notes, Firefox profile, IRC logs). I review changes to other and commit them manually. I have included a large number of automatically generated junk files in svn:ignore properties (~/.gconf falls in this category, since the diffs are numerous and useless).

Some subdirectories are not versioned (~/img, ~/mp3, ~/src, ~/Mail). I back up large amounts of data (such as my photo collection) with rsync. I keep my source trees in separate repositories. I keep all my mail on a IMAP server, and use offlineimap to synchronize it with a bunch of Maildirs on the laptop.

I do not keep my private keys (GPG and SSH) in the repository.

Here's how I do backups:

$ backup-to-musmire

Rsync ~/img, ~/mp3 etc. to my home file server.

$ offlineimap

Synchronize all my mail folders.

$ autocommit

Commit periodically changing files to Subversion.

(The three commands above can be run in parallel)

$ svn st

See if there are any uncommitted changes. If there are, I'll commit them separately with meaningful log messages. If there are unknown files, I'll either svn add and svn commit them, or I'll add them to svn:ignore.

posted at 16:15 | tags: | permanent link to this entry | 0 comments