Elegantly making a dictionary of lists

In Python I sometimes want to make a dictionary of lists. So usually I would write something like:


mydic = {}
for something in somethingelse:
mydic[somekey].append(something)

This however will not work, if somekey did not exist so far, because it will raise an exception. But there is help! You can use a collection:


import collections
mydic = collections.defaultdic(list)
for something in somethingelse:
mydic[somekey].append(something)

PyQt dynamic uic example

Here is a minimal example for PyQt4, to set up a main window and connect a simple action to some slot. The documentation on doing this is sparse to say the least. So I hope this is helpful for anyone trying something similar. I assume that you have created a ui_MainWindow.ui file with Qt Designer, which contains a form derived from QMainWindow.


import sys
from PyQt4 import QtCore, QtGui, uic

class MyMainWindow(QtGui.QMainWindow):

def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = uic.loadUi("ui_MainWindow.ui", self)
self.connect(self.ui.actionOpen, QtCore.SIGNAL('triggered()'), self, QtCore.SLOT('open()'))

@QtCore.pyqtSlot()
def open(self):
fileDialog = QtGui.QFileDialog(self, "Open file")
fileDialog.show()

app = QtGui.QApplication(sys.argv)
mainWindow = MyMainWindow()
mainWindow.show()
sys.exit(app.exec_())

Not happy with Qt on OS X…

I really don’t get happy with Qt 4.6 on OS X 10.6. Nokia rates Qt on that platform as Tier 2. Which means, it is not fully supported. This results in stupid things happening. With Licq, I currently have the problem that the whole program crashes with the following message:

+[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.

The problem here is that Qt 4.6 for 64 Bit is (rightly so) built using the Cocoa API, instead of the C-only Carbon API. Now it seems that Qt uses the NSUndoManager, which in turn has an undocumented (?) function _endTopLevelGroupings. And as the above mentioned message tells you, it is only safe to call that function from the main thread. Since the qt4-gui plugin of Licq runs in a separate thread, this assertion fails, and the whole program crashes. So this basically means you cannot start up your GUI from a secondary thread with Cocoa based Qt. This, I think, constitutes a bug in Qt.
Update: I submitted a bug tracker item, and erijo is producing a minimal example that will hopefully show the bug in action. Now let’s wait and see.

Syncing Google Calendar with the iPhone or iPod Touch

Since several people asked me how to do this, after I twittered about this, here it comes: How to correctly sync the Google Calendar with the iPhone. First step is to create a new calendar account in the iPhone settings (Email, Calendar, Contacts) using the Exchange protocol. The finished account should look something like this:
You can also sync the contacts and emails, if you want, but that’s optional. The second step is to go to http://m.google.com/sync/ to set up which of your google calendars you are going to sync. Beware: on the german iPhones, the page will display an error message, unless you switch to the english page!
That seems to be a bug on google’s page. So after you’ve done this, you get a list of your iPhones and can select for each device which calendars to sync:

Some small iPhone address book nags

I am using the try-out version of Mobile Me for the iPhone. Syncing the device with the Macbook Pro. Whenever I go to my address book, all the contacts appear twice. Very strange, I though, until I noticed that I was in the Group “All contacts”, which will show the contacts synced from the Mac and from Mobile Me. What a stupid way to present things. Right now, I just need to switch to “All contacts from my Mac” to fix this, but when I were to add another address book (say a corporate one or the Google one), I would be in trouble. Not very clever, Apple…

Qt woes on OS X 10.6…

Oh dear, Nokia and Macports do seem to hate me. I’ve spent half a day to get some version of Qt running on OS X 10.6.2. The problem is as follows. Nokia only provides 32 bit builds of their Qt SDK for OS X (universal binaries for PPC and i386) as can be seen here and here. Under OS X 10.5 this was no problem, since the whole system was basically 32 bit. But Snow Leopard now builds for x86_64 per default. Especially when using Macports. So I thought, lets just install the qt4-mac port from Macports. Wrong again! That port is currently broken. So, my project depends half on Qt and half on stuff from Macports. Now neither one is in a usable state. Ok, so I thought maybe I can force Macports to build in i386 mode only, to be compatible again with Qt. So I edited /opt/local/etc/macports.conf, cleaned the whole Macports tree and reinstalled. Fail again. This time, perl5 fails to build. That port is broken on 10.6 for non 64 bit builds. Hooray. Well, I give up for today, but will continue to investigate and will report back, as soon as either Nokia provides a decent 64 bit build, or Macports recovers and fixes any of their build issues.

What’s with PulseAudio?

After my upgrade to OpenSUSE 11.2, I noticed that VLC was again stuttering when playing videos. A quick check revealed, that the upgrade re-installed the PulseAudio system. Removing all Pulse related stuff fixed the problem. I wonder why, oh why on earth all the sound servers under Linux suck? And why are they default for every installation, if they don’t work as expected? I still own a nice SoundBlaster Live, which does sound mixing in hardware, which means I do not even need a sound server, since the card can expect many different audio streams from many applications. Anyway, please, dear sound server developers: If you need to write such a beast of a tool, make it work as expected!

Using YMP URLs from the command line

I just upgraded my home machine to OpenSUSE 11.2, and needed a few programs from secondary repositories. SUSE comes with those nice YMP URLs, which allow one-click installation of programs. However, after my change to using sudo from a few weeks back, this does not work anymore. The One Click Installer does not seem to be compatible with sudo yet. So I now found a workaround, by just using the shell to do the same. E.g. if you wanted to install Amarok 2.2, which does not come with SUSE 11.2, you would do:

/sbin/OCICLI http://software.opensuse.org/ymp/KDE:Backports/openSUSE_11.2/amarok.ymp

Nice, isn’t it?