gentoo.ru
Официальная конференция Direct Connect клиента EiskaltDC++
eiskaltdc@conference.gentoo.ru
Суббота, 9 апреля 2011< ^ >
NegatiV установил(а) тему: Last stable release: 2.2.1 || Конференция разработчиков EiskaltDC++
Логи: http://gentoo.ru/jabber/logs/eiskaltdc@conference.gentoo.ru/2011/
Активность в багтрекере: http://code.google.com/p/eiskaltdc/updates/list
Активность разработки: http://github.com/negativ/eiskaltdcpp/network
Release schedule:
* 2011-04-09 Release EiskaltDC++ 2.2.2
TODO:
* XML-RPC interface
ADC notes:
https://adc.svn.sourceforge.net/svnroot/adc/trunk/ADC.txt
https://adc.svn.sourceforge.net/svnroot/adc/trunk/ADC-EXT.txt
http://www.adcportal.com/wiki/ADC_Proposals_list
Git notes:
http://habrahabr.ru/blogs/development/68341/
http://dl.dropbox.com/u/281916/delete/book.pdf
Конфигурация комнаты
Участники комнаты

GMT+4
[00:00:45] <pavelvat> Diger: разве имена заранее не предопределены в cmake ? например для zlib должно быть ${ZLIB_LIBRARIES}
[00:01:25] <Diger> pavelvat: я не про имена, а про условия поиска
[00:01:32] <dhamp> pavelvat, ничего не определено, рассматривай это как скриптовой язык, чего захочешь то и будет
[00:02:06] <Diger> может искать по названию хедера, может попробывать слинковать и тп
[00:02:48] <dhamp> Diger, я делал поиск только через pkg-config
[00:02:58] <Diger> dhamp: хехе
[00:03:08] <dhamp> писать проверки выдаваемого им мне было влом
[00:03:17] <pavelvat> Diger: ${IDNA_LIBRARIES} - это как я понимаю то что вшито в правила cmake для подстановки нужного значения на произвольной платформе, и если используется неправильное имя переменной то и подставлятся необходимое не будет.
[00:03:48] <Diger> pavelvat: да блин забудь ты про "вшито"
[00:04:07] <Diger> pavelvat: скрипт пишут люди
[00:04:39] <Diger> как напишут, как обзавут переменные так они и будут обзываться
[00:04:53] <dhamp> мда негатив сделал бинд к интерфейсу, вот только работает он на старте и всё
[00:05:39] <Diger> pavelvat: вот смотри
if (USE_LIBIDN)
    pkg_check_modules(IDN libidn)
endif(USE_LIBIDN)
[00:05:48] <Diger> pavelvat: все же понятно
[00:06:13] <Diger> pavelvat: если есть желание, добавь условия для винды
[00:06:30] <pavelvat> dhamp: если в шаре ничего нет то при запуске на Windows постоянно висит заполненный прогресс бар хеширования с надписью приостановлено.
[00:06:40] vasily.n@k.. вошёл(а) в комнату
[00:08:12] <Diger> pavelvat: вот смотри пример для тредов
if (WIN32)
  set (LINK STATIC)
  set (WIN32_LIBS "ws2_32")
else (WIN32)
  if (NOT CMAKE_CROSSCOMPILING)
    if (HAIKU)
        set (PTHREADS "root")
    else (HAIKU)
        set (PTHREADS "pthread")
    endif(HAIKU)
  endif (NOT CMAKE_CROSSCOMPILING)
endif (WIN32)
[00:08:29] <Diger> делай по подобию для IDN
[00:08:58] nE0sIghT вышел(а) из комнаты
[00:15:26] vasily.n@k.. вышел(а) из комнаты
[00:16:15] <dhamp> [00:08:28] Diger: делай по подобию для IDN
не советуй плохого )
[00:18:10] FiliN вошёл(а) в комнату
[00:18:32] <pavelvat> Diger: в переменной ${IDNA_LIBRARIES} должно уже автоматически содержаться то что нужно если пакет idn найден, а ты мне говоришь о вручную созданных и инициализированных тем чем нужно переменных.
[00:21:09] FiliN вышел(а) из комнаты
[00:21:16] <pavelvat> dhamp: ты заметил это сообщение?:
[00:12:27] <pavelvat> dhamp: если в шаре ничего нет то при запуске на Windows постоянно висит заполненный прогресс бар хеширования с надписью приостановлено.
[00:21:48] FiliN вошёл(а) в комнату
[00:22:34] <pavelvat> по идее если я вручную не включал паузу то в интерфейсе программы не должно отображаться состояние паузы хеширования.
[00:26:53] <Diger> pavelvat
if (USE_LIBIDN)
if (WIN32)
set (IDN_LDFLAGS  "libidn")
else (WIN32)
    pkg_check_modules(IDN libidn)
