Home
Objective Caml
ocaml@conference.jabber.ru
Понедельник, 14 сентября 2009< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | release crap
Конфигурация комнаты

GMT+4
[00:31:28] sevenov вышел(а) из комнаты
[01:20:00] 604 вышел(а) из комнаты
[01:51:14] john вышел(а) из комнаты: Replaced by new connection
[01:51:15] john вошёл(а) в комнату
[01:55:35] john вышел(а) из комнаты
[02:26:01] gds вышел(а) из комнаты
[02:29:27] gds вошёл(а) в комнату
[02:30:33] john вошёл(а) в комнату
[05:24:28] john вышел(а) из комнаты
[05:35:20] john вошёл(а) в комнату
[07:45:56] john вышел(а) из комнаты
[07:50:02] john вошёл(а) в комнату
[08:19:07] gds вышел(а) из комнаты
[08:50:17] gds вошёл(а) в комнату
[09:28:51] ygrek вошёл(а) в комнату
[09:29:05] ygrek вышел(а) из комнаты
[09:29:20] ygrek вошёл(а) в комнату
[09:39:15] sceptic вышел(а) из комнаты
[09:41:43] sceptic вошёл(а) в комнату
[10:48:15] f[x] вошёл(а) в комнату
[10:50:29] Typhon вышел(а) из комнаты: Replaced by new connection
[10:50:30] Typhon вошёл(а) в комнату
[10:54:33] <f[x]> ermine: на wheel не смотри - сразу бери json-static
[11:00:26] <f[x]> gds: про пыхпых over caml - у меня опыта делать веб-морды для юзверей нету - не знаком с предметной областью. А вообще идея хорошая, потому что сейчас варианты либо ocsigen для пьяных пионеров (который сразу и весь радикально отличается), либо "набiр кiсток -- склади курку сам" из ocamlnet итд. В то время как всякие питоны вовсю бороздят просторы интернетов.
[11:02:16] <f[x]> 604: бинарник пересобирается быстрее чем пыхпых один запрос обработает :)
[11:03:32] <gds> f[x]: мой опыт -- порядка 5 сайтов. в основном перл, в одном случае ocaml/cgi. не густо. однако я знаю, что было нужно лет пять назад от языка для веба, а дальше уже можно будет прикрутить остальное, как это делается с остальными языками.
[11:09:05] <gds> подобный проект, кстати, задумали с одним хаскеллистом. У них там тоже кизяк, даже покруче ( http://dmzlj.livejournal.com/63116.html , особенно интересно от господина lj\awson).
вот и пишу хреньку для оформления документации поверх s-выражений, чтобы спеку можно было грамотно написать, для обоих языков примерно одинаково (плюс-минус идиоматические различия языков).
[11:10:35] <gds> ещё из ресурсов у меня есть хороший человек, по совместительству -- похапэшник и универсальный комбайн веб-разработки (кроме, пожалуй, концепций дизайна).
[11:11:38] <f[x]> т.е. цель - получить фреймворк?
[11:11:48] <f[x]> а обкатывать на чём?
[11:13:37] <gds> набор библиотек, вспомогательных скриптов.
обкатывать -- на камлунити, конечно :) Кроме того, ещё кое-что надо нарисовать, да и вообще, будут потребности.
[11:16:06] <f[x]> ок
[11:18:05] <gds> в общем, пока с моей стороны план такой. release_crap "ocamllex_utf8_pos", затем займусь хренькой для документации, а там -- как получится.
[11:19:53] f[x] наблюдает
[11:27:03] <gds> опять же, вопрос в том, что предоставлять в качестве интерфейса к бд. (это -- один из обязательных пунктов для юзабельности, наряду с шаблонизатором)
[11:29:48] john вышел(а) из комнаты
[11:31:52] <f[x]> очевидно для всех сразу не угодишь, наверное надо набор уровней - raw, общий ocamldbi, простой orm для простых нужд
[11:37:32] <gds> насчёт типа-orm -- твой sqlgg будет хорош, как я понимаю.
raw тоже обязательно -- механизмы работы с транзакциями, bind variables и всякой спецификой везде разные таки.
а вот что в качестве промежуточного -- без понятия. ocamldbi взять за основу, допилить bind variables, налепить "драйверов" (dbi -- database interface, dbd -- database driver) по потребностям?
[11:41:19] <f[x]> sqlgg это orm в обратную сторону. нужен и обычный - чтобы sql руками не писать. насчёт конкретно ocamldbi я не в курсе, но общий уровень по выполнению запросов и получению результатов должен быть.
[11:42:03] <f[x]> типа jdbc/odbc со всем присущими недостатками
[11:43:58] ygrek вышел(а) из комнаты
[11:44:31] <gds> вот именно, или типа dbi перлячего. чтобы 90% sql'я выполнялось на отличненько.
[11:49:28] <gds> не совсем кстати, но проверил на практике одну штуку. camlp4 -I c:\dir -- ищет ок, camlp4 -I c:/dir -- не ищет. изучил код (ocamlsources/camlp4/Camlp4/Struct/DynLoader.ml, функция find_in_path), прогнал вручную -- должно искать, гадина этакая. Как бы полегче отдебажить это дело? пока думаю дописывать в файл (c:\log.txt например) все результаты всех проверок, и вообще натыкать туда отладочной печати. Есть идеи попроще?
[12:59:28] Typhon вышел(а) из комнаты
[13:03:11] sevenov вошёл(а) в комнату
[13:07:54] Typhon вошёл(а) в комнату
[13:09:12] <ermine> f[x]: а я прицепила именно wheel - первым в гугле находится
[13:09:39] <ermine> а static парсит строчку с json?
[13:12:55] <ermine> шас его попробуем
[13:16:58] <f[x]> static это надстройка над wheel
[13:17:22] <ermine> гм
[13:17:41] <ermine> я щас гуглевские плагины в сульце перевожу на json-интерфейс
[13:17:51] <ermine> soap похоже они прикрыли
[13:35:46] sevenov вышел(а) из комнаты
[13:38:56] sevenov вошёл(а) в комнату
[13:40:34] sevenov вышел(а) из комнаты
[14:35:48] <gds> find_in_path, checking "d;c:\\msys\\gds\\dev\\overbld\\b20090914\\lib\\deriving\\syntax\\utils.cmo"
где-то какой-то засранец разбивает "d:/gds/dev/ov..." на два пути.
где-то 2 часа на цикл отладки. поехали дальше.
[14:51:42] <f[x]> а префикс msys откуда? какая-то mingw утилита?
[14:52:39] <gds> c:\msys -- там стоит непосредственно msys, предоставляет кучу гнутых утилит, работает совместно с mingw.
[15:00:53] <f[x]> я понимаю, непонятно зачем его приписывать
[15:01:11] <gds> +1
[15:03:17] <gds> вот что выполняется:
ocamlfind ocamldep -pp "camlp4r -I d:/gds/dev/overbld/b20090914/lib/deriving/syntax utils.cmo type.cmo base.cmo id.cmo extend.cmo show_class.cmo" -modules test_uhack.ml > test_uhack.ml.depends
если слеши в пути заменить на обратные, всё работает.
поставил отладочную печать на добавление инклуд-директории. бисекцией дихотомирую!
[15:33:38] <f[x]> btw thread pool'ы --> http://raevnos.pennmush.org/code/ethread/index.html
[15:38:23] <gds> нет возможности слать броадкасты рабочим тредам (например, на случай остановки). а в остальном -- прилично.
[15:43:01] <f[x]> учти время выпуска
[15:43:18] <f[x]> btw небольшое обсуждение ocamldbi --> http://alan.petitepomme.net/cwn/2004.02.03.html
[15:47:28] <gds> "Released 2-22-06" -- дату не понял. 2002 или 2006?
[15:49:06] <f[x]> 2006
[15:50:00] <gds> "I hope we get a really good generic DBMS layer soon."
дада
[15:50:08] <gds> обсуждения почитал, всё правильно.
[16:05:34] <f[x]> http://paste.defun.ru/m52604658
[16:06:08] <f[x]> после этого нагружаю siege -b -c20 -t40s localhost:8080
[16:08:12] <f[x]> siege заканчивается, процесс начинает разгребает висящие соединения (штук 5), делает write, получает EPIPE и переходит к следующему, до тех пор пока не натыкается на такое соединение :
$ sudo netstat -tpn | grep 10000
tcp 537 0 127.0.0.1:10000 127.0.0.1:41214 CLOSE_WAIT -
tcp 0 0 127.0.0.1:10000 127.0.0.1:36257 ESTABLISHED 25161/fcgi.native
[16:08:30] <f[x]> второе из них, другого конца соединения нету
[16:08:42] <f[x]> accept(3, {sa_family=AF_INET, sin_port=htons(36257), sin_addr=inet_addr("127.0.0.1")}, [11640960620412534800]) = 4
read(4,
[16:08:55] <f[x]> и висим-с
[16:09:14] <f[x]> я лузер, но что делать?
[16:26:16] ygrek вошёл(а) в комнату
[16:47:56] <gds> а у меня раскопки с camlp4 плавно переключились на findlib, а оттуда -- на ocamlbuild.
насчёт tcp -- никаких идей.
[16:49:07] <f[x]> идея тупая -- поставить таймаут на сокет, пересобираю камлонет.
[16:50:21] <gds> так интересны причины. почему оно вообще read делает.
[16:50:34] <f[x]> тут всё ок
[16:50:42] <f[x]> получило сокет по accept'у и полезло читать
[16:51:06] <f[x]> меня волнует другое, какого фига вообще существует сокет в ESTABLISHED у которого другой конец отвалился уже
[16:51:54] <gds> на случай, если сервер на ноутбуке, а ноутбук схлопнули. очнётся от хибернейта -- продолжит общение.
[16:52:49] <f[x]> ыы?
[16:52:56] <f[x]> т.е. это нормальная ситуация по-твоему?
[16:53:35] <gds> смотря какой протокол :) вообще, в современных реалиях, как-то не очень.
единственное, что кошерное советуют на этот случай, это предусмотреть в протоколе пинги, если живость важна.
насчёт таймаутов вот ничего не скажу -- работал с ними из цэ.
[16:54:36] <f[x]> даже в таком случае ядро то это знает и знает что если мы читаем - то надо посылать eof, а не блокать
[16:55:06] <gds> в пределах локалхоста -- однозначно eof давать надо.
[16:55:21] <gds> но "надо" -- это слишком декларативное мыслеизречение.
[17:05:01] <f[x]> мда, с таймаутом - read отваливается с EAGAIN, дальше висит select по этому сокету
[17:07:26] <gds> видимо где-то в другом месте таймаут надо крутить. чтобы при его достижении оно закрывало сокет.
[17:21:48] ygrek вышел(а) из комнаты
[17:26:43] ermine непного потупила с json-static
[17:26:52] <ermine> не пойму как его применить таки
[17:28:15] <ermine> f[x]: ты силен в json-static?
[17:32:15] gds вышел(а) из комнаты
[17:33:57] <f[x]> использовал
[17:34:36] <f[x]> type json schema = < schema "schema" : < items "items" : item list > >
and item = < .... >
let of_string s =
try
s >> Json_io.json_of_string >> schema_of_json >> some
with
_ -> None
[17:37:09] <ermine> а что значит schema "schema"?
[17:37:35] <ermine> типа {"schema", {...}}?
[17:37:40] <f[x]> в кавычках json-имя, без кавычек имя метода в камлевском объекте
[17:46:19] <ermine> а как бы оформить (string * string) list? ({"abc":"def", "qwe":"zzz"})
[17:50:25] <f[x]> это объект
[17:50:51] <f[x]> ассоциативный list будет [["abc";"def"];["qwe";"zzz"]]
[17:51:21] <ermine> не
[17:51:31] <ermine> ладно, оформляю как рекорд, хотя и лениво
[17:53:24] sceptic вышел(а) из комнаты
[17:53:42] <ermine> без json-static я с этим как с хэштаблицой работала
[17:59:45] <f[x]> ну если удобней динамически - то почему бы и нет
[18:00:13] <f[x]> обычно если схема известна заранее то статически проще - парсинг и валидация получаются забесплатно
[18:04:46] gds вошёл(а) в комнату
[18:05:33] <ermine> единственное что бесит - это ругательство препроцессора с ошибкой на строке 1, символы 0-1
[18:07:17] f[x] снял tcpdump..
[18:07:56] <gds> f[x]: интересненько, и что там?
[18:08:57] <ermine> а там - мушки
[18:09:33] <gds> отдельно от котлеточек?
[18:11:38] <f[x]> gds: не пойми что, nginx данные посылает, а fcgi на все попытки отвечает SYN ACK
[18:11:50] <f[x]> потом в конце со стороны nginx'а RST
[18:12:04] <f[x]> и как это всё интерпертировать = хз
[18:12:50] <gds> чувствую, мне пригодится инфа об этом. пошёл читать.
ибо тот же nginx + fastcgi будет.
[18:19:09] <f[x]> попробуй запустить мой пример у себя
[18:20:34] sceptic вошёл(а) в комнату
[18:21:33] sceptic вышел(а) из комнаты
[18:21:41] sceptic вошёл(а) в комнату
[18:21:47] <gds> пока читаю.
а как связан размер посылаемого пакета и MTU интерфейса? По идее, пакет + заголовок должно быть меньше MTU.
[18:23:02] <ermine> о, наконец скомпилилась схема json, интересно, будет ли работать
[18:23:28] <ermine> жалко что подобный метод плохо применим к описанию схемы xml
[18:24:48] <f[x]> gds: без понятия
[18:25:03] <f[x]> ermine: почему?
[18:26:01] <gds> в tcpdump есть размер пакета (на который fcgi отвечает SYN ACK), в `ifconfig` есть MTU интерфейса.
пока читаю дальше.
[18:26:31] <ermine> f[x]: ну тут описано как извлечь 1:1 данные из json, в xml надо проверить "а если тут пусто, то поискать проверить там, а если этот флаг равен 1, то извлечь тут"
[18:27:25] <ermine> добавить туда sequence, choice, group и тп
[18:27:39] <ermine> и minOccurs, maxOccurs
[18:28:10] <ermine> ну может через полгода дозрею, а сейчас бы дописать классический парсер xml schema
[18:28:38] <f[x]> по-моему вполне реально
[18:28:43] <f[x]> сложнее конечно
[18:29:52] <gds> f[x]: а покажи tcpdump по нужному соединению (по нему всему), если не лень.
[18:30:12] <f[x]> gds: localhost mtu 16K, а максимальный пакет был 594 байт
[18:30:19] <f[x]> момент
[18:30:41] <gds> точно не mtu :)
[18:35:25] <f[x]> http://ygrek.org.ua/files/fcgi.dump
[18:42:44] <ermine> а там точно не premature end?
[18:46:59] <ermine> а оно бы выдало content-length?
[18:47:29] <ermine> вроде должно быть или длина, или connection-close
[18:50:15] <f[x]> до http дело не доходит
[19:00:31] <sceptic> А как сейчас с собирабельностью sulci из git дела обстоят?
[19:03:41] f[x] desperately ищет тусовку tcp-гуру
[19:31:17] f[x] вышел(а) из комнаты
[19:55:24] ermine разобралась с генератором кода для json, круто
[20:25:11] Typhon вышел(а) из комнаты
[20:28:05] <gds> f[x]: втыкаю в доки.
если смотреть по
$ tcpdump -X -r fcgi.dump 'tcp and (src port 55423 or dst port 55423)' | less
, то видно, что сетевой стек несколько раз пытался присунуть запрос (безучастно со стороны siege из-за PUSH, предполагаю; с 17:21:24.494235 по 17:22:16.511145), далее в 17:22:16.551138 окамлнет сказал "данные принял!", в 17:24:24.487317 отправил ответ, а в 17:24:24.487332 nginx подумал, что сокет слегка протух.
помог таки гугель. http://www.lexa.ru/nginx-ru/msg13587.html -- там сказано, что nginx имеет право на такой фокус.
остаётся разобраться, почему окамлнет так долго ждал, пока зашедулится read(). Может тупо завалило?
[20:40:47] <ermine> ocsigen!
[20:40:57] <gds> php!111
[20:41:04] <gds> страшно?
[20:41:13] <ermine> а шедулится не read(), а unixequeue
[20:41:44] <ermine> в нём и копаааайтесь
[20:42:14] <gds> ты смотришь на пользователей окамлнет как на говно? :]
[21:32:05] Typhon вошёл(а) в комнату
[21:56:39] <ermine> gds: типа в чужом кармане не копаются?
[22:00:02] <gds> в чужом кармане копаются, я не моралофаг.
скорее чувствуется презрительная интонация в стиле "пользуете кал -- разгребайте его, хаха"
[22:06:05] <gds> кстати, прекрасно понимаю :) но ocsigen -- это слишком круто. я лошара для таких мощьни технологий.
[23:05:01] DimitryKakadu вошёл(а) в комнату
[23:08:44] <DimitryKakadu> тут с потоками какие-то непонятки. если ввести в "интерпретаторе" ocaml
<[ ]>;; (* ОН ругается*)
[23:09:40] <DimitryKakadu> пытаюсь скомпилить примеры из статей, на этом спотыкаюсь
[23:13:48] <DimitryKakadu> ooo узнал что гадо подключать camlp4
[23:13:54] <DimitryKakadu> буду курить
[23:14:45] <gds> #load "dynlink.cma";;
#load "camlp4o.cma";;
[< >];;
[23:32:58] DimitryKakadu вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!