gentoo.ru
Официальная конференция Direct Connect клиента EisKaltDC
eiskaltdc@conference.gentoo.ru
Среда, 3 февраля 2010< ^ >
NegatiV установил(а) тему: Upcoming release: 2.0alpha || SVN: 27 || Конференция разработчиков EiskaltDC++ || логи: http://marsoft.dyndns.info/cgr-calendar.php?room=eiskaltdc || Лог изменений в последней ревизии на свн: http://code.google.com/p/eiskaltdc/source/list
TODO:
* GUI: settings for basic units
* Code cleanup
* запоминание местоположения виджетов
* Вывод меню хаба на вкладке.
* IP-фильтр
* Антиспам
* Список друзей-врагов
* Раскраску ников
* *NEW* Иконки клиентов
* etc
Release schedule:
* 15.02 Feature-freeze
* 17.02 Tag EiskaltDC++ 2.0alpha
* 21.02 Release EiskaltDC++ 2.0alpha
Конфигурация комнаты
Участники комнаты

GMT+3
[01:18:20] Abram вышел(а) из комнаты
[02:17:05] 0xd34df00d вошёл(а) в комнату
[02:51:45] NegatiV вошёл(а) в комнату
[02:59:54] 0xd34df00d вышел(а) из комнаты
[03:00:30] NegatiV установил(а) тему: Upcoming release: 2.0alpha || SVN: 27 || Конференция разработчиков EiskaltDC++ || логи: http://marsoft.dyndns.info/cgr-calendar.php?room=eiskaltdc || Лог изменений в последней ревизии на свн: http://code.google.com/p/eiskaltdc/source/list
TODO:
* GUI: settings for basic units
* запоминание местоположения виджетов
* Вывод меню хаба на вкладке.
* IP-фильтр (импортирован)
* Антиспам (импортирован)
* Список друзей-врагов
* Раскраску ников
* Списки скачанного.отданного
* *NEW* Иконки клиентов
* etc
Release schedule:
* 15.02 Feature-freeze
* 17.02 Tag EiskaltDC++ 2.0alpha
* 21.02 Release EiskaltDC++ 2.0alpha

