о компах

git

Переехал с svn на git. bisect, stash и прозрачные, удобные бранчи заставляют биться в экстазе.
Паблик: git://github.com/0xd34df00d/leechcraft.git
SVN будет закрыт через неделю-другую.

Прям месяц изменений какой-то.

О целевой аудитории и статистике

Внезапно обнаружил, что здесь недалеко стоит awstats, чем и воспользовался.

Windows   10349  36.2 %
Linux 9238 32.3 %
Unknown 8730 30.5 %
Macintosh   124 0.4 %
BSD 115 0.4 %

Соотношение WIn и Lin совсем не такое, как в общепринятых статистиках.

По браузерам все еще веселее (взяты первые N):

Firefox 5764   20.1 %
MS Internet Explorer 5221 18.2 %
Unknown 5199 18.2 %
Akregator (RSS Reader)   4794 16.7 %
Mozilla 2916 10.2 %
Wget 2429 8.5 %
Opera 1083 3.7 %
Safari 483 1.6 %
Konqueror 426 1.4 %
Netscape 192 0.6 %

Если глянуть более детальную статистику, окажется, что большинство фоксоюзеров пользуется свежим 3.0.5. Заботятся о безопасности, чо. Почти никто не сидит на 3.1. Красноглазики кончились, чо.

Поисковые запросы — 72.8% принадлежит словам "openid", "account", "login", что символично, т.к. OpenID у меня до сих пор сломан. Также заставили улыбнуться следующие единичные случаи шизофрении:

  • перехожу на jabber
  • опенсорс
  • настройка tp-link 8811 opensuse (этот не единичный, аж трое таких)
  • opensuse 11.0 настройка tp link adsl 8811 (Зомг, еще один. Почему мой блог?! Я сроду не юзал opensuse и не настраивал этот девайс)
  • КО-52/Н
  • index-pack failed что делать

Погрели душу:

  • установка debian на inspiron 1525
  • скачать альбом группы cue bring back my love
  • wonder what’s next
  • pdf for pocket pc (и еще два подобных запроса)

А вообще, это неудивительно, ведь 75.1% хитов пришло с Windows Live, оставшиеся — с гугла. Забавно, что больше никаких поисковых систем.

В избранное добавили 10% посетителей.

Менделеев блджад

Проснулся в 3 утра, пофиксил логическую ошибку в дополнялке тегов, которая не давала мне покоя уже больше полугода, ушел в сон дальше. Положительно.

Fuck KDE!

Допилил Openbox + stalonetray + tint2 + conky + xcompgr.

Образ
(Кликабельно, 1MB)

У фона заметил уже один недостаток - пыль на мониторе видно.

Fucking Decryptor

Потребовалось тут написать прогу, производяющую хитрющие манипуляции со входным потоком байт (расшифровка спектра гамма-линий ядерного распада изотопов тория), с гуйками и прочим, и под виндой, чтобы было все красиво. Естественно, взял C++ + Qt, количество строк в программе - 48, объем конечной программы, учитывая либы куте и редист MSVS - 8 метров. Набросал скрипт для NSIS, так что в инсталлере все это весит чуть меньше пяти метров. Да, пять метров для простой тупой программы. Докатились. Надо было на пейтоне писать.

Полгода

Ну вот и начала глючить вентиляция купленного в конце августа Dell Inspiron 1525. То ли засорилась пылью, то ли термопаста подсохла, в любом случае - компилирую сейчас новый Psi, а проц разогрелся до 94 градусов, корпус трещит, напоминая подводные лодки в американских фильмах. В режиме покоя сейчас под 50 градусов, а после покупки было — 38-40. Не дело, надо будет открыть, почистить и термопасту обновить.

Мотивационное

На днях в разговоре с одним товарищем, согласившемся участвовать в LC, выяснилось, что для реализации поддержки поисковых запросов типа category:torrents AND metallica the unforgiven AND NOT (live OR video) нужны ДНФ/КНФ. Не вершины дискретного анализа, конечно же, но нехило так прибавляет мотивацию учиться.

Родилось тут

SIGMOLE: Pigmentation fault.

Mole - родинка, есличо.

Петабайты

Вот уж не думал, что увижу такие цифры в обозримом будущем на своей домашней машине. А увидел.

  1. % sudo ifconfig lo
  2. lo Link encap:Local Loopback
  3. inet addr:127.0.0.1 Mask:255.0.0.0
  4. inet6 addr: ::1/128 Scope:Host
  5. UP LOOPBACK RUNNING MTU:16436 Metric:1
  6. RX packets:104820133543 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:104820133543 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:0
  9. RX bytes:1144708071012775 (1.0 PiB) TX bytes:1144708071012775 (1.0 PiB)

