leechcraft

Потрясающий день, господа

Во-первых, отрыл старый ноут. Старый-старый, я с ним полтора года назад в Дубну ездил и написал там SettingsDialog, который без Xml и статичен ваще (и уже успел кануть в Лету). Тем не менее, тогда это для меня было взрывом мозга. Это, блин, ностальгия, потому что 154-ая ревизия Личкрафта (а я сегодня закоммитил 835-ую), Qt 4.3.0, и собирается пока еще qmake'ом, и пока только HTTP/FTP плагин, торрентов и в проекте не было особо так. Это, блин, ностальгия, потому что открыт Inkscape с иконками собственного приготовления, пусть и говеного, но собственного! Тогда я еще не знал screen, поэтому внизу куча табов у Konsole. Это, блин, ностальгия, потому что там стоит джента с (хехехе) экспериментальным 2.6.21, а она у меня больше нигде не стоит. Вон, 20 минут синкалась и еще 20 минут обновляла кеши. Мне страшно запускать emerge -avuD world, тем более что я не делал этого уже полгода. Это, блин, ностальгия, потому что там на харде фильм «?» Даррена Аронофски (который наверняка более известен по Реквиему), который я смотрел в той же Дубне. Да, много чего там.

Во-вторых, писали сегодня к/р по физике, я написал всё, но это все фигня, так что пропускаем и идем дальше.

В-третьих, вчера я разобрался, как работать с D-Bus, и даже вызвал через него слот в Qt'шном приложении из C# и в C# прибиндился к Qt'шному же сигналу. Приятно. Написать адаптеры для интерфейсных классов, кое-какие обвязки для опроса других плагинов, и все будет ништяк. Разбираться в библиотеке на незнакомом языке для незнакомой технологии при отсутствующей документации — высший кайф. Теперь надо писать клиентскую часть на шарпе, но т.к. в Mono нет WinForms-дизайнера, а сторонний не работает, придется клепать формочки ручками. Или продолжать гуглить, но чо-то устал уже. Олсо, анонимные делегаты сексуальны, на них поначалу хотелось яростно и невозбранно самоудовлетворяться.

В-третьих-с-половиной, потихоньку начинаешь понимать, что не такое уж и говно этот ваш дотнет с явой для 80% задач. Юношеский максимализм почти что совсем проходит, и начинаешь понимать, что инструмент все же под задачу. В частности, большинству своих знакомых я давно перестал толкать линухи. А нахрена им, если комп для линейки покупался?
Просто хуже, когда человек ничего, кроме какого-нибудь VB.NET на уровне индусской обезъянки, не знает и знать не хочет.

В-четвертых, сегодня год, как внезапное шило воткнулось мне в задницу, и я решился познакомиться и даже взять номер у одной замечательной девушки. Надо перечитать посты годовой давности. Только она как-то вообще никак про это не помнит и в очередной раз у нее не получилось встретиться, так что я лишь чуть более остро чувствую себя никому не нужным, да и NP в ее сегодняшнем посте злободневен чуть более, чем полностью. Хотя нет, вон, LeechCraft пишется, D-Bus исследуется, помощь с проектами по программированию и решением задач другого варианта по физике помогается, так что кому-то я нужен, наверное. Просто не тому, кому хотелось бы.

О важности понимания происходящего

Препроцессор и WinAPI — зло. Потому что в последнем есть функция AddJob, которая при помощи первого подменяется AddJobA. А так как в моем коде тоже была функция-член класса TorrentPlugin, называется AddJob, то она тоже превращалась в AddJobA, отсюда были очень странные ошибки — если в файле с реализацией инклюд файла с определением положить в конец всех инклюдов, то линкер ругался, что undefined reference to function AddJob в файле, сгенеренном moc'ом. Если же инклюд поставить в начало файла реализации, то компилятор ругался, что нет функции AddJobA в классе TorrentPlugin. Естественно, если обозвать AddJob как AddJobполнаяхерня, то все прекрасно видится и ничего не подставляется.

Да, довольно глупая и очевидная, но забавная ошибка. Вот. +1 в копилку опыта.

Под катом — как лже-френд insooo помог мне разобраться в проблеме.

Тупая венда