endif(USE_LIBIDN)
[00:27:03] <Diger> как-то так
[00:27:23] <pavelvat> Diger: зачем?
[00:27:27] <dhamp> Diger, вот зачем давайть плохие советы
[00:27:29] <dhamp> ?
[00:27:45] <Diger> :-)
[00:28:26] <pavelvat> ведь переменная ${IDNA_LIBRARIES} должна и так содержать нужное если библиотеки для idn были найдены.
[00:28:53] <Diger> pavelvat  кому должна?
[00:29:09] <pavelvat> проблема в том что вот это некорректно: pkg_check_modules(IDN libidn)
[00:29:31] FiliN вышел(а) из комнаты
[00:29:33] <Diger> согласен, линуховый подход
[00:30:58] <dhamp> pavelvat, http://www.cmake.org/cmake/help/cmake2.6docs.html#module:FindPkgConfig - читать
[00:31:08] <dhamp> много много много раз читать
[00:31:15] <dhamp> пока не поймёшь
[00:31:20] <pavelvat> Diger: это предопределённая в cmake переменная, это значит что если предусмотренная в cmake команда для поиска библиотеки, в данном случае idn, вернёт пути к найденным библиотекам, то эти пути уже будут содержаться в переменой ${IDNA_LIBRARIES}
[00:31:51] <dhamp> pavelvat, читай по ссылке и прекращай нести бред
[00:32:11] <Diger> pavelvat: а под винды разве есть pkg-config?
[00:32:24] <Diger> просвети плиз
[00:32:34] <pavelvat> нет
[00:34:18] <Diger> pavelvat: короче  dhamp  сделал определение наличия либы в системе через pkg-config, а ты говоришь совсем про другое
[00:35:23] <Diger> pavelvat: я тебе предложил вариант принудительного линкования, но это не айс, так как при отсутствии данной либы в системе, будут ероры на сборке
[00:37:42] <Diger> pavelvat: если у тебя есть свой вариант, как цмейк сможет определить - есть или нет на винде libidn, - плиз в студию
[00:42:05] <pavelvat> я говорю вот о чём:
find_package (X11)
find_package (PkgConfig)
find_package (BZip2 REQUIRED)
find_package (ZLIB REQUIRED)
find_package (OpenSSL REQUIRED)
find_package (Threads REQUIRED)
find_package (Gettext REQUIRED)
find_package (Iconv REQUIRED)
find_package (Subversion)
find_package (Git)
если эти команды завершаются успехом, то соответствующие им предопределённые(в смысле что имя переменной определено в заранее в cmake и никаким другим оно быть не может) переменные будут содержать требуемые пути, например:
-- Found X11: /usr/lib/libX11.so
-- Found BZip2: /usr/lib/libbz2.so
-- Looking for BZ2_bzCompressInit in /usr/lib/libbz2.so
-- Looking for BZ2_bzCompressInit in /usr/lib/libbz2.so - found
-- Found ZLIB: /usr/include (found version "1.2.5")
-- Found OpenSSL: /usr/lib/libssl.so;/usr/lib/libcrypto.so
т.е.
${ZLIB_INCLUDE_DIR}=/usr/include
${ZLIB_LIBRARIES}=/usr/lib/libz.so
[00:43:09] <Diger> а теперь прочти внимательно, и всё поймешь
[00:44:16] <dhamp> блин вы оба доставляете нереально....
[00:44:50] <Diger> dhamp: ну тебе же влом обьяснять
[00:45:24] <Diger> а я уж как могу, но походу на самом деле зря
[00:45:25] <dhamp> я уже всё что мог объяснил... ну если толи не читает никтотоли не понимает и не признаётся
[00:45:34] <dhamp> ну что я могу в таком случае сделать ?
[00:45:35] <pavelvat> Diger: в поставку cmake входят уже заранее созданные наборы для поиска существующих в природе библиотек, вот набор(файл с правилами поиска) для libidn уже входит в cmake.
[00:46:12] <Diger> pavelvat: верю
[00:46:41] <dhamp> pavelvat, "вот набор(файл с правилами поиска) для libidn уже входит в cmake" - нету, ну не надо врать, ок ?
[00:46:42] <pavelvat> Diger: это я по-поводу вот этого:
"00:43:38] <Diger> pavelvat: если у тебя есть свой вариант, как цмейк сможет определить - есть или нет на винде libidn, - плиз в студию"
[00:47:06] <Diger> pavelvat: напиши правила, и отдай dhamp'у
[00:47:12] <dhamp> pavelvat, + не надо строить догадки, тебе и я и дигер уже сказали что идёт поиск через pkg-config
[00:47:23] <dhamp> но ты видимо видишь то что хочешь
[00:47:48] <dhamp> + ну уже давно можно было просто поглядеть в cmakelists
[00:48:04] <dhamp> и был бы разговор по существу хотя бы
[00:48:35] <pavelvat> Diger: да никакихх правил нет, они уже в cmake есть, надо просто использовать правильную команду, вроде такой:
find_package(IDNA)
[00:49:29] <Diger> в цмейке может быть что угодно,  то что в проекте, не имеет к нему этому никакого отношения. напиши сам и заюзай
[00:49:29] <pavelvat> а не pkg_check_modules(IDN libidn)
[00:50:39] <Diger> pavelvat: если прокатит - отдай dhamp'у
[00:51:13] <dhamp> бля я пишу в никуда...
[00:52:49] <pavelvat> Diger: для lua, boost, bzip2, zlib, openssl, iconv, aspell, gettext, pcre - имеются предопределённые в cmake правила поиска, на кой чёрт мне для каждой библиотеки вручную указывать переменные если это можно делать автоматичеки и незвисимо от платформы используя find_package и стандартные имена переменных.
[00:53:35] <Diger> ща специально грепнул cmake, libidn там и не пахнет
[00:53:49] <Diger> cmake-2.8
[00:56:26] <pavelvat> Diger: да, похоже ещё нет правил для idn, хотя в google я нашёл правила для cmake и подумал что они имеются в поставке с cmake.
[00:56:48] <pavelvat> *нашёл правила idn для cmake
[00:57:00] <Diger> pavelvat: ты представь себе сколько либ в природе, этож епануться можно на все правила написать
[00:57:39] <Diger> чуваки для более менее стандартных написали
[00:57:51] <pavelvat> Diger: основных либ не так уж и много, но именно так и работает cmake.
[00:58:27] <Diger> ну можно бесконечно этот вопрос обсуждать
[00:59:00] <Diger> например, какие либы считать "Основными" , а какие "Второстепенными"
[00:59:30] NegatiV вошёл(а) в комнату
[00:59:45] <Diger> вынести на обсуждение, создать комиссию, проголосовать,
[01:08:16] <pavelvat> dhamp: поскольку pkg-config это под linux, то что ты предлагаешь для поиска idn ?
[01:09:35] <dhamp> pavelvat, для начала я тебе предлагаю включить мозг
[01:10:17] <pavelvat> вот нашёл в google правила для IDNA http://www.freediameter.net/trac/browser/freeDiameter/cmake/Modules/FindIDNA.cmake
[01:12:46] <NegatiV> не пойму в чем проблема - сценарии для cmake пишутся за 10 минут
[01:15:59] <pavelvat> NegatiV: для линковки можно просто вручную указать -lidn, а вот для поиска idn при конфигурировании сложнее.
[01:16:58] <pavelvat> dhamp: не в курсе Big Muscle часто бывает на dcdev ?
[01:17:13] <pavelvat> dhamp: и какой там точный адрес этого хаба?
[01:17:35] <dhamp> pavelvat, adcs://devpublic.adcportal.com:16591
[01:17:55] <dhamp> [01:16:57] pavelvat: dhamp: не в курсе Big Muscle часто бывает на dcdev ?
я за ними не слежу
[01:19:15] <NegatiV> pavelvat: ничего там сложного нет, просто глянь в любой сценарий
[01:20:33] <pavelvat> оказывается DHT так работает, что при каждом запуске программы надо соединиться с сайтом strongdc на sourceforge для получения файла с нодами, и по всей видимости надо просить Big Muscle чтобы он разрешил доступ клиентам с тегом EiskaltDC++.
[01:21:11] <pavelvat> как-то с точки зренияф анонимности, это довольно странный способ работы.
[01:25:36] <dhamp> pavelvat, 7ee5144 что бы ты успокоился
[01:27:26] <pavelvat> dhamp: а как же он будет работать если правил для idn в поставке cmake нет ?
[01:27:52] NegatiV вышел(а) из комнаты
[01:29:34] <dhamp> [01:27:26] pavelvat: dhamp: а как же он будет работать если правил для idn в поставке cmake нет ?
подумаешь git add не сделал
[01:30:06] <pavelvat> и не  ${IDNA_LIBRARY} а  ${IDNA_LIBRARIES} несмотря на то что библиотека всего одна, но по аналогии с отсальными такое наименование более последовательно.
[01:31:08] <Diger> :)
[01:31:25] <dhamp> MARK_AS_ADVANCED( IDNA_LIBRARY IDNA_INCLUDE_DIR )
[01:32:42] <pavelvat> dhamp:
${BZIP2_LIBRARIES}
${ZLIB_LIBRARIES}
${OPENSSL_LIBRARIES}
${GETTEXT_LIBRARIES}
${ICONV_LIBRARIES}
${LUA_LIBRARIES}
везде у предопределенных имён переменных используется LIBRARIES не зависимо от числа библиотек.
[01:33:18] dhamp тянется за лопатой
[01:35:09] <Diger> :-D
[01:49:13] dhamp вышел(а) из комнаты
[01:51:01] pavelvat вышел(а) из комнаты
[01:57:39] Diger вышел(а) из комнаты
[02:20:17] ONYX вошёл(а) в комнату
[03:45:46] Alexey вышел(а) из комнаты
[04:39:30] crypton вошёл(а) в комнату
[08:04:23] FiliN вошёл(а) в комнату
[08:43:25] Diger вошёл(а) в комнату
[08:47:38] FiliN вышел(а) из комнаты
[09:50:43] Nikoli вышел(а) из комнаты
[09:51:02] Nikoli вошёл(а) в комнату
[10:43:44] WiseLord вошёл(а) в комнату
[11:31:19] tehnick вошёл(а) в комнату
[12:22:11] amfetamin вошёл(а) в комнату
[12:23:28] amfetamin вышел(а) из комнаты
[12:32:58] nE0sIghT вошёл(а) в комнату
[12:52:35] NegatiV вошёл(а) в комнату
[12:58:38] crypton вышел(а) из комнаты
[12:59:37] pavelvat вошёл(а) в комнату
[13:00:30] <pavelvat> сборка из 2.2.x не запускается:
$ eiskaltdcpp-qt
QGtkStyle was unable to detect the current GTK+ theme.
Signal handlers installed.
$XDG_CONFIG_HOME: /home/pavel/.config/eiskaltdc++/
$XDG_DOWNLOAD_DIR: /home/pavel/Downloads/
Loading: Хеш базы данных
Loading: Расшаренные файлы
Loading: Очередь
Loading: Пользователи
QGtkStyle was unable to detect the current GTK+ theme.
Загружены иконки для списка пользователей
Загружены иконки программы
eiskaltdcpp-qt: symbol lookup error: eiskaltdcpp-qt: undefined symbol: _ZN4dcpp19ConnectivityManager5setupEb
[13:02:22] <tehnick> pavelvat: твоя локальная проблема. У меня все нормально.
[13:12:10] <pavelvat> tehnick: пересобрал с нуля в чистой директории - проблема осталась.
[13:12:59] <tehnick> pavelvat: пересборка тут ни при чем совершенно
[13:13:06] <tehnick> Только зря время потерял.
[13:13:24] <tehnick> У тебя версия используемой библиотеки не соответствует версии бинарника.
[13:13:38] <pavelvat> tehnick: при запуске из директории сборки - успешно запускается.
[13:13:54] <pavelvat> а установленная версия нет.
[13:14:09] <tehnick> pavelvat: ldd `which eiskaltdcpp-qt`
[13:14:17] <tehnick> [12:13:22] <tehnick> У тебя версия используемой библиотеки не соответствует версии бинарника.
[13:14:29] <tehnick> pavelvat: прочти ^
[13:16:12] <pavelvat> tehnick: ну и как такое могло случится? - и раз у меня возникла эта проблема то она может присутствовать и у других.
[13:21:27] <pavelvat> tehnick: проблема была в том что при конфигурировании был забыт флаг -DCMAKE_INSTALL_PREFIX=/usr, поэтому ставилось в /usr/local
[13:32:36] <tehnick> pavelvat: это было очевидно
[13:33:26] <tehnick> pavelvat: я тебе не просто так предлагал ldd сделать...
[13:34:41] nE0sIghT вышел(а) из комнаты
[13:35:57] <pavelvat> tehnick: заметить что у libeiskaltdcpp путь содержит local в отличии от остальных библиотек довольно трудно так как там довольно длинный вывод, а libeiskaltdcpp находится в середине вывода.
[13:36:59] crypton вошёл(а) в комнату
[13:41:18] <pavelvat> tehnick: сейчас при запуске программы отображается прогресс бар хеширования с надписью приостановлен - очевидно что так быть не должно.
[13:42:26] <pavelvat> прогресс бар должен отображаться только если пользователь собственноручно поставил хеширование на паузу.
[13:42:57] <tehnick> pavelvat: ошибаешься
[13:43:30] <tehnick> pavelvat: пауза при запуске сейчас сделана специально
[13:44:10] <pavelvat> tehnick: мне мозолит глаз этот прогресс бар - я не ставил хеширование на паузу, соответственно этот прогресс бар отображаться не должен.
[13:45:02] <tehnick> pavelvat: ты --- не показатель
[13:45:16] <tehnick> pavelvat: прогрессбар и раньше появлялся
[13:45:31] <tehnick> при запуске
[13:45:40] <tehnick> Просто он не стоял на паузе
[13:46:02] <tehnick> И если хэшировать было нечего, быстро скрывался.
[13:46:34] <pavelvat> tehnick: я не против его появления когда начинается обновление шары, я против того что он висит всегда, в то время как должен висеть только если я вручную нажал на паузу хеширования.
[13:46:58] <tehnick> pavelvat: он не висит всегда, он висит минуту при запуске
[13:47:11] <pavelvat> это просто принципиально неправильное поведение.
[13:47:56] <pavelvat> у меня он висит не минуту, а всегда
[13:48:02] nE0sIghT вошёл(а) в комнату
[13:48:38] <pavelvat> и с какой стати он должен бы был висеть именно минуту, а не 2, 3 минуты?
[13:49:18] <tehnick> [12:47:54] <pavelvat> у меня он висит не минуту, а всегда
У тебя какой период автоматического обновления шары?
[13:50:08] <pavelvat> tehnick: 0 - отключено автоматическое обновление.
[13:50:31] <tehnick> pavelvat: значит, все работает как задумано.
[13:51:12] <tehnick> pavelvat: теперь при отключенном автоматическом обновлении не будет происходить хэширование при запске.
[13:52:05] <pavelvat> tehnick: я не хочу чтобы он висел - мне этот прогресс бар не нужен, вот если бы я вручную поставил хеширование на паузу, то тогда да прогресс бар должен висеть - т.к. он отображает текущий прогресс хеширования.
[13:52:54] <pavelvat> короче нужно отличать ручную паузу от автоматической.
[13:53:27] <tehnick> pavelvat: нет, не нужно
[13:53:44] <pavelvat> tehnick: нет, нужно
[13:53:55] <tehnick> pavelvat: пауза --- это и есть пауза
[13:54:09] <tehnick> pavelvat: и пользователь должен видеть, что она есть
[13:54:22] <tehnick> pavelvat: и пользователь должен мочь продолжить хэширование
[13:54:25] <pavelvat> tehnick: я не включал паузу - я не должен видеть что она есть.
[13:54:33] <tehnick> pavelvat: и пофиг кто поставил паузу
[13:55:08] <pavelvat> продолжить хеширование можно кликнув по соответствующей кнопке и нажать возобновить.
[13:55:45] <tehnick> pavelvat: они связаны и нечего из нарушать
[13:57:24] <pavelvat> tehnick: и вообще зачем ждать минуту? - если автоматическое обновление включено то пусть мгновенно и начинает хешировать сразу после запуска.
[13:57:51] <tehnick> pavelvat: чтобы гуй быстрее запустился
[13:57:58] <tehnick> pavelvat: можно меньше поставить
[13:58:21] <tehnick> pavelvat: просто часто жалуются, что гуй медленно появляется
[13:58:27] <tehnick> pavelvat: а проблема --- в ядре
[14:00:34] <pavelvat> tehnick: по-моему это просто бред - если у меня несколько крупных хабов то они загружаются дольше чем минута - вообщем оттягивать на минуту хеширование просто непоследлвательно - получается какой-то подгон под среднее время загрузки всех хабов.
[14:02:17] <tehnick> pavelvat: среднее, да. Это недостаток.
[14:02:41] <tehnick> Еще от числа хабов зависит.
[14:03:01] <tehnick> Некоторые юзеры подключены к десяткам хабов...
[14:03:49] <tehnick> pavelvat: у тебя есть конструктивные предложения?
[14:04:19] <pavelvat> tehnick:
Comment 12 by project member vasily....@eml.ru, Today (14 hours ago)
>C11
Я делал git checkout dcpp/HashManager.cpp
и git diff мне возвращал пусто.
И я понимаю, что AUTO_REFRESH_TIME == 60 это не то же самое, что и 60-секундная задержка запуска хэширования. А AUTO_REFRESH_TIME==0 означает только ручное перехэширование.
>Значит все работает как запланировано.
Это как понимать? Я может хочу поскорее расшарить, чтобы другие люди это скачать могли. Так бы я мог игнорировать задержку руками нажав Resume. Однако, твой код мне такое не позволяет ( мой патч позволял ). Это уже какая-то эпловская философия.
И это никак снаружи не управляется, чтобы можно было настроить-отключить, т.е. из-за того что это в ядре, под ударом оказываются и qt и gtk морды и демон.
[14:04:31] <pavelvat> tehnick:
Comment 14 by project member vasily....@eml.ru, Today (14 hours ago)
Кстати, понял почему у тебя сразу на паузу ставит даже если пользователь сказал "надо":
    if (Util::getUpTime() < 60 && !isHashingPaused()) {
        pauseHashing();
    }
