Они считают меня умным

Закрылся. Все "отл", в том числе, сегодняшний аналит. К нему я готовился больше всего - начал позавчера )

Круто-круто. Для затраченных усилий, которые все вместе легко укладываются в половину недели, вполне неплохой результат. Да и вообще неплохой результат. Я доволен.

На ближайший месяц - жжом с Личкрафтом, делами проектными и прочим стаффом. А, ну да, претендуем на абрамовскую стипуху, чтобы можно было покупать еще больше бёрна и убивать свою сосудистую еще эффективнее.

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

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

Good job

Надоело мне, что LeechCraft::Aggregator подтормаживает при обновлении большого количества фидов, поэтому решено было взять в руки профайлер и пройтись с ним по процессу обновления. Итак, две оптимизации сделали 95% успеха.

Первая - пренебрег принципом минимальности интерфейса и ввел у стораджа функцию для получения полных описаний всех новостей, относящихся к каналу. Раньше этот процесс проходил через получение кратких описаний всех новостей и дальнейшего обхода по списку кратких описаний с получением полных. Эта оптимизация дала где-то 35% прироста.

Вторая.
CREATE INDEX idx_items_parents_hash_title_url ON items (parents_hash, title, url);
Это где-то оставшиеся 60% выигрыша в производительности. Ну да, ценой немного раздувшейся БД (процентов на 15), но, думаю, пользователь переживет.

Теперь процесс обновления фидов легок и незаметен, и лишь легкое шуршание харда напоминает, что у меня уже полгода как SQLite, а не самодельный in-memory недовелосипед.

Родилось тут

SIGMOLE: Pigmentation fault.

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

Ну разве жизнь не хороша?

Едешь домой после физики автоматом, на экзамене был 10 минут, из них 9 ждал, пока разведут по билетам остальных и перейдут ко мне. Едешь домой в последней утренней электричке, свободно, пусто, сидишь у окна, за ним иногда люди, но больше - снега, а у тебя в руке банка бёрна, впервые за неделю, сегодня хороший день, сегодня можно, а в ушах Powerman 5000, та же группа, под которую в конце весны и летом ездил в физтех и вообще бегал по городу. Весь день впереди. Приходишь домой, никого нет, слава богу, тыкаешь на машине Win+C, она приветливо отзывается металкористыми 36 Crazyfists. Делаешь громко, сегодня можно, сегодня хороший день, ложишься, ноут в руки, надо писать поддержку enclosures, потому что ночью пришло в голову, как ее все же написать, да и вообще на код тянуло вместо подготовки к физике. А с завтра до 26-го - последний рывок, аналит остался.

Физика complete

Отл автоматом, ибо по экзаменационной контрольной 55 из 50. Типа, я умный, решил всё, чисто, и даже дополнительную нерешабельную задачу.

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

А песня в np очень нравится. We start it again.

Что удручает

Люди со мной, пока им плохо. Да, может быть, я хорошо могу поддержать, выслушать и все такое. Но, черт возьми, как только у них что-то налаживается, как только самое говно проходит, они уходят. Когда все хорошо, они уходят. Когда все хорошо, я перестаю быть нужен. Это действительно удручает.

Я очень хорошо помню тот пост. Я очень хорошо могу все объяснить. Но несмотря на всю логику, все попытки, что-то внутри периодически кричит так, что уши болят, кричит о том, что все фигня, все неправда.

Больно от того, что мне не больно, когда я перечитываю тот пост.

Петабайты

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

  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 в примере.

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

IFinder

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