Вчера понял, почему LC не запускался под реальными машинами, хотя все DLL были на месте. Собственно, вся проблема в том, что MSVS встраивает в мои executable манифесты, говорящие, где лежат MSVS'ные DLL (которые связаны с assemblies в их терминологии). На одной виртуалке, которая с Windows XP, все работало потому, что там стоит студия, и сборки уже лежали в WinSxS, а на другой была Windows 2000, которой искренне плевать на все эти манифесты. После копирования папки с CRT в папку с программой все заработало на реальной машине.

Нет, не совсем все. Т.к., судя по всему, местоположение папки со сборкой вычисляется относительно executable-файла, в котором манифест, а не который его загружает, то плагины не грузятся - они лежат в plugins/bin относительно leechcraft.exe.

Итак, надо будет попробовать либо похачить манифест (написать свой), либо вообще отключить нафиг генерацию (хотя, говорят, это черевато, правда, я не понял, чем), либо переходить обратно на MinGW, у которого вдвое большие файлы получаются по размеру.

Довольный как слон

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

Скорее всего, такая концепция дизайна главного окна и останется. Интерфейс управления плагинами вынесен в отдельный plugin manager.

Также, за сегодня прикручена вменяемая оповещалка о новых событиях, которая в одном balloon tip'е собирает сообщения от многих разных плагинов.

Также, приятно читать слэшдот собственным клиентом.

Голо.Сование

Итак, какой функционал в RSS-ридере важнее: опция "никогда не удалять непрочитанные сообщения" или возможность вставлять статьи из RSS-каналов также и в середину ленты?

discuss

Скулайт какбэ течет

  1. ==24656== 2,452,013 (244 direct, 2,451,769 indirect) bytes in 1 blocks are definitely lost in loss record 1,489 of 3,318
  2. ==24656== at 0x4C2291E: malloc (vg_replace_malloc.c:207)
  3. ==24656== by 0x89FFAE7: sqlite3_malloc (in /usr/lib/libsqlite3.so.0.8.6)
  4. ==24656== by 0x8A0245D: (within /usr/lib/libsqlite3.so.0.8.6)
  5. ==24656== by 0x8A02787: (within /usr/lib/libsqlite3.so.0.8.6)
  6. ==24656== by 0x8A02856: (within /usr/lib/libsqlite3.so.0.8.6)
  7. ==24656== by 0x8A028AA: (within /usr/lib/libsqlite3.so.0.8.6)
  8. ==24656== by 0x8A029CB: (within /usr/lib/libsqlite3.so.0.8.6)
  9. ==24656== by 0x8A2B13D: (within /usr/lib/libsqlite3.so.0.8.6)
  10. ==24656== by 0x8A2C90F: sqlite3_step (in /usr/lib/libsqlite3.so.0.8.6)
  11. ==24656== by 0xFE096E9: (within /usr/lib/qt4/plugins/sqldrivers/libqsqlite.so)
  12. ==24656== by 0xFE0A27D: (within /usr/lib/qt4/plugins/sqldrivers/libqsqlite.so)
  13. ==24656== by 0x71650D6: QSqlQuery::exec() (in /usr/lib/libQtSql.so.4.4.3)
  14. ==24656== by 0xEAEC30D: SQLStorageBackend::GetItems(boost::shared_ptr<Channel>) const (sqlstoragebackend.cpp:228)
  15. ==24656== by 0xEAED8DD: SQLStorageBackend::GetChannels(boost::shared_ptr<Feed>) const (sqlstoragebackend.cpp:206)
  16. ==24656== by 0xEAEDDD8: SQLStorageBackend::GetFeeds(std::vector<boost::shared_ptr<Feed>, std::allocator<boost::shared_ptr<Feed> > >&) const (sqlstoragebackend.cpp:159)
  17. ==24656== by 0xEAA74DE: Core::Core() (core.cpp:51)
  18. ==24656== by 0xEAA7CD6: Core::Instance() (core.cpp:68)
  19. ==24656== by 0xEACC3B3: ItemBucket::ItemBucket(QWidget*) (itembucket.cpp:10)
  20. ==24656== by 0xEA942C3: Aggregator::Init() (aggregator.cpp:36)
  21. ==24656== by 0x435155: Main::PluginManager::InitializePlugins(Main::MainWindow const*) (pluginmanager.cpp:175)
  22. ==24656== by 0x42B1C0: Main::Core::DelayedInit() (core.cpp:126)
  23. ==24656== by 0x41D228: Main::MainWindow::MainWindow(QWidget*, QFlags<Qt::WindowType>) (mainwindow.cpp:103)
  24. ==24656== by 0x4329E0: main (main.cpp:120)

