Обнаружил каталог с кучей фоток с концерта Therion в НАУ:
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
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/s | 119 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 винты на ходу. Вроде живое.


