24 мая 2014 г.

Баг с аппаратной переключалкой WiFi

У меня баг проявился на Debian Jessie с карточкой Ralink RT3090 (HP ProBook 4720s).

Симптомы

1. Индикатор wifi не светится, аппаратная кнопка включения wifi не работает.

2. wicd (или network-manager) не отображает список доступных сетей.

3. Команда:

# iwlist wlan0 scan

Выдает ошибку:

wlan0   Interface doesn't support scanning : Network is down

4. Команда:

# ifconfig wlan0 up

Выдает ошибку:

SIOCSIFFLAGS: Operation not possible due to RF-kill

5. Команда:

# rfkill list all

Выводит:

0: some-wifi: Wireless LAN
        Soft blocked: no
        Hard blocked: yes


Решение

Нужно перезагрузить компьютер и до того, как загрузится Linux, включить аппаратную кнопку wifi.

Решение описано на stackoverflow и в баг-репорте.

16 мая 2014 г.

PySide: Internal C++ object already deleted

Эта ошибка возникает в следующем случае:
  • Имеется Python(PySide)-объект с ненулевым счетчиком ссылок, который привязан к некоторому C++-объекту QObject.
  • Где-то в C++-коде C++-объект уничтожается без ведома Python.
  • Где-то в Python-коде происходит обращение к Python-объекту, который теперь ссылается на уничтоженный QObject.

Наиболее вероятный сценарий уничтожения QObject в C++ без ведома Python такой:
  • По какой-то причине из Python или из C++ было запущено уничтожение родительского объекта QObject.
  • Управление получил C++-деструктор родительского QObject, который уничтожил все дочерние C++-объекты QObject.
  • Ссылки на эти дочерние объекты из Python остались висячими.

Соотвественно, при появлении такой ошибки стоит проверить, не были ли уничтожены родительские объекты.

Если объект был уничтожен совершенно внезапно (например, при нажатии никак не связанной с ним кнопки), возможно родительские объекты были удалены сборщиком мусора, который просто не был запущен до этого.

Отлаживать такую ситуацию довольно просто:
  • Собираем Python с отладочными символами.
  • Запускаем Python под GDB.
  • Ставим breakpoint на С++-деструктор того QObject, который внезапно удаляется.
  • Смотрим C++-backtrace (команда bt) и наслаждаемся поддержкой Python в GDB, которая позволяет распечатывать все PyObject.
  • Смотрим Python-backtrace (команда py-bt).

Если дело в сборщике мусора, то по backtrace-ам можно увидеть, начиная с какого объекта началось удаление.

Если GDB не распечатывает PyObject и py-bt не работает, скорее всего Python собран без отладочных символов.
Если GDB периодически печатает ошибку:

Python Exception <type 'exceptions.TypeError'> object of type 'FakeRepr' has no len()

то можно воспользоваться патчем.

12 мая 2014 г.

Python: загрузка модуля из заданного пути


Примеры даны для следующей структуры каталогов:

.
`-- foo
    `-- bar
        `-- __init__.py

Загрузка foo.bar по пути к __init__.py

Python 2

import imp
bar = imp.load_source('bar', '/foo/bar/__init__.py')

Python 3

import importlib.machinery
loader = importlib.machinery.SourceFileLoader('bar', '/foo/bar/__init__.py')
bar = loader.load_module('bar')

Загрузка foo.bar по пути к bar

Python 3

import importlib.machinery
loader = importlib.machinery.PathFinder.find_module('bar', ['/foo'])
bar = loader.load_module('bar')


8 мая 2014 г.

QEMU: Монтирование образа qcow2 с LVM

Самый простой способ - использовать guestmount.

# guestmount -a  image.qcow2 -i --rw /mount/point

В Gentoo это пакет app-emulation/libguestfs (лучше использовать версию >= 1.26).

Если возникнет ошибка:

libguestfs: error: cannot find any suitable libguestfs supermin, fixed or old-style appliance on LIBGUESTFS_PATH (search path: /usr/lib64/guestfs)

ее можно вылечить так:

# ln -s /usr/share/guestfs/appliance /usr/lib64/guestfs