VirtualBox 4.0 USB

С выпуском четвертой версии виртуальной машины VirtualBox среди прочих изменений в стала доступна возможность подключения USB-устройств в гостевой ОС. Вообще говоря, такая возможность была раньше и в проприетарной версии.

При попытке воспользоваться этой возможностью может обнаружиться примерно такой симптом: в списке устройств все устройства подключенные к физической машине есть, но они "неактивные" и галочки не горят. Соответственно, в гостевой ОС их не видно.

Существуют инструкции, в том числе и на официальном сайте VirtualBox, где объясняется как монтировать /proc/bus/usb, чтобы все заработало. Так вот, эта инструкция только для относительно старых ядер, например в openSUSE 11.2 монтировать ничего не нужно.

Для активации поддержки USB следует: во-первых, убедиться что существует группа vboxusers и нужные пользователи включены в неё, во-вторых, открыть /etc/udev/rules.d/60-vboxdrv.rules и активировать там соответствующие настройки:

KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"
#these two lines give access permission to vboxusers to properly work with usb nodes, this could be security risk (bnc#664520) !!
SUBSYSTEM=="usb_device", ATTR{devnum}=="?*", ATTR{busnum}=="?*",NAME="vboxusb/$attr{busnum}/$attr{devnum}", GROUP="vboxusers"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{devnum}=="?*", ATTR{busnum}=="?*",NAME="vboxusb/$attr{busnum}/$attr{devnum}", GROUP="vboxusers"

После этого надо чтобы настройки вступили в силу, кто не знает как этого добиться — может просто перезагрузиться. После этого все должно работать. Не поддавайтесь на устаревшие инструкции.

python и ленивые(lazy) атрибуты

В интернете куча примеров как сделать ленивые атрибуты для класса, чтобы не искать, оставлю здесь еще один пример:

class lazy(object):
        def __init__(self, function):
                self._function = function

        def __get__(self, instance, owner = None):
                if instance == None:
                        return self
                val = self._function(instance)
                setattr(instance, self._function.func_name, val)
                return val

class line(object):
        def __init__(self, line = None):
                self._line = line

        @lazy
        def items(self):
                return self._line.split()

Объяснение: items, коль скоро он декорируется, становится объектом класса lazy, и начинает восприниматься как дескриптор(descriptor). Поэтому __get__, __set__ и __delete__ могут быть определены у класса lazy. Конкретная реализация __get__ вычисляет значение функции и привязывает объект с результатом в качестве атрибута вместо себя на свое имя. Значит, последующие обращения к items — уже не вызов функции, а просто операции со списком, что вернулся при первом вызове.

boost.python

Для сборки чего-либо с использованием boost.python его авторы рекомендуют использовать bjam, угрожая при этом в документации, что если что-то и отвалится, то исключительно по причине не использования оного.

Если не использовать bjam, то существует подсказка для выбора правильных параметров для компиляции и линковки: идем в ./libs/python/example/quickstart и просим bjam -n (т.е. распечатать команды вместо того, чтобы их запускать)

Кроме того, у меня работал вот такой Makefile:
all: test1.so

test1.so: test1.o
 $(CXX) -shared $< -o $@ -lboost_python

test1.o: test1.cpp
 $(CXX) `python-config --includes` -fPIC $< -c -o $@