Даже если я руками говорю Resume, через секунду все встанет на паузу, LOL.
[14:04:46] <tehnick> pavelvat: это уже было исправлено
[14:05:11] <pavelvat> tehnick: моё предложение убрать вообще эту минутную задержку - потому что она вообще не нужна.
[14:06:02] <tehnick> NegatiV: пинг
[14:06:20] <tehnick> pavelvat: мне она тоже не нужна
[14:06:31] <tehnick> pavelvat: но просили именно юзеры
[14:06:56] <tehnick> pavelvat: других способ ускорить загрузку я пока не вижу
[14:07:03] <NegatiV> tehnick: понг
[14:07:37] <pavelvat> tehnick: на совремменных процессорах - никакого торможение при старте не наблюдается даже если одновременно с подключением к хабам начинается хеширование, задержка вообще не нужна.
[14:08:05] <tehnick> NegatiV: твое мнение: нужна минутная пауза при запуске или нет?
[14:08:38] <tehnick> pavelvat: при чем тут процессоры вообще? Все зависит только от диска.
[14:08:49] <tehnick> Размера шары и т.п.
[14:09:21] <NegatiV> tehnick: я не против - запускаться клиент стал в разы быстрее
[14:09:27] <pavelvat> tehnick: не только, у меня диски одинаковой скорости но на слабом процессоре подтормаживает довольно сильно.
[14:09:50] <NegatiV> а такую тормозную вещь как хеширование можно и на попозже отложить
[14:10:07] <NegatiV> тем более кому не надо этого могут фичу отключить
[14:10:20] <tehnick> NegatiV: э?
[14:10:26] <tehnick> NegatiV: опции нет...
[14:10:42] <NegatiV> tehnick: через конфиг же редактируется
[14:10:46] <NegatiV> или нет?
[14:10:48] <tehnick> NegatiV: нет
[14:10:49] <pavelvat> NegatiV: отключить? - по-моему нет этого сейчас.
[14:11:14] <tehnick> NegatiV: в конфиге только период автоматического обновления
[14:11:45] <NegatiV> tehnick: в либом случае ничего плохого в отложенном хешировании не вижу.
[14:11:46] <tehnick> Видимо придется таки запилить опцию, чтобы всех устроило...
[14:12:47] <pavelvat> NegatiV: если у тебя период автоматического обновления шары стоит 0, то прогресс бар хеширования будет постоянно висеть - тебя это устраивает? - меня нет, а вот tehnick говорит что так и должно быть.
[14:12:57] <tehnick> И да, релиз лучше отложить на неделю минимум
[14:13:05] <tehnick> NegatiV: возражений нет?
[14:13:20] <NegatiV> pavelvat: да мне он глаза и не мозолит.
[14:13:35] <NegatiV> tehnick: нету, лучше выпусть когда будет готово
[14:13:37] crypton вышел(а) из комнаты
[14:13:44] <tehnick> pavelvat: оно так специально сделано
[14:13:46] <NegatiV> к тому же я там новый модуль запилил
[14:13:54] <NegatiV> нужно потестировать и перевести
[14:13:56] <tehnick> pavelvat: чтобы юзер видел, что обновления не было
[14:14:16] tehnick установил(а) тему: Last stable release: 2.2.1 || Конференция разработчиков EiskaltDC++
Логи: http://gentoo.ru/jabber/logs/eiskaltdc@conference.gentoo.ru/2011/
Активность в багтрекере: http://code.google.com/p/eiskaltdc/updates/list
Активность разработки: http://github.com/negativ/eiskaltdcpp/network
Release schedule:
* 2011-04-16 Release EiskaltDC++ 2.2.2
TODO:
* XML-RPC interface
ADC notes:
https://adc.svn.sourceforge.net/svnroot/adc/trunk/ADC.txt
https://adc.svn.sourceforge.net/svnroot/adc/trunk/ADC-EXT.txt
http://www.adcportal.com/wiki/ADC_Proposals_list
Git notes:
http://habrahabr.ru/blogs/development/68341/
http://dl.dropbox.com/u/281916/delete/book.pdf

