About Blog PGP Key

Шрифты

Я думал что в 21 веке такие ужасные шрифты только Tk умеет рисовать:

Noise Ninja Linux

Благо что plugin к Bibble выглядит как положено =)

Therion, Kiev, December 2010

Обнаружил каталог с кучей фоток с концерта Therion в НАУ:

20101208_001229.jpg

 continue reading

баги llvm-g++ в OS X

Кусок кода, похожий на этот, имеется в исходниках Qt:

// --- inspired by qt_memconvert() from qt.git/src/gui/painting/qdrawhelper_p.h

class qrgb888
{
public:
    qrgb888(char r, char g, char b)
    {
        data[0] = r;
        data[1] = g;
        data[2] = b;
    }
private:
    uchar data[3];
} __attribute__ ((__packed__));

qrgb888 create_color()
{
    return qrgb888(0, 0, 0);
}

int main(int argc, char* argv[])
{
    static const int kCount = 32*32*sizeof(qrgb888); // 32x32, 24bpp
    qrgb888 *ptr = guard_alloc<qrgb888>(kCount);

    qrgb888 *iptr = ptr;
    for (int i = 0; i < kCount; ++i)
    {
        *iptr++ = create_color();
    }
    guard_free(ptr);
}

Внезапно оказалось, что в OS X 10.7 /usr/bin/g++ стал симлинком на нечто под названием llvm-g++-4.2. И это нечто совершенно неправильно понимает такой код.

Вот, что оно генерирует для main():

LBB8_1:
    movq    -48(%rbp), %rax
    movq    %rax, -32(%rbp)
    movq    -32(%rbp), %rax
    movq    %rax, -64(%rbp)
    callq   __Z12create_colorv
    movl    %eax, %ecx
    movq    -64(%rbp), %rdx
==> movl    %ecx, (%rdx)
    movq    -48(%rbp), %rcx
    movabsq $3, %rdx
    addq    %rdx, %rcx
    movq    %rcx, -48(%rbp)
    movl    -52(%rbp), %ecx
    addl    $1, %ecx
    movl    %ecx, -52(%rbp)

В отмеченой строчке инструкция копирует ровно 4 байта (оператор присваивания в цикле). Естественно, что для последней итерации, последний байт перетрет что-то за пределами массива.

Тот-же кусок, скомпилированный явно /usr/bin/g++-4.2 (новее в макоси нет):

L42:
    movq    -40(%rbp), %rbx
    call    __Z12create_colorv
    movslq  %eax,%rcx
    movzbl  %cl, %eax
    movq    -80(%rbp), %rdx
    movq    %rdx, -88(%rbp)
    movzbq  %al,%rdx
    movq    -88(%rbp), %rax
    movb    $0, %al
    orq     %rdx, %rax
    movq    %rax, -88(%rbp)
    movq    -88(%rbp), %rax
    movq    %rax, -80(%rbp)
    movzbl  %ch, %eax
    mov     %eax, %edx
    movq    -80(%rbp), %rax
    movb    %dl, %ah
    movq    %rax, -80(%rbp)
    movq    %rcx, %rax
    shrq    $16, %rax
    andl    $255, %eax
    movq    -80(%rbp), %rdx
    movq    %rdx, -96(%rbp)
    andl    $255, %eax
    movq    %rax, %rdx
    salq    $16, %rdx
    movq    -96(%rbp), %rax
    andq    $-16711681, %rax
    orq     %rdx, %rax
    movq    %rax, -96(%rbp)
    movq    -96(%rbp), %rax
    movq    %rax, -80(%rbp)
    movzwl  -80(%rbp), %eax
    movw    %ax, (%rbx)
    movzbl  -78(%rbp), %eax
    movb    %al, 2(%rbx)
    addq    $3, -40(%rbp)
    incl    -20(%rbp)

Тут уже нет одного 32-разрядного movl. Компилятору пришлось нагородить кучу кода, чтобы присвоить это побайтно…

Самое глупое в этом то, что этот llvm-g++-4.2 — дефолтный /usr/bin/g++. Из-за чего Qt и любой другой софт, использующий просто g++ по дефолту, может работать неправильно.

Я даже не знаю, куда это репортить. И есть ли вообще в этом смысл, если в 10.6 оно так-же не работает в llvm-g++ (но оно хоть там не дефолт).

Исходник: gcc-llvm_alignment.cpp

Independence day, Ukraine 2011

Чуть нафоткал сегодня:

20110824_183437_00.jpg

 continue reading

screen && mutt

mutt, запущенный из konsole/xterm ловит нажатия Ctrl+Up/Ctrl+Down как:

Char = <C-Up>, Octal = 1060, Decimal = 560
Char = <C-Down>, Octal = 1007, Decimal = 519

Но если же его запустить из screen/tmux, то получим:

Char = A, Octal = 101, Decimal = 65
Char = B, Octal = 102, Decimal = 66

[ проверяется с помощью :exec what-key ]

При том bind’ы как просто на кнопки A и B не работают.

Похоже на какую-то багу в terminfo. Если в screen выставить TERM=xterm то хоткеи начинают работаь правильно. Но при этом вылазят глюки в отрисовке.

rss2email

Уже достаточно долгое время (примерно с момента переезда с KDE3 на KDE4) читаю RSS-ки с помощью rss2email. Из-за отсутствия чего-то получше. Оно предельно простое — подобавлять feed-ов, и запускать из крона раз в N минут. Все что накачает будет сваливать в почту.

Очень сильно бесила его однопоточность. Вот если есть порядка сотни feed-ов, то оно будет долго и нудно их качать в порядке очереди.

За свободное время в течение последних двух недель я таки это запинал. Жить стало заметно лучше. Под шум ремонта полез ковырять остальные мелочи:

  • Добавил заголовок X-RSS-Author (если инфа есть в feed-е)
  • Выкачивание поста целиком, если в feed-е только огрызок из пары первых предложений. Работает, естественно не везде (хабр, opennet, finance.ua, korrespondent.net). Для добавления нового сайта по идее достаточно указать его URL и один XPath (скорее всего простейший вида //div[@class=”…”]
  • Нечто типа скоринга и костыли чтобы этот score засунуть в mutt (из-за того что последний не умеет скорить не только по содержимому, но и по кастомным заголовкам).

В итоге, после некоторой настройки mutt, вполне себе удобненько. Добавил пару хоткеев на просмотр HTML в links2 -g. А в thunderbird выглядит вообще хорошо.

Еще очень хочется, как минимум, выпилить оттуда питоновские pickle.

Python: Ctrl+C и Thread.join()

Неужели нельзя было это сделать по-человечески.. Если сказать треду .join() то уже не получится прервать работу из терминала, нажав Ctrl+C.

В интернетах в качестве костыля советуют указывать таймаут. Только у Queue.join() нет такого параметра.

def interruptibleCall(function):
    def internal2(*args, **kw):
        class Background(threading.Thread):
            def __init__(self):
                threading.Thread.__init__(self)
                self.error = None
                self.result = None
            def run(self):
                try:
                    self.result = function(*args, **kw)
                except:
                    self.error = sys.exc_info()
        b = Background()
        b.setDaemon(True)
        b.start()
        while b.isAlive():
            b.join(100500)
        if b.error:
            raise b.error[0], b.error[1]
        return b.result
    return internal2

Использовать так:

inQueue = Queue()
...
interruptibleCall(inQueue.join)()

Грустновато как-то

Scorpions 2010 @Kiev

Только что завалился домой с концерта..

Еще на выходе с метро Левобережная образовалась толпа людей топающая в сторону МВЦ. Где-то в 18:40 приперлись к зданию, увидели здоровенный бигборд с планом здания и мануалом, кому к какому входу идти. Дальше пошли вокруг в попытках найти правильный вход. Людей была уже куча.

Обойдя здание почти на 360 градусов увидели правильный вход в партер. Вошли вообще без очереди, без всяких ожиданий (чего не скажешь про двухчасовое отмораживание на концерте Тарьи). Охрана тоже пропускала всех быстро.

Внезапно оказалось что такое достижение науки как гардероб организаторам неизвестно.. Из-за этого пришлось таскаться с куртками. Далее купили водички попить и с ней двинулись искать наши места.. К местам нас отказался пускать другой охранник, мол с водой (купленной там же в МВЦ по пятикратной цене) входить нельзя. Дальше внезапно оказалось что я где-то потерял наклееную на руку ленточку правильного цвета, по которой должны пускать. Быстро вернулись назад и нашли её. Завалились на места и стали ждать.

Где-то в 19:10 на сцену вылезла какая-то группа неизвестного происхождения, которая что-то пыталась петь. При том что вроде как обещали что никого кроме скорпов не будет. Петь они хоть и пытались, но получалось у них это очень хреново. Даже свое название они попытались сказать после 3-й песни. Хотя я один фиг его не расслышал. В это время все еще приходили люди.

Где-то в восемь эти вот свернулись и удалились. Вместо ожидаемых скопров на сцену вылез непонятно кто и начал пытаться развлекать людей приемами, которые сработали бы максимум в детском саду. Такая фигня продолжалась минут 15.

Дальше минут 40 все просто непонятно чего ждали.. По сцене кто-то лазил, играла какая-то фанера.

В 9 вечера появились скорпы с песней Sting in the tail. Чего я боялся, что концерт будет состоять только из песен последнего альбома.. Некоторые треклисты на это тоже указывали. Слава богу это оказалось не так. Из того что обрадовало очень сильно (порядок случайный):

  • Send Me An Angel
  • Holiday
  • Big City Nights
  • The Zoo
  • Still Loving You
  • Wind Of Change
  • Bad Boys Running Wild

Закончилось все песней Rock You Like a Hurricane.

Единственное что, так это звук. Он был каким-то средним. А временами весьма плохим. При том что это был центр зала. Возможно почти часовая задержка была как-то связана с этим.

В целом концертом очень доволен. Организован он минимум на порядок лучше чем недавний концерт Тарьи… Людей был заполнен почти весь зал. IMHO тысяч 10-20 народу было. Фоток нет, ибо камеру брать побоялся.

В мае вроде как скорпы будут в москве/питере. Может еще раз побываю.

Концерт Тарьи

Только что вернулся с концерта Тарьи. Если коротко, то это было прекрасно.

К НАУ приперлись около 17:30 при начале концерта в 19:00. Камеру решил не брать, чтобы в случае чего не нужно было решать проблему “куда её деть”. Уже собралась толпучка людей человек 300-500. Там же познакомился с одим фотографом-любителем, который надяелся пронести на концерт D700 с 70-200 f/2.8. Он показал сегодяшние его фотки с Биллом Клинтоном.

Пускать в вестибюль начали около 20:00… Там простояли еще около часа в ожидании непонятно чего.. В итоге в зал запустили часам к 9 вечера..

Первым выступала какая-то непонятная группа под названием Markize. Кроме красивой вокалистки (которая либо не умела петь, либо её просто не было слышно) группа какая-то уныла. К большой радости окружающих очередную группу под названием White просто отменили, т.к. и так уже все затянулось.

Дальше выступала Тарья. Это было действительно что-то… Звук супер. Играла в основном песни с последнего альбома. Из Nightwish’а был буквально один трек. В паузе барабанщик (Кажется Майк Террана) исполнил классное барабанное соло. Где-то в середине Тарья даже поиграла на синтезаторе. За время концерта вокалистка дважды меняла прикид. Началось с черного и закончилось белым.

Организация на традиционно совковом уровне.. Опоздание на два часа, всего два входа на полторы тысячи человек… Но в целом, концерт супер.

Домой вернулся в час ночи.

dm-crypt+mdadm или тормозной RAID5

Обзавелся пачкой из трех винтов:

[    2.450546] ata2.00: ATA-8: WDC WD1002FAEX-00Z3A0, 05.01D05, max UDMA/133
[    2.450839] ata2.01: ATA-8: WDC WD1002FAEX-00Z3A0, 05.01D05, max UDMA/133
[    2.812772] ata1.01: ATA-8: WDC WD1002FAEX-00Z3A0, 05.01D05, max UDMA/133

Захотелось сделать из них RAID5 + с шифрованием. Ключ на флешке. Система — простой Core i3 со встроенным всем что только можно. Используется как файлопомойка, плеер, торренты. Иногда еще ядра собираю на ней. Система живет на винте из сдохшего ноута.

Подключил, сказал mdadm-у сделать RAID5 из трех дисков. В /proc/mdstat появилась инфа, что диски синхронизируются. В это время поигрался dd c получившимся девайсом. Чтение оказалось около 150 мб/сек, запись — 70. Вроде вполне нормально.

Дальше сгенерил новый ключ для dm-crypt. Сразу же его забэкапил. С помощью cryptsetup все включил. Попробовал dd снова. Оказалось что чтение теперь порядка 70 мб/сек а запись около 30. При этом судя по top’у в CPU мы не уперлись…

Начал играться. Попробовал вместо RAID5 сделать RAID1 из двух винтов. Скорость чтения на этапе dm-crypt падает больше чем в 2 раза.

Позже пришла в голову гениальная идея.. Вместо связки mdadm+dm-crypt попробовать шифровать винты отдельно и уже потом запускать mdadm.

В результате всего получил следующую табилцу:

  mdadm mdadm+dm-crypt 3x dm-crypt + mdadm
Seq read 168 Mb/s 57Mb/s119 Mb/s
Seq write 80 Mb/s 36 Mb/s 64 Mb/s

Тестил еще и с помощью bonnie, но результаты похожие. Лень их сюда писать.

Т.е. вариант с шифрованием отдельных винтов быстрей. Выглядит как реальная бага. Спросил в LKML. Кто-то ответил, что dm-crypt шифрует в один поток.

В итоге остановился пока на варианте с 3xdm-crypt + mdadm. Дальше оказалось, что из коробки Debian testing не в состоянии смонтировать это автоматом. Особенно учитывая LVM сверху. Пришлось дописать чуть init-скрипт.

Пока что все работает. Пробовал дергать SATA винты на ходу. Вроде живое.