[03:05:03] 0xd34df00d вошёл(а) в комнату
[03:06:17] <0xd34df00d> NegatiV: пыщ )
[03:06:39] NegatiV >> 0xd34df00d
[03:07:26] <NegatiV> 0xd34df00d: насколько помню ты мейнтейнер личкрафта)
[03:07:34] <0xd34df00d> NegatiV: да, мейнтейнер и лиддев )
[03:07:56] <NegatiV> и даже дагадываюсь зачем ты здесь
[03:08:42] <NegatiV> 0xd34df00d: доки есть по API?
[03:09:32] <0xd34df00d> NegatiV: да, интерфейсы документированы, недавно был запилен небольшой туториал по созданию плагинов, а также уже начата работа над реализацией DC с использованием, насколько я понял, той же либы, что и вы сейчас.
[03:10:00] <NegatiV> думаю львиную долю клиента можно перенести практически без изменений
[03:10:28] <NegatiV> нужно поправить только добавление виджетов в главное окно
[03:11:09] <NegatiV> 0xd34df00d: надеюсь ты понимаешь, что придется реализовать в плагине всего клиента
[03:11:27] <NegatiV> создать просто качалку не получится
[03:11:53] <NegatiV> 0xd34df00d: и да сылочку на туториал плиз)
[03:12:58] <0xd34df00d> NegatiV: http://leechcraft.org/wiki/leechcraft/Writing_a_simple_plugin_in_20_minutes туториал (/r/ комментов :)).
[03:13:09] <0xd34df00d> NegatiV: черновик описания архитектуры: http://leechcraft.org/wiki/leechcraft/LeechCraft_architecture
[03:13:29] <0xd34df00d> NegatiV: собственно, я с DC сам никогда не работал. Можешь рассказать, какие окна/вкладки/етц нужны для удобной работы?
[03:13:55] <0xd34df00d> NegatiV: всего клиента = ?
[03:16:10] <NegatiV> 0xd34df00d: фрейм для хаба (со списком ников), поисковик, менеджер передач, очередь скачивания, списки отданного\скачанного, браузер шары
[03:16:22] <NegatiV> + желателен интерфейс настроек
[03:17:21] <NegatiV> неплохо бы еще иметь список избранных и публичных хабов
[03:17:27] <0xd34df00d> NegatiV: интерфеййс настроек есть унифицированный, это ок.
[03:18:14] <0xd34df00d> NegatiV: поисковик можно реализовать через механизм поиска личкрафта через сводку, очередь скачивания и списки отданного/скачанного тоже через сводку, ога
[03:18:24] <0xd34df00d> Так оно будет интегрироваться с остальным фейсом )
[03:18:36] <0xd34df00d> NegatiV: а чо такое фрейм для хаба и менеджер передач? Чо там есть?
[03:19:21] <NegatiV> 0xd34df00d: фрейм хаба - окно с чатом и списком юзверей, менеджер передач - список активных соединений с прогрессбаром
[03:19:24] <0xd34df00d> В любом случае, если тебе нужно встроить вкладку — тебе достаточно вернуть из плагина QWidget* с ее содержимым и опционально QToolBar* с тулбаром.
[03:20:11] <0xd34df00d> NegatiV: ну, фрейм хаба имеет смысл тогда отдельной вкладкой сделать, а все остальное можно в сводку впилить, ок? )
[03:20:22] <NegatiV> 0xd34df00d: ах да еще нужен какой-либо механизм для выполнения очередей задач
[03:21:19] <NegatiV> все события от ядра dc++ приходят асинхронно из разных потоков
[03:22:35] <NegatiV> void HubFrame::on(ClientListener::StatusMessage, Client*, const string &msg, int) throw(){
    QString status = QString("%1...").arg(_q(msg.c_str()));
    typedef Func1<HubFrame, QString> FUNC;
    FUNC *func = new FUNC(this, &HubFrame::addStatus, status);
    WulforManager::getInstance()->dispatchClientFunc(func);
}
[03:23:07] <NegatiV> так в основной поток отправляется строка статуса
[03:24:24] <0xd34df00d> NegatiV: ничего умнее Qt::QueuedConnection или постинга сообщений мне в голову не приходит.
[03:24:32] <0xd34df00d> NegatiV: с асинхронностью я сам столкнулся, и там говно.
[03:25:34] <NegatiV> 0xd34df00d: я написал небольшой диспатчер (таймер в основном потоке, который выполняет задачи из очереди)
[03:26:08] <0xd34df00d> NegatiV: хм, ну так тогда все ок должно быть же.
[03:26:12] <NegatiV> но это не фонтан, при большом кол-ве задач загрузка проца может достигнутб 40%
[03:26:26] <NegatiV> особенно при получении списка  юзеров
[03:26:42] <NegatiV> 5-6к задач это не хухры-мухры)
[03:27:53] <0xd34df00d> NegatiV: тогда нужно буферизовать мессаги из возможных узких мест.
[03:28:36] <0xd34df00d> NegatiV: что-то типа ScheduleSend (newUserInfo); для того же списка юзеров, которая добавляет newUserInfo в список и перезапускает некий таймер, по timeout() которого уже происходит диспатчинг.
[03:29:51] <NegatiV> 0xd34df00d: там не все так просто)) я хорошенько прошелся по всем этим граблям. Очень часто приходится подстраивать все под ядро
[03:30:09] <0xd34df00d> NegatiV: например?э
[03:30:23] <NegatiV> http://code.google.com/p/eiskaltdc/source/browse/trunk/WulforManager.cpp
[03:30:50] <NegatiV> вот кстати, простейшая реализация диспатчера, которая сейчас используется
[03:31:54] <NegatiV> 0xd34df00d: приватные констуркторы и деструкторы
[03:32:25] <NegatiV> приходится обрабатывать сообщения сразу
[03:32:43] <NegatiV> нельзя промежуточно где-то сохранять пришедшие данные
[03:32:57] <0xd34df00d> Ну да, я примерно про то же говорилю
[03:33:31] <NegatiV> приходится сразу выдирать из них всю инфу
[03:34:01] <NegatiV> 0xd34df00d: проблема в том что сообщений очень много))
[03:34:10] <NegatiV> нагрузка на проц очень велика
[03:34:33] <NegatiV> жаль что Qt не умеет работать из разных потоков =(
[03:34:45] <0xd34df00d> NegatiV: а вы под профилером гоняли?
[03:34:55] <0xd34df00d> NegatiV: в смысле, что именно тормозит?
[03:35:23] <NegatiV> самое тормозящее место - получение списка юзеров
[03:35:40] <NegatiV> но я вроде как переписал все - сейчас намного лучше
[03:36:12] <0xd34df00d> NegatiV: можешь кинуть ссылку?
[03:36:19] <NegatiV> осталось еще разобраться с поисковиком и менеджером передач (но там в принципе не все так плохо)
[03:36:22] <0xd34df00d> Ну, на место, чо ты имеешь в виду.
[03:36:30] Abram вошёл(а) в комнату
[03:37:23] <0xd34df00d> Вообще одна из лучших либ, которые я видел — libtorrent. Правда, она для торрентов, но она офигенна.
[03:38:02] <NegatiV> 0xd34df00d: http://code.google.com/p/eiskaltdc/source/browse/trunk/HubFrame.cpp
[03:38:13] Abram вышел(а) из комнаты
[03:38:19] <NegatiV> строки 1387:1395
[03:39:21] <NegatiV> 0xd34df00d: поправил 770:776
[03:39:34] <0xd34df00d> Вижу несколько способов как чуть-чуть поправить быстродействие.
[03:39:48] <NegatiV> т.е. в модель загружаю данные сразу из другого потока
[03:39:59] <NegatiV> задачу не создаю
[03:40:13] <NegatiV> 0xd34df00d: как?
[03:40:19] <0xd34df00d> Сделай itemForPtr чтобы возвращала null если не найдена. Избежишь один лукап, в строке 750, можно будет сначала получить item, а потом if (item)...
[03:41:07] <NegatiV> понял) действительно)
[03:41:59] <0xd34df00d> В общем, там нужно уже с профилером смотреть конкретно по функции, что сколько ест.
[03:41:59] <NegatiV> UserListItem *UserListModel::itemForPtr(UserPtr ptr){
    UserListItem *item = (users.contains(ptr))? (users[ptr]) : (NULL);
    return item;
}
[03:42:15] <0xd34df00d> NegatiV: можно еще лучше.
[03:42:17] <NegatiV> надо меньше кодить ночью
[03:42:22] <0xd34df00d> NegatiV: users — QMap?
[03:42:45] <NegatiV> угу
[03:43:19] <0xd34df00d> NegatiV: порядок элементов важен?
[03:43:59] <NegatiV> нет, абсолютно не важен. я строю дерево элементов
[03:44:18] <NegatiV> QMap только для поиска
[03:44:48] <0xd34df00d> Тогда замени на QHash.
[03:44:52] <NegatiV> для поиска по нику - QHash
[03:44:59] <0xd34df00d> QMap — O(logn) чтоле, QHash — O(1).
[03:45:35] <NegatiV> я знаю)
[03:45:59] <NegatiV> но для QHash нужно чтобы ключ предоставлял operator< вроде
[03:46:08] <0xd34df00d> Нет, именно qHash.
[03:46:25] <0xd34df00d> Который для типа t возвращает uint или другое легкосравнимое нечто.
[03:46:46] <0xd34df00d> Собственно, никто не мешает тебе сделать что-то типа uint qHash (UserPtr ptr) { return (uint) ptr; }
[03:46:53] <0xd34df00d> Ибо указатель очень хороший хеш, он по определению уникален )
[03:47:13] <NegatiV> это boost::intrusive_ptr
[03:47:43] <0xd34df00d> Там get есть же.
[03:47:46] <0xd34df00d> Вроде.
[03:47:51] <0xd34df00d> Вот его и кастить )
[03:47:54] <NegatiV> гм, есть
[03:48:11] <0xd34df00d> return reinterpret_cast<uint> (ptr.get ());
[03:48:17] <NegatiV> ток не к uint а к qulong чтоль
[03:48:39] <0xd34df00d> Ну да )
[03:49:14] <NegatiV> ладно, попробую все на хешах замутить
[03:49:34] <NegatiV> собственно насчет личкрафт+айскальт
[03:50:07] <0xd34df00d> NegatiV: я так очень нехилый прирост на модели с торрентами получил, заменив мапу на хэш, ога.
[03:50:21] <0xd34df00d> NegatiV: м?
[03:50:22] <NegatiV> думаю будет иметь смысл начать работу после beta-теститирования
[03:50:39] <NegatiV> и тебе не надо будет ничего изучать
[03:50:43] <0xd34df00d> Эм, бета-тестирования кого из нас? )
[03:50:50] <NegatiV> нас конечно же)
[03:50:56] <0xd34df00d> Ыы, ну ок )
[03:50:58] <NegatiV> я с нуля клиент написал за месяц
[03:51:02] <0xd34df00d> Это ок )
[03:51:12] <NegatiV> поэтому глупые ошибки пока попадаются
[03:51:27] <0xd34df00d> А у меня просто dc-хабов в локалке нет, сам живу в общагах, а интернеты тут дорогие. Тестить не круто )
[03:51:45] <NegatiV> у нас тестеров куча
[03:51:52] <0xd34df00d> Это здорово.
[03:51:55] <NegatiV> вроде как свое сообщество уже есть
[03:51:59] <0xd34df00d> Вообще шикарно )
[03:52:23] <NegatiV> поэтому проблем с тестированием моего клиента вроде как не предвидится
[03:52:26] <NegatiV> =)
[03:53:28] <NegatiV> 0xd34df00d: собственно после слияния думаю можно предоставить личкрафт как альтеу где all-in-one
[03:53:48] <NegatiV> хомячки будут в восторге)
[03:54:39] <0xd34df00d> Ога )
[03:54:56] <0xd34df00d> NegatiV: есть возможность сделать адаптер к QIODevice для воспроизведения на лету через фонон?
[03:55:12] <0xd34df00d> NegatiV: я попиливаю аналогичный для торрентов просто, и, наверное, будет круто для каждого P2P-сорса иметь такое.
[03:55:39] <NegatiV> думаю сделать можно
[03:55:50] <0xd34df00d> Ога, я с радостью помогу.
[03:55:55] <NegatiV> хоть и никогда подобным не занимался)
[03:56:05] <0xd34df00d> Говорят, плагины для личкрафта легко писать )
[03:56:50] <0xd34df00d> В общем, в чем суть.
[03:56:54] <NegatiV> да я и не боюсь за это. я в принципе написал клиент так, чтобы не парится в случае изменения архитектуры
[03:57:11] <NegatiV> все более-менее модульно
[03:57:16] <NegatiV> кроме главного окна))
[03:57:30] <0xd34df00d> Если что-то имеет смысл статуса/прогресса типа списка закачек/раздач/... — это имеет смысл впиливать в Сводку, а для этого надо вернуть самую обычную QAbstractItemModel*.
[03:58:52] <NegatiV> ну собственно менеджер передач и так наследуется от нее
[03:59:29] <0xd34df00d> Модель эта для двух особых ролей будет возвращать виджет, который вот справа на этом скрине: http://imagebin.ca/view/WRX8VeM.html
и тулбар (на том же скрине сверху).
[04:00:33] <NegatiV> угу
[04:00:52] <0xd34df00d> Поиск делается тоже через Сводку, аналогичным образом: http://imagebin.ca/view/Py8RPKTI.html или http://imagebin.ca/view/lx8sgLBP.html
[04:01:05] <0xd34df00d> Все-таки хорошо, что я впилил скриншотилку. удобно с ней )
[04:03:14] <NegatiV> смотрю тоже смотришь "сверъхестественное"))
[04:03:26] <NegatiV> хороший сериальчик)
[04:04:10] <NegatiV> 0xd34df00d: ну вроде все как понятно
[04:04:20] <NegatiV> никаких извратов
[04:08:00] <0xd34df00d> Да, сериал хороший )
[04:08:14] <0xd34df00d> Надо только интерфейс для этого дела допилить, а то поиск слегка неинтуитивен )
[04:08:48] <NegatiV> так вроде же можно свои тулбары добавлять и виджеты
[04:08:58] <0xd34df00d> Ну да.
[04:09:01] <NegatiV> мне больше и не надо)
[04:09:22] <0xd34df00d> А чо ты хочешь добавить? )
[04:09:50] <NegatiV> я имею ввиду поисковик и прочее
[04:10:59] <NegatiV> лан, с этим со всем разберемся)
[04:12:41] <0xd34df00d> Поисковик там просто щас сверху унифицированный, строка эта )
[04:13:26] <NegatiV> гм, это плохо
[04:13:36] <0xd34df00d> Ну мы перепилим.
[04:13:38] <0xd34df00d> А чо плохо?
[04:14:07] <NegatiV> у нас указывается тип файла, ожидаемый размер, список подключенных хабов
[04:14:30] <0xd34df00d> А, ну можно будет замутить чо-то типа расширенного поиска.
[04:14:58] <0xd34df00d> И заодно будет стимул перепилить эту строку так, чтобы можно было указывать параметры в зависимости от категории.
[04:15:27] <NegatiV> или хотябы возможность указать свой виджет для строки поиска
[04:15:54] <0xd34df00d> Ок, замутим.
[05:00:50] <NegatiV> 0xd34df00d: гм, ты как объявлял qHash-функцию?
[05:01:01] <NegatiV> QT_BEGIN_NAMESPACE
        inline uint qHash(const boost::intrusive_ptr<dcpp::User> &ptr){
            return (unsigned long)(void*)ptr.get();
        }
