о компах
Через 10 минут
У меня будет первый программерский выход в свет здесь. Презентация шарпового проекта. Посмотрим, посмотрим.
3
Во-первых, блжд, перспектива клепать гуйки ручками мне очень не нравится. Надо найти дизайнер, риальни.
Во-вторых, книга Эндрю Троелсена по шарпу и дотнету самая вменяемая из всех, которые я успел посмотреть.
В-третьих, переход в подпапку plugins/bin папки запуска приложения — это пипец.
string pluginsPath = System.IO.Path.Combine (System.IO.Path.Combine (System.Windows.Forms.Application.StartupPath, "plugins"), "bin");
Никаких вам изящных QDir'ов. А все потому, что кроссплатформенный дотнет на одних платформах юзает / в качестве разделителя, а на других — \.
Потрясающий день, господа
Во-первых, отрыл старый ноут. Старый-старый, я с ним полтора года назад в Дубну ездил и написал там 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, у которого вдвое большие файлы получаются по размеру.
Довольный как слон
Скорее всего, такая концепция дизайна главного окна и останется. Интерфейс управления плагинами вынесен в отдельный plugin manager.
Также, за сегодня прикручена вменяемая оповещалка о новых событиях, которая в одном balloon tip'е собирает сообщения от многих разных плагинов.
Также, приятно читать слэшдот собственным клиентом.
Иподовое
Такую классную темку для рокбокса нашел, ваще, слов нет. Офигенно, до сих пор глаз не нарадуется.
Скулайт какбэ течет
==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 ==24656== at 0x4C2291E: malloc (vg_replace_malloc.c:207) ==24656== by 0x89FFAE7: sqlite3_malloc (in /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0x8A0245D: (within /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0x8A02787: (within /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0x8A02856: (within /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0x8A028AA: (within /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0x8A029CB: (within /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0x8A2B13D: (within /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0x8A2C90F: sqlite3_step (in /usr/lib/libsqlite3.so.0.8.6) ==24656== by 0xFE096E9: (within /usr/lib/qt4/plugins/sqldrivers/libqsqlite.so) ==24656== by 0xFE0A27D: (within /usr/lib/qt4/plugins/sqldrivers/libqsqlite.so) ==24656== by 0x71650D6: QSqlQuery::exec() (in /usr/lib/libQtSql.so.4.4.3) ==24656== by 0xEAEC30D: SQLStorageBackend::GetItems(boost::shared_ptr<Channel>) const (sqlstoragebackend.cpp:228) ==24656== by 0xEAED8DD: SQLStorageBackend::GetChannels(boost::shared_ptr<Feed>) const (sqlstoragebackend.cpp:206) ==24656== by 0xEAEDDD8: SQLStorageBackend::GetFeeds(std::vector<boost::shared_ptr<Feed>, std::allocator<boost::shared_ptr<Feed> > >&) const (sqlstoragebackend.cpp:159) ==24656== by 0xEAA74DE: Core::Core() (core.cpp:51) ==24656== by 0xEAA7CD6: Core::Instance() (core.cpp:68) ==24656== by 0xEACC3B3: ItemBucket::ItemBucket(QWidget*) (itembucket.cpp:10) ==24656== by 0xEA942C3: Aggregator::Init() (aggregator.cpp:36) ==24656== by 0x435155: Main::PluginManager::InitializePlugins(Main::MainWindow const*) (pluginmanager.cpp:175) ==24656== by 0x42B1C0: Main::Core::DelayedInit() (core.cpp:126) ==24656== by 0x41D228: Main::MainWindow::MainWindow(QWidget*, QFlags<Qt::WindowType>) (mainwindow.cpp:103) ==24656== by 0x4329E0: main (main.cpp:120)
Офигенни
Просто почему-то нравится, когда в Aggregator столько фидов, когда его БД под четыре метра жрет.
Олсо, теперь Aggregator поддерживает все распространенные форматы - Atom 1.0, Atom 0.3, RSS 2.0, RSS 1.0, RSS 0.91.
DC
Также решено писать плагины, предоставляющие DC-клиент и DC-хаб для моей проги. Двумя разными, естественно.
Was it a dream?
Да! Свершилось! Сегодня я прикрутил к LeechCraft многотабовый интерфейс. По-моему, получилось охренительно, вместо кучи разных окон теперь всего одно. Вот как это выглядит, к примеру:
![]()
(Кликабельно, 206kB)
![]()
(Кликабельно, 362kB)
![]()
(Кликабельно, 163kB)
Ну а кроме того, за последние 27 часов Aggregator научился читать ленты новостей в формате Atom 0.3 и импортировать фиды из OPML-файлов (хотя еще немного тестинга бы не помешало), также было пофиксено несколько багов в CSTP и много всяких мелких усовершенствований here and there, как говорится.
Круто, господа, круто. Мне нравится. It's real now.
Грузить аудио вконтакте
Нашелся тут забавный способ загружать аудио вконтакте. Применим для тех, кто юзает Adobe'овский плагин вместе с каким-нибудь файрфоксом или Konqueror'ом. Заходим на страничку загрузки аудио, она вся такая флэшовая, поэтому флэшплеер подгружается. Делаем ps ax | grep npview, убиваем плагин, флэш слетает, остается старая-добрая нормальная форма загрузки. Через нее все и делаем.