Например, один плагин ищет среди торрентов в категориях "Music", "Videos", "Apps", "Stuff", другой плагин ищет по локалке Физтеха в категориях "Music", "Videos", "Folders", третий вообще имеет только одну категорию "Lyrics" и тупо парсит результаты гугла (ну или ходит на http://lyricwiki.org, рекомендую, кстати).

Учитывая, что к LeechCraft::BitTorrent теперь принципиально возможно прикрутить другие источники данных, все становится еще интереснее.

Remoter is dead?

Почитывая обсуждение на ЛОРе вчерашней новости о изменении лицензионной политики Qt, наткнулся на замечательный проект: http://iquip.org/. В руках еще не вертел, девелоперам письма типа "Откройте SVN, давайте сотрудничать!" еще не писал, но, судя по всему, цель проекта - хрень, позволяющая без перекомпиляции и особого геморроя проецировать Qt-приложения в веб, при этом можно сделать так, что они автоматически поддерживают хедлесс-машинки. Так что можно временно забить на написание биндингов Wt к Qt (или наоборот?) в Remoter'е и заняться более полезными вещами.

Итого, за сегодняшнюю ночь полностью переписана рабочая часть CSTP и, что приятно, для смены бекенда мне потребовалось изменить только сам класс-реализацию, значит, кажется, хорошо дизайн спланировал. Также, QNetworkAccessManager теперь может быть общим, и плагины, которые хотят разделять его (а значит, разделять и куки с кэшами), просто реализуют интерфейс IWantNetworkAccessManager. Теперь если человек залогинился на новафилме, например, через Poshuku, то CSTP автоматически подхватит кукис, и закачка торрент-файла будет успешной, а не как раньше. Также, Poshuku теперь немного по-другому обрабатывает неподдерживаемый контент, кидая не скачанную сущность в облако остальных плагинов, а ссылку на сущность, что позволяет не дублировать функционал ядра, выбирающего подходящий плагин. Вот дождусь Qt 4.5 с поддержкой флэша в вебките, прикручу фильтрацию траффика к Poshuku - можно будет Firefox'ы выкидывать нахрен. Все это пробуждает во мне яростное, неудержимое желание пофапать на свою прогу.

А еще у IQuiP сайт на друпале сделан.

Qt и LGPL

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

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

Еще немного сторон

Все зависит от того, хорошо тебе, когда никогда не бывает планов на вечер, или плохо. Мне когда-то было хорошо. Потом стало плохо. Тогда я еще не умел ставить якоря на разные состояния, поэтому трудно вернуться туда, где "хорошо".

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

Держать ладони лодочкой, чтобы прошлое не просыпалось, или освободить руки. Надо освободить руки. А еще три четверти негатива, который должен был бы быть сейчас, уже успел перегореть. А если так, то все хорошо, все идет вполне неплохо. Хорошо, что столько дофига дел, чтобы укрыться и закопаться среди них.

А еще из той книги: "Любовь не пятнают дружбой. Конец есть конец." Никогда не мог понять, как вообще может быть иначе.

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

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

Proof of concept

LeechCraft скомпилен и запущен под вендой. Proof of concept, ибо падает при выходе, если в Poshuku что-то открыто на момент этого выхода. Но как доказательство работоспособности и моего упорства - вполне себе, ибо я спокойно зашел на свое гмыло, скачал какой-то торрент и подписался на RSS.

На этот раз все поддерживает OpenSSL (отдельный секс был с его сборкой). Проблема с манифестами решена тасканием с собой студийного redist'а в инсталлере и его установки. Надо бы сделать вытягивание из интернетов. А вообще эффектно смотрится, как редист запускается и доустанавливается сам. Инсталлятор еще немного позврослел для конечного пользователя :)

8.8 мегабайт, собрано при помощи MSVS2008 с оптимизацией под размер. Если б собирал мингвом - было бы раза в два больше, как показывает практика.

Выкладывать на публику пока стыдно, допилим с товарищем Азкапоне гуйки (да, личкрафт станет офигенным-офигенным-офигенным) - все совсем изменится, а там и Qt 4.5 выйдет с кучей новых фишек в Webkit и вообще.

В общем, как ведущий разработчик и менеджер, говорю: проекту нужны люди. Девелоперы, гуи-дизайнеры, тестеры, переводчики, мейнтейнеры пакетов/репозиториев, просто обладающие лишним свободным местом у себя на хосте, кто угодно - все нужны. От вас потребуется немного свободного времени, чуть больше энтузиазма и, возможно, чуток терпения. Обращайтесь, d34df00d@jabber.ru (здесь джабберы, а не почтовый ящик).