Офигенни

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

Просто почему-то нравится, когда в Aggregator столько фидов, когда его БД под четыре метра жрет.

Олсо, теперь Aggregator поддерживает все распространенные форматы - Atom 1.0, Atom 0.3, RSS 2.0, RSS 1.0, RSS 0.91.

DC

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

SQL — это здец!

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

А vim тем временем рулит.

Was it a dream?

Да! Свершилось! Сегодня я прикрутил к LeechCraft многотабовый интерфейс. По-моему, получилось охренительно, вместо кучи разных окон теперь всего одно. Вот как это выглядит, к примеру:
Образ
(Кликабельно, 206kB)

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

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

Ну а кроме того, за последние 27 часов Aggregator научился читать ленты новостей в формате Atom 0.3 и импортировать фиды из OPML-файлов (хотя еще немного тестинга бы не помешало), также было пофиксено несколько багов в CSTP и много всяких мелких усовершенствований here and there, как говорится.

Круто, господа, круто. Мне нравится. It's real now.

Бытовое

Вам никогда не приходилось разбираться в бектрейсе глубиной в 751 вызов? Мне вот сейчас придется. Спасибо куте за ее сигналы/слоты, хехе.

LeechCraft is back!

Итак, обо всем по порядку.

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

Во-вторых, мне предложили поучаствовать в проектах RetroMessenger, Dooble и Offsystem. Для всех трех будут написаны плагины, и мой Личкрафт станет еще более монструозным, еще более комбайнистым. Суть и концепция пока еще не проработаны, но в общих чертах, будут клиенты для соответствующих сетей, а Dooble просто будет интегрирован в виде плагина, как fsirc. Offsystem офигенен и концептуален, кстати, торренты будут сосать. RetroMessenger аналогично офигенен и концептуален.

В-третьих, я решил походить на физтеховский спецкурс по C# и .NET 3.5, там довольно-таки неплохо. Т.к. там нужно делать проекты, мне сразу в голову пришло, что надо бы сделать интеграцию личкрафта с дотнетом, чтобы он мог цеплять плагины в виде дотнетовских сборок, соединять их с Qt и радоваться жизни. Вроде как были биндинги Qt для C#, так что к сожалению все будет не так сложно, как кажется.

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

Выот. А девелоперы/портеры под венду нужны, очень. Если кто-нибудь из френдов согласится - с меня стотыщмильонов интернетов.

Она живая, живая!

Итогом многонедельного секс-марафона стал полноценно работающий под вендой личкрафт. Значит, еще кое-чего поделаю, и будет превью-релиз. Можно будет постить новость на ЛОР для аналитиков.

Пруфпик:
Образ
(Кликабельно, 88kB)

svn://

Поцт предназначен для тех, кому что-то говорит фраза svn co svn://deviant-soft.ws.

Я решил, наконец, почитать маны по svnserve и узнал, что можно делать не по инстансу серва на репоз, а указать ему в качестве --root путь к корню всех сервов.

SVN с Личкрафтом переехал с svn://deviant-soft.ws на svn://deviant-soft.ws/leechcraft (переезжаем командой svn switch svn://deviant-soft.ws svn://deviant-soft.ws/leechcraft из корня локальной копии), Spicy же переехал с svn://deviant-soft.ws:3691 на svn://deviant-soft.ws/spicy (переезжаем аналогично).

Когда будет что ценить в моем проекте по учету трафа с iptables, скажу ссылку и на него. Hint: называется он довольно незамысловато, traffer.

737

Сейчас совместно с коллегой V0id'ом пытались реализовать функцию обработки редиректов. И реализовали! V0id набросал скелетик, я развил в готовую шнягу. Так что теперь можно читать RSS с башорга, а там подписка сделана через жопу перенаправление на актуальный фид.

Официально заявляю, что иногда я удивляюсь тупости Qt. Забудем про наболевший пример с некорвертируемыми параметрами сигналов/слотов и отсутствием говноподобия замыканий (closures) в них же. Хотя нет, я не буду рассказывать, чему я удивился на этот раз, больно это специфично.

737-ой коммит, если кто не понял.