RTTI + dlopen + GCC = баг

Если грузить библиотеку, юзающую какой-либо класс, через dlopen, то слияния объектов type_info не произойдет, поэтому имеем забавное поведение, а лично я поимел три часа секса от обнаружения сломанного dynamic_cast до написания тесткейса.

classb.h:

  1. struct a
  2. {
  3. virtual ~a() {}
  4. };
  5.  
  6. struct b : public a
  7. {
  8. virtual ~b() {}
  9. };

test2.cpp:

  1. #include <typeinfo>
  2.  
  3. #include "classb.h"
  4.  
  5. extern "C"
  6. {
  7. a* getnewb() { return new b; }
  8. const std::type_info& gettypeb() { return typeid (b); }
  9. }

test.cpp:

  1. #include <dlfcn.h>
  2. #include <typeinfo>
  3. #include <iostream>
  4. #include <cassert>
  5.  
  6. #include "classb.h"
  7.  
  8. typedef a *(*func_t) (void);
  9.  
  10. int main()
  11. {
  12. func_t func;
  13. const std::type_info& (*type) (void);
  14.  
  15. void *handle = dlopen ("./test2.so", RTLD_NOW);
  16. func = (func_t) dlsym (handle, "getnewb");
  17.  
  18. type = (const std::type_info& (*) (void)) dlsym (handle, "gettypeb");
  19.  
  20. a *a_ptr = (*func) ();
  21. const std::type_info& t = (*type)();
  22.  
  23. assert (dynamic_cast<b*> (a_ptr));
  24. assert (typeid (b) == t);
  25. }

Компилять:

  1. g++ -g -fPIC -o test2.so -shared test2.cpp
  2. g++ -g -o testcase test.cpp -ldl

UPD: Если чуть подробнее, type_info::operator== на линугзах (ну и везде, где есть поддержка weak symbols) в общем случае сравнивает указатели на строки с типами вместо честного strcmp по самим строкам. В обычных условиях все type_info для физически одинаковых объектов изменяются так, чтобы указатели указывали (разработчики разрабатывают) на одну и ту же строку, это и есть слияние (merging). Если грузить библиотеку через dlopen, как в примере, то этого не происходит, поэтому получаем интересное поведение, как, например, assertion failed в примере.

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

Qt и LGPL

http://labs.trolltech.com/blogs/2009/01/14/nokia-to-license-qt-under-lgpl/

Да, я был прав год назад, когда писал, что не стоит париться из-за покупки Нокией Trolltech.

Ну и луч ненависти

Девятая студия ниасиливает std::find на контейнере (std::vector в моем случае) с POD-структурой, определенной внутри другого класса, если явно не определен operator== как функция-член этой структуры.

(c) bash.org

<komputes> I'm on a unix based operating system which means i get laid as many times as I have to restart my computer
<marky-b> same, but i run windows

На домашней машине:

% uptime
19:40:40 up 226 days, 5:07, 12 users, load average: 2.48, 2.43, 2.37

Греет душу

Захожу на what.cd, а там, наконец:

* Up: 8.88 GB
* Down: 8.84 GB
* Ratio: 1.00

Надо выкачать что-нибудь большое и толстое по этому поводу.

flac -> ogg в N потоков

Накачал тут свежего флака с what.cd, а для айпода лучше бы в ogg vorbis перекодировать, чтобы драгоценное место там не занимал. Уже довольно давно для этих целей пользую flac2ogg (аттач номер 1), который вызывается в форме flac2ogg *.flac и автоматически перекодирует файл из флака в ogg, сохраняя соответствующие теги и имя файла (меняя .flac на .ogg, естественно).

Сегодня же я внезапно понял, что, имея четырехъядерный процессор, грешно перекодировать в один поток, надо бы это дело как-то параллелизовать. После недолгих раздумий решено было написать makefile, который бы просто вызывал уже существующий flac2ogg.

Все бы ничего, и makefile в пять строчек получился, если бы не наличие пробелов в имени файла. После небольшого гуглежа получаем монстрика, который сейчас лежит во втором аттаче к этому посту. Пользуйтесь на здоровье. Запускаем как make -jN -f /path/to/Makefile, в самом мейкфайле надо подправить путь к скрипту flac2ogg.

Также, не уверен, как друпал кросспостнет ссылки на аттачи в ЖЖ, поэтому для лже-читателей:
flac2ogg
Makefile