[14:14:46] <pavelvat> NegatiV: мне тоже не мозолит, когда он появляется при хешировании чего ниюбудь, а после окончания хеширования исчезает, но когда он будет висеть постоянно(с надписью "приостановлено") то будет мозолить.
[14:18:46] <pavelvat> NegatiV: может стоит делать не багфиксные релизы раз в 3 месяца, чтобы накапливалось значительное количество изменений, а то новость на linux.org.ru могут не подтвердить по причине минорный релиз.
[14:20:13] <NegatiV> pavelvat: мне главное чтобы релиз был стабильным, а будут ли о нем новости - плевать
[14:21:47] <tehnick> +1
[14:22:17] <tehnick> Причем на опеннете в любом случае подтвердят.
[14:22:20] <pavelvat> NegatiV: новость о релизе это способ уведомления пользователей - так о релизе узнают больше людей, к тому же это очередное упоминание клиента, чем больше упоминаний тем лучше.
[14:22:31] <tehnick> И в дебиан пакет с исправлениями уйдет.
[14:22:51] <tehnick> pavelvat: с последним тезисом не согласен
[14:23:10] <tehnick> pavelvat: количество упоминаний не идет на пользу
[14:23:37] <NegatiV> pavelvat: а обновления из реп? я в первую очередь так узнаю что программа обновилась. да и не надо набивать оскомину постоянным потоком новостей
[14:25:02] <pavelvat> tehnick: кстати, о debian там всё ещё сборка без поддержки UPnP, разве так долго залить новую версию с единственным отличием - включённой поддержкой cmake флага -DUSE_MINIUPNP=ON
[14:25:05] vasily.n@k.. вошёл(а) в комнату
[14:25:30] <tehnick> pavelvat: это не единственное отличие
[14:26:02] <pavelvat> NegatiV: tehnick: а не пора ли удалить из дерева проекта каталог miniupnpc? - ведь теперь в debian уже есть в портах miniupnpc.
[14:26:02] <tehnick> pavelvat: и я вообще думал дождаться релиза 2.2.2
[14:26:38] <tehnick> pavelvat: нет, не пора.
[14:26:41] <tehnick> 1) В убунте его нет даже в Natty
[14:26:44] <vasily.n@k..> > NegatiV:  pavelvat: да мне он глаза и не мозолит.
Когда я эту штуку пилил, мне еще кто-то говорил, что на статусбаре места нет. А теперь, значит, он совсем и не мешет?
[14:26:52] <NegatiV> pavelvat: дебиан не показатель)
[14:27:12] <NegatiV> vasily.n@k..: у меня широкоформатник))
[14:27:25] <tehnick> 2) Когда он появится в следующем релизе убунты, то для пользователей предыдущих релизов и на лаунчпаде он будет недоступен
[14:28:31] <tehnick> pavelvat: короче: в моем ppa используется именно локальная версия miniupnp
[14:28:56] <tehnick> pavelvat: а в дебиане будет использоваться этот новый пакет
[14:28:58] <pavelvat> tehnick: получается что выпилить каталог miniupnpc из дерева проекта можно будет только спустя несколько лет?
[14:30:01] <tehnick> pavelvat: выпилить можно хоть сейчас. Я просто отключу этот функционал в пакетах на моем ppa...
[14:31:40] <vasily.n@k..> tehnick: вот если бы можно было легальным способом узнать, что это программная пауза а не пользователя, я бы смог ввсети еще одно состояние, а дальше можно было бы настраивать поведение: толи рисовать кнопку паузед, толи скрывать ее.
[14:31:51] <pavelvat> tehnick: UPnP очень востребованный функционал, т.к. очень много людей использует роутеры, а вручную открывать порты - это не тривиальная задача для обычных пользователей.
[14:32:15] <tehnick> vasily.n@k..: проверка настроек --- способ не легальный?
[14:32:51] <tehnick> pavelvat: это ты сам себе ответил? =)
[14:33:01] <tehnick> pavelvat: я в курсе, что он нужен
[14:33:08] <vasily.n@k..> ты имееш ввиду запилить подобный if тому, что у тебя там в HashManager? это прям вообще некрасиво
[14:33:24] <tehnick> vasily.n@k..: это не у меня, это у нас
[14:33:41] <tehnick> vasily.n@k..: и да, я думаю добавить опцию для настройки интервала
[14:34:02] <tehnick> после которого будет возобновлено хэширование при запуске
[14:34:15] <tehnick> А прятать индикатор считаю неправильным.
[14:34:30] <tehnick> Измененную иконку пользователь может и не заметить.
[14:35:09] <vasily.n@k..> можно индикатор прятать, но выдать сообщение, типа "warnig:automatic rehashing disabled"
[14:35:23] Alexey вошёл(а) в комнату
[14:35:30] <tehnick> vasily.n@k..: куда выдавать?
[14:36:02] <vasily.n@k..> ну это можно как сообщение в статус баре, а можно некоторое время держать индикатор с таким сообщением
[14:36:44] <tehnick> Индикатор короткий --- в него не поместится.
[14:36:59] <tehnick> Сообщения в статусной строке сменяются быстро.
[14:37:00] vasily.n@k.. вышел(а) из комнаты
[14:37:04] <tehnick> Но сделать можно.
[14:45:45] <tehnick> vasily.n@k..: у тебя с английским норм?
[14:46:31] vasily.n@k.. вошёл(а) в комнату
[14:47:22] <vasily.n@k..> >tehnick:  vasily.n@k..: у тебя с английским норм?
на английский не жалуюсь.
[14:47:50] <tehnick> vasily.n@k..: 'Deferred hashing time' --- норм название для опции?
[14:49:23] <vasily.n@k..> чем delayed не нравится?
[14:49:47] <vasily.n@k..> defer мне пришлось в словаре посмотреть, delay
[14:49:53] <vasily.n@k..> я еще с паскаля знаю
[14:50:33] <vasily.n@k..> и лучше просто: hashing start delay
[14:51:24] <vasily.n@k..> ну в в таких терминах разговорны англиский и грамматика уже не показатель.
[14:51:58] <tehnick> Пофиг на грамматику.
[14:52:13] <tehnick> Важно, чтобы смысл был понятен.
[14:54:42] <pavelvat> tehnick: помнишь я тебе писал что при сборке с поддержкой sqlite для списков скачанного\отданного при перезапуске айскальта искажаются размеры, этот баг по-прежнему присутствует, но почему то багрепорта никто пока не создал.
[14:55:27] <vasily.n@k..> Я, вообще, к этой кнопке paused прицепился потому, что это просто некрасиво выглядит, как она постоянно торчит и не дает существенной информации. Если пользователь отключил авто-обновление шары значит он знает, что он делает, нунжо просто один раз или периодически напоминать ему, что он сам себе злобный буратино, а в остальное время убрать с глаз долой, чтобы не мешало.
[14:55:57] <tehnick> pavelvat: создай
[14:56:03] <tehnick> vasily.n@k..: хорошо
[15:02:34] vasily.n@k.. вышел(а) из комнаты
[15:03:52] vasily.n@k.. вошёл(а) в комнату
[15:05:21] vasily.n@k.. вышел(а) из комнаты
[15:06:01] vasily.n@k.. вошёл(а) в комнату
[15:14:14] <vasily.n@k..> » <tehnick> vasily.n@k..: хорошо
В идеале хотелось бы, чтобы в статусбаре вместо Paused при программной задержке, выводилось бы что-то вроде Delayed(59) и число постепенно уменьшалось, это несет больше информации. Но и просто слова Delayed будет достаточно.
[15:14:54] vasily.n@k.. вышел(а) из комнаты
[15:15:06] vasily.n@k.. вошёл(а) в комнату
[15:20:45] tehnick вышел(а) из комнаты
[15:24:12] tehnick вошёл(а) в комнату
[15:33:06] Diger вышел(а) из комнаты
[15:34:47] vasily.n@k.. вышел(а) из комнаты
[15:42:54] tehnick вышел(а) из комнаты
[16:29:50] vasily.n@k.. вошёл(а) в комнату
[16:31:10] <vasily.n@k..> tehnick: Сейчас вроде запилил, то о чем я говорил. выложу патч в issue 1036
[16:38:35] <vasily.n@k..> issue 1036, comment 16 тестируйте.
[16:41:32] dhamp вошёл(а) в комнату
[16:42:16] <dhamp> vasily.n@k.., патч в с16 -  ужасен
[16:42:44] <vasily.n@k..> я знаю
[16:43:10] <vasily.n@k..> Естественно, его надо причесать, это просто демонстрация того, чего хотелось бы.
[16:45:25] <vasily.n@k..> Вообще, патч не так уж и ужасен, скорее ужасен сам код. Его надо рефакторить и рефакторить, но обычно работает и ладно.
[16:47:51] Sheesh вошёл(а) в комнату
[16:51:41] Sheesh вышел(а) из комнаты: qutIM : Jabber plugin
[17:00:35] dhamp вышел(а) из комнаты
[17:11:09] nE0sIghT вышел(а) из комнаты
[17:19:00] <vasily.n@k..> Вообще ООП нам говорит, что то, что относится к конкретному объекту, должно быть инкапуслироваться его методом. Поэтому, вообще, HashManager кроме isHashingPaused() должен предоставлять методы isHashingDelayed()
[17:20:56] <vasily.n@k..> и hashingStartupDelay() { return SETTING } и hashingDelaySecondsLeft() и типо того, чтобы не нужно было  дублировать 100500 раз проверки типа Util::getUpTime() < 60
[17:21:38] nE0sIghT вошёл(а) в комнату
[17:24:31] pavelvat вышел(а) из комнаты
[17:34:06] <Kroll> галка "Только полные" не работает
[17:34:10] <Kroll> думает что они всегда не полные
[17:34:18] <Kroll> жмёш галку и всё исчезает тупо
[17:34:35] <Kroll> хоть сутки с момента закачки прошли даже
[17:37:13] <Kroll> а ещё хочется чтобы запоминало её при рестарте
[17:37:49] <Kroll> кутэ версия у меня есличё
[17:45:28] vasily.n@k.. вышел(а) из комнаты
[17:50:25] Diger вошёл(а) в комнату
[17:58:26] vasily.n@k.. вошёл(а) в комнату
[18:18:20] Diger вышел(а) из комнаты
[18:18:30] Diger вошёл(а) в комнату
[18:22:55] nE0sIghT вышел(а) из комнаты
[18:28:48] tehnick вошёл(а) в комнату
[18:29:41] <tehnick> issue 1038  --- я против файлов в шаре вне дерева каталогов
[18:30:13] <tehnick> vasily.n@k.., NegatiV: ^^
[18:31:23] <tehnick> vasily.n@k..: пауза перед циклом for(;;) в твоем патче вызывает проблемы
[18:32:49] pavelvat вошёл(а) в комнату
[18:33:18] <tehnick> vasily.n@k..: и кстати патч не к последней ревизии, там уже были изменения от dhamp
[18:34:39] <NegatiV> Kroll: там переводы надо обновить и все заработает
[18:35:36] <Kroll> NegatiV: это не мне?
[18:35:46] <NegatiV> Kroll: тебе
[18:35:48] <Kroll> хм
[18:35:52] <Kroll> а как их обновить?
[18:36:02] nE0sIghT вошёл(а) в комнату
[18:36:07] <NegatiV> этим мы занимаемся
[18:36:09] <tehnick> NegatiV: чо-чо?
[18:36:26] <NegatiV> Kroll: с английским интерфейсом все работает
[18:36:34] <tehnick> NegatiV: как раз работает только в тех локализациях, где перевода нет
[18:36:34] <NegatiV> Kroll: можешь проверить)
[18:36:54] <Kroll> <NegatiV> этим мы занимаемся
я и имел в виду что не мне :)
[18:36:58] <tehnick> NegatiV: а в русской локализации перевод есть и фильтр работает неправильно
[18:37:22] <Kroll> а ещё у меня при рестарте панелька съёживается :(
[18:37:33] <vasily.n@k..> tehnick: ну у меня pause перед for не вызвает проблем. и вообще какой смысл в HashManager::on( timer..) первую минуту проверять состояние хэшера и ставить его на паузу. Казалось бы проще сразу запускать его на паузе и когда-надо резьюмить.
[18:37:37] <Kroll> ну которая с хабами
[18:37:39] <NegatiV> tehnick: я постараюсь разобраться чего там сломано
[18:37:52] <tehnick> vasily.n@k..: остальные части патча скорее всего добавлю скоро
[18:39:00] <vasily.n@k..> technique: да еще надо переименовать s/Delayed (%1)/Delayed/ как-то раздражает, что буквы постоянно смещаются. Того что там прогресбар в обратную сторону отсчитывает достаточно.
[18:39:29] nE0sIghT вышел(а) из комнаты
[18:39:37] <vasily.n@k..> *tehnick ( спасибо aspell )
[18:39:45] <tehnick> vasily.n@k..: =)
[18:41:55] <vasily.n@k..> issue 1038: ну всегда можно просто сказать, что это возможно будет добавлено в релизе eiskaltdc++ 100500.0.0 ))
[18:42:22] <tehnick> "Отсрочка --- самая надежная форма отказа" =)
[18:42:31] <tehnick> Не помню чья фраза.
[18:42:48] <tehnick> Только issue будет в трекере висеть и глаза мозолить.
[18:43:06] WiseLord вышел(а) из комнаты
[18:43:13] <vasily.n@k..> Отложить -- самая сильная форма отказа. Закон Мерфи.
[18:43:26] WiseLord вошёл(а) в комнату
[18:43:29] <tehnick> [17:37:37] <NegatiV> tehnick: я постараюсь разобраться чего там сломано
Я пробовал тупо на 0 и 1 заменить --- все работало...
[18:45:52] <tehnick> [17:37:32] <vasily.n@k..> tehnick: ну у меня pause перед for не вызвает проблем. и вообще какой смысл в HashManager::on( timer..) первую минуту проверять состояние хэшера и ставить его на паузу. Казалось бы проще сразу запускать его на паузе и когда-надо резьюмить.
Т.е. у тебя он из паузы выходит после минуты?
[18:46:40] <vasily.n@k..> Закон задержки Паркинсона
"Отложим" — это самая ужасная форма отказа.
>Т.е. у тебя он из паузы выходит после минуты?
yep
[18:48:31] <tehnick> [17:39:35] <vasily.n@k..> *tehnick ( спасибо aspell )
Кстати, у тебя для en? Или для ru+en?
[18:49:36] <vasily.n@k..> выбрать можно только ru или en, на ru+en надо где-то копать и настаривать
[18:50:01] vasily.n@k.. вышел(а) из комнаты
[18:50:28] vasily.n@k.. вошёл(а) в комнату
[18:50:57] <vasily.n@k..> причем смена словаря после перезапуска клиента ))
[18:51:31] <tehnick> vasily.n@k..: ага, "преимущества" aspell. Потому и спросил...
[18:53:21] <vasily.n@k..> tehnick: ну казалось бы бери cat да склей aspell-ru и aspell-en, токо чето много там файлов.
[18:53:22] nE0sIghT вошёл(а) в комнату
[18:53:46] <tehnick> vasily.n@k..: там бинарный формат словарей
[18:54:06] <tehnick> vasily.n@k..: а генерить сам никто не будет
[18:54:21] <tehnick> vasily.n@k..: поэтому myspell гораздо удобнее
[18:58:50] <tehnick> vasily.n@k..: http://code.google.com/p/eiskaltdc/issues/detail?id=506 --- WontFix
[18:58:56] <tehnick> Ибо некому и некогда...
[19:01:06] <vasily.n@k..> >Ибо некому и некогда...
Ну я не использую dc++ для чата, мне он нужен в основном как средство обмена файлами. Мне даже не совсем ясно зачем там чат присутствует.
[19:15:40] <vasily.n@k..> > tehnick: vasily.n@k..: и кстати патч не к последней ревизии, там уже были изменения от dhamp
Не знаю, видимо какие-то хитрости git, мне git pull говорил "Already up-to-date."
[19:16:49] <tehnick> vasily.n@k..: а ты в какой ветке работаешь?
[19:17:06] <tehnick> У нас все свежие изменения в ветке 2.2.x
[19:17:09] <vasily.n@k..> On branch master
[19:17:24] <tehnick> В master сливаем постепенно.
[19:17:30] <tehnick> После проверки...
[19:17:39] <ubuntu11.04> хм..резил перенесли?
[19:18:58] <tehnick> ubuntu11.04: да
[19:19:36] <ubuntu11.04> tehnick, причина-не тайна?
[19:20:06] <tehnick> ubuntu11.04: не тайна, но писать лень... =)
[19:20:13] <tehnick> ubuntu11.04: тебе очень важно?
[19:20:35] <ubuntu11.04> tehnick, да нет.ну в двух словах уж скажи
[19:21:52] <tehnick> ubuntu11.04:
1) новый функционал, которому нужна отладка
2) надо обновить документацию
3) надо запилить кое-что в gtk-морду, что я никак не успеваю
[19:22:36] <ubuntu11.04> tehnick, о.если гтк версия похорошеет-то любая задержка оправданна
[19:24:02] <tehnick> ubuntu11.04: много-го не жди, там только диалог настроек надо обновить срочно
[19:25:57] <tehnick> ubuntu11.04: а опция сворачивания в трей при запуске уже появилась
[19:26:04] <ubuntu11.04> tehnick,  :-) да я если честно даже и придраться не найду к чему.за 20 дней аптайма-ни креша,и память не течёт почти.так что еаскальт-Ъ
[19:26:18] vasily.n@k.. вышел(а) из комнаты
[19:28:32] vasily.n@k.. вошёл(а) в комнату
[19:32:31] <WiseLord> кто-нибудь логами в чате пользуется?
[19:32:43] <WiseLord> сейчас вроде бы PM/%B - %Y/%[userNI] (%[userCID]).log дефолтный формат логов для приватов
[19:33:08] <WiseLord> и, интересное дело, при общении с кем-то логи пишутся в разные файлы - мои реплики и реплики оппонента
[19:33:30] <WiseLord> как-то это странно
[19:34:38] <WiseLord> NegatiV: %[userNI] - это ник пользователя, с которым разговариваешь, или же ник пользователя, произносящего фразу?
[19:35:15] <NegatiV> WiseLord: ник произносящего
[19:35:25] <WiseLord> и это вроде от ядра зависит?
[19:36:20] <WiseLord> вот как интересно выглядят логи разговора с человеком: http://www.pictureshack.ru/images/9675xsnap.png - в двух разных файлах
[19:37:33] <WiseLord> %[userNI] берётся от сказавшего фразу, %[userCID] - от того, с кем ты общаешься - и вот такие получаются логи в итоге
[19:47:26] <vasily.n@k..> tehnick: смотрю на строку
if (Util::getUpTime() >= 60 && SETTING(AUTO_REFRESH_TIME) > 0 && isHashingPaused()) { resume...
и понимаю, что после задержки в 60 секунд, пользователь не сможет поставить на паузу хэширование, т.к. через секунду оно зарезьюмится
[20:00:13] <vasily.n@k..> кстати такой вопрос: на гуглокоде же поддерживается mercurial, так почему git?
[20:11:41] pavelvat вышел(а) из комнаты
[20:11:45] Diger вышел(а) из комнаты
[20:23:39] vasily.n@k.. вышел(а) из комнаты
[20:24:11] rzed вошёл(а) в комнату
[20:24:56] Diger вошёл(а) в комнату
[20:25:18] Diger вышел(а) из комнаты
[20:25:37] <tehnick> vasily.n@k..: см. ветку 2.2.x
[20:55:59] vasily.n@k.. вошёл(а) в комнату
[20:57:45] <vasily.n@k..> tehnick:
>  If delay == 0, hashing process will not be resumed.
>  в гуи  ( seconds, 0 = off )
и чему верить?
[20:58:51] <vasily.n@k..> Я хочу, чтобы у меня без задержки хэшировалось, я конечно, могу поставить 1 и это решит проблему, но чето справка в ГУИ тогда врет.
[20:59:17] <tehnick> vasily.n@k..: 0 --- отключить
[20:59:28] <tehnick> vasily.n@k..: как еще это объяснить?
[20:59:41] <tehnick> 0 = infinity ? =)
[20:59:51] <vasily.n@k..> ага, но автообновление шары у меня включено )), однако выключена задержка и то тоже выключает )))
[21:00:18] <vasily.n@k..> -1 обычно ставят как infinity
[21:00:30] <tehnick> vasily.n@k..: что-что? Период автообновления шары сейчас влиять не должен.
[21:00:46] <tehnick> vasily.n@k..: о! Это мысль.
[21:03:27] <vasily.n@k..> короче, я, конечно, понимаю, что появилось 2 способа отключить автообновление шары: выставить задержку в бесконечность и задать 0 в периоде обновления. Однако, должно работать по дефолту нулевая задержка обновление с дефолтным периодом 60 минут. Т.к. большинство пользователей наверно ничего менять даже не будут при апгрейде, чтобы у них сарзу все не сломалось.
[21:05:39] <tehnick> vasily.n@k..: да посмотри ты в код. Период обновления сейчас вообще не используется...
[21:06:56] <vasily.n@k..> код видел, и, да, там теперь нету того SETTING(..REFRESH)
[21:11:33] <vasily.n@k..> tehnick: я так понимаю в идеале должно быть так:
задержка, обновление, период..., обновление, период.
и задержка может быть бесконечной и период обновления тоже
или как?
хотя трудно в эту схему вписать полностью ручное обновление
[21:15:17] <vasily.n@k..> хотя нет, задержка==-1 значит полностью ручное обновление ( хотя, чем выдумывать всякие такие договоренности, проще просто дать опцию fully_manual_share_update )
[21:15:57] <tehnick> vasily.n@k..: еще одна опция не нужна
[21:16:19] <tehnick> vasily.n@k..: я сейчас сделал время задержки пол часа максимум
[21:17:51] <vasily.n@k..> Да, ты подумай в настройках будет чекбокс или радио на manual/automatic
а в automatic уже настройки задержки и периода без всяких ==0 means off/infinity
[21:18:41] <tehnick> vasily.n@k..: двух этих опций достаточно на мой взгляд
[21:21:19] <vasily.n@k..> Я конечно понимаю, что это несколько сложнее сделать, чем договориться выделить специальные значения, но так было бы понятнее пользователю. При включении manual, настройки задержки и периода становились бы серыми.
Ну да впрочем это наверно слишком хорошо для айскальта.
[21:25:54] <vasily.n@k..> tehnick:
>Hashing start delay on startup
Даже не знаю, почему меня это улыбнуло )))
[21:26:58] vasily.n@k.. вышел(а) из комнаты
[21:34:44] Diger вошёл(а) в комнату
[22:25:56] WiseLord вышел(а) из комнаты
[22:26:47] WiseLord вошёл(а) в комнату
[22:28:24] WiseLord вышел(а) из комнаты
[22:31:30] WiseLord вошёл(а) в комнату
[22:51:30] WiseLord вышел(а) из комнаты
[22:52:58] WiseLord вошёл(а) в комнату
[22:56:28] ONYX вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!