Home
Objective Caml
ocaml@conference.jabber.ru
Воскресенье, 20 февраля 2011< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Вики -- http://gdsfh.dyndns.org/kamlo/ | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв, move on
Конфигурация комнаты
Участники комнаты

GMT+3
[00:34:49] <ygrek> аргх, такое впечатление что большую часть ragel тоже генерировали
[00:34:55] <ygrek> копипастом
[00:37:40] <ygrek> > fork: Cannot allocate memory
ы?
[00:37:56] <superbobry> да я пересобрал rpmку, думаю поможет
[00:39:39] <ygrek> напоминает багу с aslr и камлевым page table
[00:40:15] superbobry не в танке
[00:43:27] Kakadu вышел(а) из комнаты
[00:47:04] <ygrek> - New implementation of the page table describing the heap (two-level
  array in 32 bits, sparse hashtable in 64 bits), fixes issues with address
  space randomization on 64-bit OS (PR#4448).
[00:47:24] <ygrek> а, хотя это в 3.11.0 уже было
[00:47:45] <ygrek> стрейсни тогда
[00:55:48] <superbobry> ygrek: не подскажешь что за либа такая type-conv
[00:55:55] <superbobry> что то не могу нагуглить сайта с исходниками
[00:56:45] <ygrek> ocaml.info
[00:57:27] <ygrek> первый линк в гугле o_O
[00:57:57] <superbobry> офигеть, гугл меня покинул
[01:14:42] Typhon вышел(а) из комнаты
[01:15:31] superbobry вышел(а) из комнаты
[01:18:00] ygrek вышел(а) из комнаты
[02:48:32] zert вышел(а) из комнаты
[03:18:20] Typhon вошёл(а) в комнату
[05:12:42] Typhon вышел(а) из комнаты
[08:39:40] komar вышел(а) из комнаты: Replaced by new connection
[08:39:41] komar вошёл(а) в комнату
[10:42:08] Kakadu вошёл(а) в комнату
[10:42:45] Kakadu вышел(а) из комнаты
[10:43:50] Kakadu вошёл(а) в комнату
[11:20:37] ygrek вошёл(а) в комнату
[11:33:22] <gds> сейчас текущий затык с параллельным велосипедом такой: представим гетерогенную среду, где нельзя передать на выполнение closure, так как адреса в коде явно не совпадают (и, допустим даже, код слегка отличается), но, в остальном, программы похожи/одинаковы в плане работы с этим сообщением.  И нужно как-то типизировать передаваемые сообщения, чтобы функция, принимающая сообщение, знала, какого оно типа -- то есть, принимала только свои сообщения (1).  Либо же, с другой стороны, можно передавать всегда поток байтов, но заставить каждую функцию указать свой [де]сериализатор, указанием которого и функция будет знать свои типы, и будет способ преобразовывать потоки байтов в значения своих типов (2), но остаётся проблема поиска нужной функции в зависимости от потока байтов.
(1) -- например, можно где-нибудь держать большой полиморфный тип all_messages = [ `Msg1 of int | `Msg2 of string ], и  где-нибудь регистрировать функции, фактически только проверяющие тег на равенство и запускающие функции, принимающие сообщения: try_msg1 m = match m with [ `Msg1 x -> received_msg1_with_int x | _ -> raise Не_то ].  Не нравится тем, что нужно глобальный тип делать со всеми сообщениями, которые программа принимает.
(2) -- тот же "глобальный реестр", но с проверкой не по тегу полиморфного варианта, а по какому-нибудь другому идентификатору.  Проблема будет не в том, какой тип, а в том, какому обработчику передать данное сообщение.
Например, можно регистрировать именованный обработчик сообщений, но этот путь не защищает от ошибок: можно в разных ветках программы зарегистрировать обработчик с одним и тем же именем, но с разными типами.
Но, с другой стороны, сильно задрачиваться на корректности я не могу (так как время) и не хочу (так как потребуется научиться уметь препроцессор).
Какие идеи по этому вопросу есть?
[11:50:51] Typhon вошёл(а) в комнату
[12:05:35] zert вошёл(а) в комнату
[12:21:13] <gds> zert: а подскажи пожалуйста, как в эрланге эта фигня решена?  То есть, как виртуальная машина(?) понимает, какой функцией должно быть обработано сообщение, пришедшее из сети с другого хоста?
[12:24:52] <zert> это как?
[12:25:11] <zert> есть ерланговый протокол, его обработчик висит на определённом порту
[12:25:15] <Typhon> там же пиды есть и пидам отправляются сообщения
[12:25:20] <zert> всё, что туда попало, обрабатывается этой функцией
[12:26:27] <zert> изначально на каждом хосте есть EPMD — port mapper daemon, который висит на 4369 порту. при запуске ВМ на этом хосте, она говорит EPMD своё имя, и номер порта, на котором висит
[12:27:08] <zert> потом при поиске нужной виртуалки, нода сначала резолвит хост, цепляется к EPMD на этом хосте, спрашивает у него имя конкретной ноды, он отвечает значением её порта
[12:27:18] <zert> и удалённая нода цепляется к ноде напрямую
[12:28:21] <zert> посылает пакет, он принимается, десериализуется, оттуда извлекаются идентификатор процесса-цели и непосредственно сообщение
[12:29:09] <gds> во, про идентификатор процесса-цели интересно -- откуда его узнаЮт те, кто на другой ноде крутится?
[12:29:25] <zert> им о них кто-то говорит :)
[12:30:51] <gds> кто бы это мог быть в среднем случае?  например, если хочу распараллелить вычисление чего-то хитрого на несколько хостов.
[12:32:01] <zert> само значение Pid содержит в себе имя ноды
[12:32:22] <zert> его можно зарегистрировать глобально под каким-то именем, либо просто передать на другую ноду
[12:34:00] <zert> %% Запустили ноду с именем test@localhost:
[zert@zert]:~ $>> erl -sname test@localhost
Erlang R14B01 (erts-5.8.2) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.2  (abort with ^G)
%% Присвоили Pid значение <0.15.0> (процесс с таким идентификатором уже есть в системе после запуска)
(test@localhost)1> Pid = pid(0,15,0).
<0.15.0>
%% Сериализуем его
(test@localhost)2> term_to_binary(Pid).
<<131,103,100,0,14,116,101,115,116,64,108,111,99,97,108,
  104,111,115,116,0,0,0,15,0,0,0,0,2>>
%% Выцепляем «на глаз» значение имени ноды
(test@localhost)3> [116,101,115,116,64,108,111,99,97,108,104,111,115,116].
"test@localhost"
[12:36:04] <zert> с помощью функции global:register_name(Name, Pid) можно зарегать процесс под определённым именем, и всем нодам сразу же пошлётся оповещение об этом
[12:36:24] <zert> и они смогут резолвить это имя в идентификатор процесса
[12:38:17] <zert> а можно значение идентификатора получать при вызове rpc:call(Node, Module, Function, Args)
[12:39:00] <zert> если эта функция создаст на заданой ноде процесс, и вернёт его идентификатор, то этому процессу мы можем посылать сообщения так, как если бы он находился на нашей локальной ноде
[12:42:47] <zert> т.е. тебе подойдёт как раз последний случай, с помощью rpc:call
[12:44:21] <gds> всё понял.  Я теперь почти знаю эрланг уже :]
Теперь осталось накамлать это.  Точнее, с адресацией/пидами более-менее понятно, что делать, а вот с типами всё ещё лажа.
[12:45:34] <zert> пересылай кортежи с полуморфными вариантами
[12:51:47] <ygrek> йоу, камлевый flat сканер (-F0) быстрее чем go-шный goto-сканер (-G2)
[13:04:44] Typhon вышел(а) из комнаты
[13:42:36] <gds> zert: ага, про полиморфные варианты для идентификации -- идея таки.  Но с типизацией -- опять непонятно.
Можно заставить пользователей всегда описывать открытые вариантные типы при приёме сообщений, как тут: http://pastebin.com/Lem1abrz , но непонятно, как это форсировать.
Потому что если кодогенерилка будет знать, что вариант закрытый, а на самом деле дадут неожиданный вариант, то код пойдёт не в ту ветку match'а и очень вероятно приведёт к сегфолту.
Можно было бы использовать исключения тут (матчинг по ним всегда обязан быть открытым), но есть известная запись в мантисе, которая сводится к "Troubles with marshaled/unmarshaled exception" -> "The short answer is: don't marshal exceptions.".
[13:54:33] superbobry вошёл(а) в комнату
[13:55:57] <gds> в общем, не буду заморачиваться.  Несегфолтящая десериализация у нас есть уже хрен знает сколько времени, начиная с s-выражений и заканчивая всякими гламурными бинарными форматами.  В первом приближении будет вот такая вот сериализация оборачивать функцию, работающую непосредственно с типизированными значениями.
[13:59:12] komar вышел(а) из комнаты
[14:07:28] superbobry вышел(а) из комнаты
[14:14:12] arhibot вошёл(а) в комнату
[14:35:24] arhibot вышел(а) из комнаты
[14:37:40] <gds> такая вот фигня обнаружилась в байткоде.  Есть библиотека unix.cma, сишное там объявлено как extern, все дела, но оказалось (теперь уже точно проверил), что переменная, хранящая глобальное состояние, разная.  Отладочной печатью смотрел (unsigned long)(&var) -- в случае записи в неё, кодом "Unix.openfile" -- значение 660CF048, при чтении (окамловский код -- Bigarray.Array1.map_file) -- 6880A028.  В тегах стоит "use_unix, use_bigarray".  Получается, разные экземпляры dllunix.dll?  Но что за хрень?
[14:40:22] <ygrek> какое глобальное состояние?
[14:41:39] arhibot вошёл(а) в комнату
[14:43:59] superbobry вошёл(а) в комнату
[14:51:41] <gds> соответствия int handle -> struct file_descr, массив.
[14:52:47] <ygrek> а собери -verbose -ccopt -v
[14:53:02] <ygrek> может cma влинковывается два раза?
[14:59:27] <gds> не понимаю, как посмотреть.  "ocamlbuild -log lo -lflags -verbose,-ccopt,-v test" -- в логе показывает "ocamlc -verbose -ccopt -v unix.cma bigarray.cma test.cmo -o test.byte", но больше ничего.
[15:03:31] <gds> и да, сам "ocamlc -verbose -cclib -v unix.cma bigarray.cma test.cmo -o test.byte" тоже не выдаёт ничего.  Ну логично, "-verbose" печатает внешние команды, а тут всё обходится без них вполне прилично.
[15:03:58] <ygrek> хм, да
[15:05:24] <ygrek> ocamlobjinfo bigarray.cma ?
[15:05:40] <ygrek> если в него unix влинкован то будут сишные примитивы видны
[15:08:01] arhibot вышел(а) из комнаты
[15:08:03] <gds> в секции "Primitives declared in this module" -- всё только caml_ba_xxx и %identity, никаких отсылок на unix-функции.  А в "Interfaces imported" -- есть unix.  Если что, вот полный вывод: http://pastebin.com/Y40cTYB6
[15:09:11] <ygrek> это норм
[15:10:02] <gds> конкретно для этого случая, может быть, можно было бы через named values попробовать, но это же жестоко в общем случае.
[15:20:52] <Kakadu> gds: а какая тула такой лог выводит?
[15:22:25] <gds> ocamlobjinfo, ровно как ygrek выше написал.
[15:22:37] <Kakadu> ой
[15:22:52] <gds> я бы не додумался применить её в данном случае.  Да и вообще, случай какой-то дебильный.
[15:23:02] <Kakadu> а откуда она берется?
[15:23:23] ygrek вышел(а) из комнаты
[15:25:13] arhibot вошёл(а) в комнату
[15:25:14] <gds> изначально -- компилируется при компиляции окамла из ocamlsources/tools/objinfo.ml
[15:25:26] <Kakadu> угу
[15:25:34] <Kakadu> перекомпиляю камло ещё раз
[15:26:02] <gds> а, оно появилось в 3.12, может в этом дело.
[15:26:10] <gds> New tool:
- ocamlobjinfo: displays various information, esp. dependencies, for
  compiled OCaml files (.cmi, .cmo, .cma, .cmx, .cmxa, .cmxs, and bytecode
  executables).  Extends and makes more official the old objinfo tool
  that was installed by some OCaml packages.
[15:35:37] <Kakadu> да, дело в этом
[15:50:48] superbobry вышел(а) из комнаты
[15:51:56] arhibot вышел(а) из комнаты
[16:02:23] superbobry вошёл(а) в комнату
[16:38:27] superbobry вышел(а) из комнаты
[16:39:23] superbobry вошёл(а) в комнату
[17:21:05] iNode вошёл(а) в комнату
[17:21:15] superbobry вышел(а) из комнаты
[17:34:43] komar вошёл(а) в комнату
[18:22:30] ermine вошёл(а) в комнату
[18:40:58] superbobry вошёл(а) в комнату
[18:42:58] superbobry вышел(а) из комнаты
[18:43:01] superbobry вошёл(а) в комнату
[19:47:25] ftrvxmtrx вышел(а) из комнаты
[19:49:43] ftrvxmtrx вошёл(а) в комнату
[19:59:13] ftrvxmtrx вышел(а) из комнаты
[19:59:53] ftrvxmtrx вошёл(а) в комнату
[20:03:05] ftrvxmtrx вышел(а) из комнаты
[20:05:56] ftrvxmtrx вошёл(а) в комнату
[20:30:28] superbobry вышел(а) из комнаты
[20:36:11] superbobry вошёл(а) в комнату
[20:50:26] Typhon вошёл(а) в комнату
[21:28:31] superbobry вошёл(а) в комнату
[21:28:33] ermine вошёл(а) в комнату
[21:34:23] Kakadu вошёл(а) в комнату
[21:39:27] superbobry вышел(а) из комнаты
[21:43:16] superbobry вошёл(а) в комнату
[21:43:26] komar вошёл(а) в комнату
[21:43:35] Kakadu вышел(а) из комнаты
[21:44:06] ermine вышел(а) из комнаты
[21:44:10] superbobry изменил(а) имя на superbobry@jabber.ru
[21:44:15] superbobry@jabber.ru вышел(а) из комнаты
[21:44:17] arhibot вошёл(а) в комнату
[21:44:22] ermine вошёл(а) в комнату
[21:44:48] superbobry вошёл(а) в комнату
[21:45:11] arhibot вышел(а) из комнаты
[21:46:18] <superbobry> товарищи, наверное заезженый вопрос, почему true а не True?
[21:49:48] Typhon вошёл(а) в комнату
[21:50:36] <komar> superbobry: уже True.
[21:50:52] <komar> http://caml.inria.fr/pub/docs/manual-camlp4/manual007.html
[21:51:02] <komar> > The predefined constructors ``True'' and ``False'' start with an uppercase letter.
[21:51:09] <superbobry> # True;;
Error: Unbound constructor True
[21:51:31] <komar> > Chapter 6     The Revised syntax
[21:52:19] <superbobry> не очень понятно какой у этого всего статус
[21:52:25] <superbobry> оно implemented?
[21:52:39] <komar> Да, только опционально.
[21:52:49] <superbobry> ключик какой нить надо передавать?
[21:53:19] <Typhon> #use "topfind";
#camlp4r;;
емнип, в топ левеле
[22:01:13] <superbobry> Typhon: я правильно понимаю что tuareg его не умеет?
[22:01:54] <Typhon> да, надо искать в мейллисте, были какие-то подвижки на эту тему или попинать gds, он пользуется revised, может у него что-то завалялось
[22:04:23] <superbobry> ок, спасибо
[22:17:22] ftrvxmtrx вошёл(а) в комнату
[22:26:03] Typhon вышел(а) из комнаты
[22:27:44] ygrek вошёл(а) в комнату
[22:48:41] superbobry вышел(а) из комнаты
[22:49:11] superbobry вошёл(а) в комнату
[23:05:41] ygrek вышел(а) из комнаты
[23:05:45] ygrek вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!