Let’s take a look into my home directory:
[stick@spectra 0 ~] ls -F
Applications/ Documents/ google.txt reverse-ssh*
Desktop/ Downloads/ public_html/ work/
[stick@spectra 0 ~] ls -AF
.0verkill google.txt public_html/
.adobe/ .grails/ .pulse/
.android/ .gstreamer-0.10/ .pulse-cookie
Applications/ .gtk-bookmarks .pyhistory
.AtomicWorm/ .gtkrc-2.0-kde4 .qt/
.bash_history .gvfs/ .rawstudio/
.bashrc .hplip/ .recently-used
.bouml .htoprc .recently-used.xbel
.boumlrc .hugin .repoconfig/
.bzr.log .icedteaplugin/ reverse-ssh*
.cache/ .inkscape/ .rnd
.cddb/ .inputrc .rpmpatch_macros
.cedega/ .IntelliJIdea80/ .rpmpatch_rpmrc
.civclientrc .IntelliJIdea8x/ .scummvmrc
.civserver_history .irssi/ .signature-gk2
.config/ .java/ .signature-gmail
.crack-attack/ .JxBrowser/ .signature-suse
.cxgames/ .kde/ .skel/
.darkplaces/ .kde4/ .Skype/
.dbus/ .kderc .smc/
.designer/ .kinorc .springrc
Desktop/ .ktorrent.lock .sqlite_history
.directory .lbrc.conf .ssh/
.dmrc .lesshst .strigi/
Documents/ .links/ .subversion/
Downloads/ .liquidwarrc .teeworlds/
.dvdcss/ .local/ .thumbnails/
.eclipse/ .loki/ .thunderbird/
.emacs .macromedia/ .ufrawrc
.esd_auth .mc/ .ultramixer/
.fbhighlevelshistory .mcop/ .vendetta/
.fbhighscores .miro/ .viminfo
.fblevels/ .mixxxbpmscheme.xml .vimrc
.fbrc .mixxx.cfg .VirtualBox/
.fontconfig/ .mixxxmacros/ .vlc/
.fonts/ .MixxxMIDIBindings.xml .vnc/
.fonts.conf .mixxxtrack.xml .w3m/
.gajim/ .mozilla/ .Wammu
.gconf/ .mplayer/ .wapi/
.gconfd/ .mysql_history .windows-label
.gegl-0.0/ .mysticmine .wine/
.gem/ .netxrc .winetrickscache/
.gimp-2.6/ .nexuiz/ work/
.gitconfig .ooo3/ .Xauthority
.gnome/ .opera/ .xim.template
.gnome2/ .osc_cookiejar .xine/
.gnome2_private/ .oscrc .xsession-errors
.gnupg/ .profile .y2usersettings
.google/ .psi/
.googleearth/ .psql_history
Out of 148 entries in my $HOME, there are only 12 of them I really want to see! How much nicer would it be, if it looked like this:
[stick@spectra 0 ~] ls -AF
Applications/ Documents/ public_html/ .signature-gmail
.config/ Downloads/ reverse-ssh* .signature-suse
Desktop/ google.txt .signature-gk2 work/
This is very simple to achieve, if only applications followed the XDG Base Directory Specification. Unfortunately, lots of them don’t. When you start using the following piece of code in your new awesome applications:
config = getenv("XDG_CONFIG_HOME")
if (!config) config = getenv("HOME") + "/.config"
config = config + "/my_awesome_app"
instead of the old-school one:
config = getenv("HOME") + "/.my_awesome_app"
users will gain two great advantages with nearly no extra effort:
So, please, don’t ignore the ugly duckling called $XDG_CONFIG_HOME, I’m sure it will mature into a beautiful swan.
W3C added nice new options for creating rounded corners of elements to their CSS3 working draft. Engines like Gecko, KHTML and WebKit already implemented these functions, but they use vendor prefixes in the keywords (-moz-border-radius, -khtml-border-radius and -webkit-border-radius respectively), because the feature is not yet fully standardized. That’s also the reason why Opera and Internet Explorer decided not to implement this extension for now.
I was playing with the rounded corners and I like this feature a lot, but I also hit one problem (in all 3 engines). When you use the border-radius with an img element, the image is drawn above the border, so it isn’t rounded (left example). Fortunately, the effect could be easily achieved by rounded div, setting its dimensions exactly to the image size and using the image as the div‘s background (right example).
 |
 |
<img style="border: 2px solid black;
border-radius: 30px;
-moz-border-radius: 30px;
-khtml-border-radius: 30px;
-webkit-border-radius: 30px;"
src="presov.jpg" />
|
<div style="border: 2px solid black;
border-radius: 30px;
-moz-border-radius: 30px;
-khtml-border-radius: 30px;
-webkit-border-radius: 30px;
width: 180px;
height: 240px;
background: url('presov.jpg');" />
|
Update#1: I reported the issue to Gecko, KHTML and WebKit bugzillas.
Update#2: Dave Hyatt closed the WebKit bug with the comment: “This was fixed recently.” \o/

Folks at Google announced the list of accepted organizations for Google Summer of Code 2009 tonight. I am very happy that openSUSE was included again. Of course, we don’t want to disappoint them, so keep your great ideas coming!

A few days ago I came across Feature #305877. What is it about? Well, Debian has the Popularity Contest, which tracks installed packages, how often they are used and sends an anonymized report once a week to their server. This maps the usage of Debian packages and as a nice side effect Debian guys can estimate the size of their user base on various platforms and releases. This also gives information about the community structure (e.g. how many users use development tools or graphic applications). This would be a very neat thing to have in openSUSE too!
At first, the task seemed pretty straightforward – just to replace dpkg calls with corresponding calls to rpm. There was one catch, though. Because of the transactions, which RPM uses, scanning on my openSUSE 11.1 machine took 2 minutes instead of 2 seconds on Debian! That’s because RPM creates one transaction for each package and constant locking and unlocking of rpmdb makes this process really slow. I rewrote the script to python, just to see how long will it take using only one long transaction and was very pleasantly surprised that it got back to 2 seconds.
Moreover, rpmdb can tell you the exact time when the package was installed, so there was no need to check for ctime for files inside the packages like Debian does. (We still have to check for files atime to determine whether the package is used or not, though).
For the server part I was pretty sure about writing it in C to have it very fast and responsive, because I want to process incoming requests on the fly. The problem was with the storage. At the beginning I thought about using SQLite, but after some testing I decided to use much lighter disk-based hashtables TDB from the Samba team, because they perfectly fitted my humble needs.
Has this caught your interest? You can dig through the code at gitorious and any help is deeply welcome!. Yes, and why popcorn? Because the original is called popcon, but everybody at work just kept calling it popcorn during the discussions. Later I found another reason: popcorn is intended for RPM packages, so we definitively need an extra R in the name.