QT_END_NAMESPACE
#include <QHash>
[05:01:11] <NegatiV> и нифига не компилится))
[05:01:16] <0xd34df00d> А чо говорит?
[05:01:28] <NegatiV> /usr/include/QtCore/qhash.h:855: ошибка: нет соответствующей функции для вызова ‘qHash(const boost::intrusive_ptr<dcpp::User>&)’                                                                      
/usr/include/QtCore/qhash.h:63: замечание: претенденты: uint qHash(char)                          
/usr/include/QtCore/qhash.h:64: замечание:              uint qHash(uchar)
/usr/include/QtCore/qhash.h:65: замечание:              uint qHash(signed char)
/usr/include/QtCore/qhash.h:66: замечание:              uint qHash(ushort)
/usr/include/QtCore/qhash.h:67: замечание:              uint qHash(short int)
/usr/include/QtCore/qhash.h:68: замечание:              uint qHash(uint)
/usr/include/QtCore/qhash.h:69: замечание:              uint qHash(int)
/usr/include/QtCore/qhash.h:70: замечание:              uint qHash(ulong)
[05:01:37] <NegatiV> хотя сделал все как надо
[05:02:02] <0xd34df00d> И в списке кандидатов ее нет?
[05:02:07] <NegatiV> не-а
[05:02:20] <0xd34df00d> Она в неймспейсе?
[05:02:22] <NegatiV> специально даже глянул в qhash.h
[05:02:32] <NegatiV> и добавил в QT_NAMESPACE
[05:03:20] <NegatiV> больше ни в каких неймспейсах qHash(dcpp::UserPtr) нет
[05:03:30] <0xd34df00d> NegatiV: а используется оно из неймспейса?
[05:03:54] <0xd34df00d> В моем случае только
28 namespace LeechCraft                                                                                                                                                                                                        
29 {                                                                                                                                                                                                                            
30     PLUGININTERFACE_API uint qHash (const LeechCraft::Notification&);                                                                                                                                                        
31 }
сработало.
[05:04:26] <NegatiV> не у меня проще:
[05:05:12] <NegatiV> using namespace dcpp;
QT_BEGIN_NAMESPACE
        inline uint qHash(const boost::intrusive_ptr<dcpp::User> &ptr){
            return (unsigned long)(void*)ptr.get();
        }
