Home
Objective Caml
ocaml@conference.jabber.ru
Суббота, 29 мая 2010< ^ >
ygrek установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | release crap | judge by commits, not comments | ocaml мёртв, move on
Конфигурация комнаты
Участники комнаты

GMT+4
[00:09:12] serp256 вышел(а) из комнаты
[00:18:09] <ygrek> olegfink: да, yacc другое дело, там надо пустые case'ы явно отмечать
[00:21:53] <olegfink> а ocamlyacc -- это и то, и другое дело по цене одного
[00:31:25] ygrek рекомендует menhir
[00:58:35] <ermine> gds: а тут теперь я не поняла :)
[00:59:31] <ermine> ygrek: а он развивается?
[01:00:47] <olegfink> а вот интересно, мне в последнее время все кажется, что подобные типовые извраты, в основном в хаскеле и немного в окамле, типа тех, что описаны у моего тезки, подозрительно по стилю напоминают то, за что все так
[01:01:29] <olegfink> любят c++. это только мне кажется? :-)
[01:03:07] <ermine> это ты про какие типовые задачи?
[01:05:08] <olegfink> ну вот, фантомные типы, скажем, или частичные сигнатуры
[01:05:44] <ermine> я пока не поняла, как применить тут фантомные типы
[01:06:14] <ermine> там тип в самой t не употребляется, а только в аргументах :-)
[01:06:58] <ygrek> ermine: он работает
[01:07:01] <ygrek> это важнее :)
[01:07:50] <ygrek> olegfink: так и есть, просто в c++ это гораздо эффективней выносит мозг
[01:09:54] ermine вышел(а) из комнаты
[01:15:11] <olegfink> ну, то есть, видимо, хочется обращать внимание на то, что никакой "красивости" в подобных местах функциональщина не добавляет, такое же злоупотребление правилами
[01:19:15] ygrek вышел(а) из комнаты
[01:29:55] Typhon вошёл(а) в комнату
[09:33:48] iNode вошёл(а) в комнату
[09:56:00] ygrek вошёл(а) в комнату
[10:38:35] Kakadu вошёл(а) в комнату
[11:50:05] Typhon вышел(а) из комнаты
[11:58:56] <Kakadu> ocamlmklib -o lablqt ml_qpushbutton.o   ml_qlcdnumber.o         ml_qwidget.o ml_qfont.o         ml_qobject.o ml_qapplication.o ml_qscrollbar.o         ml_qlayout.o            ml_vtable.o -L/usr/local/lib -L/usr/lib/ -lqt-mt
/usr/bin/ld: cannot find -lqt-mt
[11:59:17] <Kakadu> надо как-то жестко почитать что эта программа делает и как работает
[11:59:37] <Kakadu> неужели в предыдущих версиях такой параметр был, а сейчас перемтал быть
[12:04:44] ermine вошёл(а) в комнату
[12:06:40] <ygrek> libqt-mt
[12:07:27] <ygrek> пакет libqt3-mt-dev в debian
[12:12:52] <gds> olegfink: тут типовые извраты не являются необходимостью, и логика прослеживается гораздо проще, чем в плюсах (имхо).  Посмотрим с другой стороны, что у нас есть (приблизительно): низкоуровневое (в том числе C, Java), плюсы, которые приспосабливают для высокоуровневого, всякие ML-подобные со статической типизацией, и всякие лиспы/схемы/перлы/козлопитоны со "слабой" типизацией (такой, которую можно порушить).  Соответственно, в низкоуровневом мы не видим типовых извратов, так как инварианты там традиционно размазываются по коду (вместо фиксирования в типах данных) или сконцентрированы в виде набора простых функций.  В плюсах строят из низкоуровневых неподходящих друг к другу кирпичиков высокоуровневый код.  В ML-подобном (хаскель, окамл) мы видим сложные типовые извращения.  В слаботипизированном оформлять типы данных просто не нужны, там они кагбэ определяются использованием кода/данных (не система типов ограничивает использование значений, а автор кода).
Поэтому ты правильно заметил картину, которая получается при взгляде со стороны: плюсы и ML используют сложные типы данных, а в остальных языках этих извратов нет.
[12:15:50] abiogenesis вошёл(а) в комнату
[12:19:10] <Kakadu> ygrek: а что делать, если я хочу чтобы было с qt4?
[12:22:28] <ygrek> скорее всего переписывать, api-то наверняка поменялось
[12:22:43] <Kakadu> ну до этого я догадался
[12:22:59] <Kakadu> я поправил сигнатуры функций
[12:23:07] <Kakadu> теперь надо это скомпилить
[12:23:12] abiogenesis вышел(а) из комнаты
[12:26:09] <Kakadu> kakadu@kakaduVAIO:~/prog/wcaml/qtcaml/trunk/lablqt/src$ make
ocamlmktop -o lablqt lablqt.cma
File "_none_", line 1, characters 0-1:
Error: Error on dynamically loaded library: ./dlllablqt.so: ./dlllablqt.so: undefined symbol: _ZN7QWidget11qt_metacastEPKc
make: *** [lablqt] Error 2
[12:26:19] <olegfink> gds, сложные типы данных и извраты -- это ведь наверное разные вещи?
[12:26:38] <olegfink> хотя, может быть, действительно иначе быть не может
[12:26:42] <Kakadu> надо срочно прокачать знания по линковки в линухах и отжечь)
[12:33:23] <gds> olegfink, интересно, что считать извратами?  фантомные типы -- да, изврат над параметрическими типами.  Частичные сигнатуры -- это что такое вообще?
[12:34:15] <olegfink> http://okmij.org/ftp/Haskell/partial-signatures.lhs
[12:38:34] <gds> прикольная штука :)
[12:59:53] ermine освоила фантомные типы только в одном приминении: для группировки в список, когда в качестве параметра выступает вариант
[13:00:24] <olegfink> gds, прикольная, но просто невероятно похожа на c++
[13:08:45] iNode вышел(а) из комнаты
[13:09:13] iNode вошёл(а) в комнату
[13:11:37] ygrek вышел(а) из комнаты: Replaced by new connection
[13:11:38] ygrek вошёл(а) в комнату
[14:44:01] Kakadu вышел(а) из комнаты
[14:59:38] Kakadu вошёл(а) в комнату
[16:26:42] ygrek вышел(а) из комнаты
[17:05:39] digital_curse вошёл(а) в комнату
[17:10:59] komar вышел(а) из комнаты
[17:11:09] komar вошёл(а) в комнату
[17:37:05] ygrek вошёл(а) в комнату
[18:02:55] serp256 вошёл(а) в комнату
[18:17:09] serp256 вышел(а) из комнаты
[18:19:58] serp256 вошёл(а) в комнату
[18:20:50] serp256 вышел(а) из комнаты
[18:21:48] komar вышел(а) из комнаты
[19:30:13] <ygrek> Kakadu: а ты пробовал убрать -lqt-mt и подставить что-то типа -lQtCore итд по вкусу?
[19:30:37] <ygrek> я так понял ты в сишных биндингах используешь qt4, а слинковаться пытаешься с qt3?
[19:36:29] <Kakadu> да. у меня qt4, и линкуюсь с qt3 потому что не понимаю как слинковаться с qt4
[19:36:58] <Kakadu> вообще у меня с пониманием того как после установки пакета появляется новая опция у линкера сейчас туго
[19:37:58] <Kakadu> ocamlmklib -o lablqt qt.cmo -L/usr/local/lib -L/usr/lib/ -lQtCore
ocamlmktop -o lablqt lablqt.cma
File "_none_", line 1, characters 0-1:
Error: Error on dynamically loaded library: ./dlllablqt.so: ./dlllablqt.so: undefined symbol: _ZNK7QWidget10metaObjectEv
make: *** [lablqt] Error 2
[19:38:45] <Kakadu> в каком мане вообще читать, что можно писать -lQtCore или -lqt-mt ?
[19:40:35] <ygrek> man ld
[19:40:41] <ygrek> это опции линкера
[19:40:58] <ygrek> -lname превращается в libname.so или libname.a (что найдётся первым)
[19:41:10] <ygrek> тебе конечно надо линковаться с qt4
[19:41:32] <ygrek> ищи где определён класс QWidget и линкуйся с той либой
[19:41:44] <ygrek> т.е. логично предположить -lQtGui
[19:42:48] <ygrek> новых опций у линкера не появляется :) он просто ищет библиотеки по имени
[19:44:10] <ygrek> список so-шек в пакете можно посмотреть например dpkg -L libqt4-dev | grep so$
[19:44:46] <Kakadu> ура. теперь другая ошибка более похожая на то, что я криво поправил биндинги. Спасибо!
[19:44:59] <Kakadu> буду развлекаться завтра
[19:45:05] <Kakadu> а может и сегодня
[19:46:30] <ygrek> боюсь что простыми исправлениями на сишной стороне там легко не отделаешься, не зря наверное qt поменяли мажорный номер версии
[19:46:46] <ygrek> буду рад ошибаться конечно :)
[19:47:32] <Kakadu> понятно
[19:49:01] <ermine> шо, появился камлевый биндинг к qt?
[19:49:46] <Kakadu> если какаду будет везти на экзаменах в эту сессию, то может даже этим летом появится
[19:50:04] <ygrek> он давно есть, но его как обычно никто не использует (и не допиливает), а только вопят что его нет
[19:50:20] <Kakadu> это вы про qtcaml?
[19:50:25] <ygrek> ну
[19:50:50] <ygrek> или оно нерабочее?
[19:51:06] <Kakadu> ну оно для qt3.3
[19:51:28] <Kakadu> помню как говорил зимой про всё такое тут
[19:51:42] <Kakadu> кто-то сказал что нормальных юиндингов к qt нет
[19:51:55] <ygrek> ну опера вон до сих пор на qt3 и ничего
[19:51:58] <Kakadu> а qtcaml уже умер и не развивается
[19:52:11] <Kakadu> кажется это был gds :)
[19:52:48] <ygrek> а для qt3 он работает?
[19:52:55] <Kakadu> не проверял
[19:53:19] <ermine> потом какаду перепишет mldonkey на qt
[19:53:31] <Kakadu> сарказм?
[19:53:31] <ygrek> наверное базово работает, просто все хотят сразу готовое на тарелочке
[19:53:34] <ermine> и таким образом ygrek подтянется к поддержке биндинга qt
[19:54:03] <ygrek> у mldonkey gui отдельное (несколько их)
[19:54:08] <ermine> ну сарказм адресован ygrekу
[19:54:22] <ygrek> есть и на qt/c++ - kmldonkey
[19:54:45] <Kakadu> я так понимаю что ygrek разрабатывает этот торрент-клиент?
[19:55:15] <ermine> судя по ченджлогу...
[19:55:16] <ygrek> ermine: я вот краем глаза смотрю на твой mltls для реализации https ;)
[19:56:03] <ermine> ygrek: я после того как подправила его больше не возилась с ним, как-то выпал из практики
[19:56:11] <ygrek> ну это громко сказано, так, патчики закидываю
[19:56:56] <ermine> ygrek: даже в ocsigen используется ocaml-ssl
[19:57:36] <ermine> мне б еще допаять mlzlib и mlresolv
[19:58:08] <ygrek> а какой был резон mltls делать? nih?
[19:58:25] <ermine> starttls
[19:58:40] <ermine> и био
[19:58:46] <ygrek> хотя вообщем для начала digest auth хватит
[19:59:01] <ermine> вот этого в ocaml-ssl нет, там работа с сокетом напрямую и сразу
[19:59:09] <ygrek> bio это какие-то внутренние буферы в openssl? зачем они тебе?
[20:00:16] <ermine> ну не хотела залипать на сокете
[20:00:47] <ygrek> э, а как же ocsigen тогда обходится? у них же всё на lwt
[20:01:09] <ermine> а тогда lwt был еще тот куций и слишком молодой
[20:01:25] <ermine> а вообще надо посмотреть как lwt решает эту задачу
[20:01:30] <ygrek> так lwt от этого не спасает если интерфейс блокирующий
[20:01:35] <ygrek> это как раз проблема
[20:01:39] <ermine> но там до недавнего был только select()
[20:01:44] <ygrek> навернео в пул потоков скидывают
[20:01:55] <ermine> потом появился signalfd, который только в ляликсе есть
[20:01:59] <ygrek> в рассылке недавно были бенчи с epoll'ом - получилось медленней :(
[20:02:04] <ygrek> * :)
[20:02:06] <ermine> что там щас - не смотрела
[20:02:19] <ygrek> signalfd не для этого
[20:03:00] <ermine> ну под бсдей ни еполла, ни сингладфда нет
[20:03:04] <ygrek> для диспатчинга сигналов на fd - а бсд не нужен, ты же знаешь
[20:04:02] <ermine> в ocamlnet тоже open-ssl не прокатил бы в equeue, там залипает, хотя хз как equeue-ssl работает
[20:04:46] <ermine> равно так же меня не устраивает ocamllex и прочие lexing-логика в камле включая camlp4/5
[20:05:31] <ermine> а как диспетчить - пофиг
[20:05:33] <ygrek> асинхронный лексер хочешь, да?
[20:05:53] <ermine> неблокируемый
[20:06:05] <ermine> это будет более правильное слово :)
[20:06:23] <ygrek> не пофиг, если у тебя больше одного потока, и в любом случае асинхронные сигналы никому не нужны - signalfd это логично и удобно
[20:06:48] <ermine> поток - это тред?
[20:06:52] <ygrek> угу
[20:07:14] <ermine> в lablgtk есть то что надо, через glib
[20:07:32] <ermine> там вешаешь вотчер на сокет и читаешь по частям
[20:07:42] <ermine> другое дело, как парсеры к этому относятся
[20:07:50] <ermine> это две разные задницы
[20:08:12] <ygrek> в чём проблема опять таки запихнуть в отдельный поток и складывать токены в отдельную очередь?
[20:08:24] <ermine> я зимой пробовала то, что описано в последнем номере frpog.ru про парсеры
[20:08:59] <ermine> ygrek: ну вот не хотелось разводить многа-многа тредов
[20:09:13] <ygrek> ну многа-многа один
[20:09:48] <ygrek> ну хорошо, не один
[20:10:01] <ygrek> но иногда такое может прокатить
[20:10:17] <ermine> ygrek: многа будет из-за того, что обычные парсеры, как и сам openssl - все блокируют и ждут следующей пачки данных
[20:10:48] <ermine> ocaml-ssl точнее
[20:11:06] <ermine> сам openssl читает сокет как обычная функция read ()
[20:12:02] ermine продолжает рыть в гугле следующее решение на очереднюю задницу в bdb
[20:12:15] <ygrek> с другой стороны ты же парсишь маленькие кусочки данных - т.е. условно можно разделить на пакеты/сообщения - а в таком случае держишь буфер и при поступлении новых данных пускаешь обынчый стнхронный парсер - что распарсил - убираешь, если не распарсил - вернул ошибку - ждёшь больше данных и потом сначала - лишняя работа, но сообщения маленькие поэтому пофиг
[20:13:33] <ermine> ygrek: вот два блока данных "<messa" и "ge>"
[20:14:22] ermine поспорила с одним, что к этому невозможно приучить камлевый Lexing
[20:14:48] <ermine> или Genlex, без разницы
[20:15:11] <ygrek> в чём проблема-то?
[20:15:56] <ermine> ygrek: а как?
[20:17:26] <ermine> ygrek: для Genlex это выглядит как распарсить "1+2+", "2*2"
[20:19:12] <ygrek> во-первых genlex тебе не подходит
[20:19:27] <ygrek> квотирование строк
[20:20:09] <ygrek> во-вторых, я же говорю - при нераспарсенном сообщении - откладываешь его в буфер и retry'ишь при следующем куске данных и так до победного
[20:20:14] <ermine> не, это слишком плохой пример
[20:20:21] <ermine> лучше распарсить float по частям
[20:21:31] <ygrek> абсолютно пофиг, естественно лексер не вернёт float пока не сможет точно определить что он закончился
[20:21:48] <ermine> да пофиг
[20:22:07] <ermine> у меня xml парсер выдавал функцию на следующий символ данных :)
[20:22:28] <gds> всё, что до 1кб длиной, можно парсить так, чтобы выдавать на выходе 'a option, и делать retry в случае если None.
[20:23:31] <ygrek> истинно так
[20:24:15] ygrek тоже парился, хотел http хидеры кусочками парсить, потом исправился
[20:24:44] <gds> но там надо следить, чтобы не было слишком дофига.  вопрос не в производительности, а в безопасности.
[20:31:51] <ermine> я вообще опять хочу переделать свой парсер хмля, а то слишком тормозной
[20:34:32] <ermine> для xml retry будет дороговат
[20:34:50] <ermine> на тэгах каждый символ надо проверить в огромной таблице
[20:41:59] Kakadu вышел(а) из комнаты
[21:51:58] komar вошёл(а) в комнату
[22:07:28] Kakadu вошёл(а) в комнату
[22:10:48] <ygrek> ты померяй сначала :)
[22:10:48] Kakadu вышел(а) из комнаты
[22:11:27] <ygrek> retry-то будет редко и пропорционально длине тэга
[22:15:24] serp256 вошёл(а) в комнату
[22:15:31] serp256 вышел(а) из комнаты
[22:23:15] <gds> ermine: кстати да, в современных процессорах хорошо работает кеширование памяти, так что retry будет включать в себя пачку обращений к одной и той же области памяти, а передача управления в другие "потоки" будет включать в себя загаживание кешей, создание closure на {каждый символ / каждую пачку символов} (не помню, как там у тебя точно), поэтому сходу не скажешь, что лучше.  В целом, имхо, твой текущий подход мне больше нравится, чем 'a option + retry, но реализовывать я бы стал сначала именно 'a option + retry (ибо проще, ибо лень, ибо может и так хватит).
[22:32:31] <ermine> gds: ну вот я попробовала случай с клозурами, оно мне местами понравилось, местами нет, теперь хочу поиграть в другой случай :))
[22:33:35] <gds> так я про то же!  Только интересно будет померять, как оно на практике.  Тебе-то всё равно хочется оба случая поковырять, а так ещё и польза будет в виде бенчмарков.
[22:35:33] ermine дописала кусочек сайта, подергала рефреш в броузере и пошла в гугль искать еще одну теорию
[23:00:39] <ermine> хнык, с теориями, как всегда, хреново
[23:02:43] <ygrek> теоретики как обычно зря гранты проедают, лучше б картошку сажали, дармоеды
[23:14:59] <ermine> не, лучше бы отдали мне гранты на бейлиз
[23:46:00] <ermine> как же это гиморно и некрасивно - как-то запрешать повторный сабмит формы
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!