QT_END_NAMESPACE
#include <QHash>
class UserListItem {};
class UserListModel{}; //тут Hash
[05:05:35] <0xd34df00d> Попробуй явно в неймспейсе ее объявить.
[05:05:39] <0xd34df00d> Там же хитрый алгоритм поиска имен.
[05:06:30] <NegatiV> разве что включить ее в неймспейс dcpp еще, ну и в безымянный
[05:06:36] <NegatiV> сейчас попробую
[05:10:12] <NegatiV> о, сработало
[05:10:14] <NegatiV> спс
[06:27:07] gray_graff вошёл(а) в комнату
[06:52:21] tonal вошёл(а) в комнату
[06:54:41] <tonal> Закинул в гугле-коде патч для старого проекта - ускорение загрузки. Ловите
[07:01:19] tonal вышел(а) из комнаты
[07:19:51] <NegatiV> 0xd34df00d: ты пулы из boost никогда не юзал?
[07:19:59] <0xd34df00d> NegatiV: не-а.
[07:20:38] <NegatiV> просто думаю имеет смысл пул прикрутить - создается много объектов большого размера
[07:21:07] <NegatiV> *небольшого
[07:26:01] <0xd34df00d> Опять же, пройдись сначала профилером )
[07:26:17] <0xd34df00d> Прикрутить пул — эт не QMap на QHash заменить, тут чуть больше работы, и будет обидно делать ее зря )
[07:30:57] <NegatiV> 0xd34df00d: да я уже прикрутил)
[07:32:59] <NegatiV> 0xd34df00d: кстати, ти каким профилером пользуешься? oprofile?
[07:33:08] <0xd34df00d> NegatiV: нет, я его не пробовал.
[07:33:27] <0xd34df00d> NegatiV: вообще google perftools, а если нужна точность и есть желание попить чай/поботать/поспать — valgrind.
[07:33:59] <NegatiV> не, валгринд я только для поиска ликов юзаю
[07:34:15] <0xd34df00d> valgrind --tool=callgrind таки весьма ня.
[07:34:19] <0xd34df00d> Правда, он мой kcachegrind рушит )
[07:41:47] <Phazeus> народ, а нельзя как-то в клиенте сэмулировать множество подключений к серверу для тестов нагрузочной способности под разными (генерируемыми) никами?)))
[07:42:10] <Phazeus> точнее не сэмулировать, а создать))
[07:43:20] <NegatiV> Phazeus: DDoS?
[07:43:36] <Phazeus> нет тут с сервером проблема, надо создать 1024+ подключений
[07:43:42] <Phazeus> для проверки
[07:44:42] <NegatiV> )))
[07:45:01] <Phazeus> неплохо бы такие фишки прикрутить :) В особое меню для разработчиков :)
[07:45:05] <NegatiV> telnet + bash
[07:45:20] <Phazeus> да можно но что-то долго))
[07:45:36] <Phazeus> хотя
[07:45:57] <Phazeus> протокол надо смотреть :-[
[07:54:43] <NegatiV> Phazeus: за подобный функционал можно оказаться там же где и грейлинк
[07:54:55] <NegatiV> а именн в бане на 90% хабов
[07:55:02] <Phazeus> да понимаю.. сам не люблю грейлинк
[07:55:19] <Phazeus> но блин иногда реально надо :)
[12:10:28] Phazeus вышел(а) из комнаты
[12:19:43] Ским вышел(а) из комнаты
[12:21:03] Ским вошёл(а) в комнату
[16:05:40] gray_graff вышел(а) из комнаты
[17:58:26] Phazeus вошёл(а) в комнату
[18:02:18] NegatiV вышел(а) из комнаты
[19:00:49] Fess вошёл(а) в комнату
[21:08:07] tonal вошёл(а) в комнату
[21:40:57] <Phazeus> Вы в профиле добавите выбор режима соединения?) П то надо на локалку пассив поставить, а нету :)))
[21:45:10] <Ским> хмм
[21:45:16] <Ским> а зачем на локалку пассив? :)
[21:55:41] <Phazeus> да тут прописан адрес доменный мой, а я его в хосты вписал и он на локалке ссылается на локалку и при скачивании с внешки в активе локальный хаь меня отрубает :D
[21:55:50] <Phazeus> да вообще полезно же в профиле :))
[21:56:30] <Ским> не факт, что дц++ так умеет
[21:56:33] <Ским> мне интересно другое
[21:56:41] <Ским> умеет ли он IPv6...
[21:56:51] <Phazeus> тоесть общая настройка - это по умолчанию.. Ну в виндовых же есть.. Не отставать же от них по этому параметру :) Тем более как-то полезно :)
[23:15:55] dhampire вошёл(а) в комнату
[23:45:41] Ским вышел(а) из комнаты
[23:58:40] dhampire вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!