Home
Objective Caml
ocaml@conference.jabber.ru
Пятница, 29 апреля 2011< ^ >
gds установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Светлое будущее -- http://camlunity.ru/ | Нефильтрованное настоящее -- https://github.com/camlunity/kamlo_wiki | Портер прошлое -- http://gdsfh.dyndns.org/kamlo/ | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв, move on
Конфигурация комнаты
Участники комнаты

GMT+4
[00:09:34] <ygrek> http://www.pps.jussieu.fr/~gimenez/laby/
[00:14:10] gds вышел(а) из комнаты
[00:28:58] ermine вышел(а) из комнаты
[00:38:08] <Kakadu> ygrek: прикольная фигня
[00:57:26] Kakadu вышел(а) из комнаты
[01:01:41] <ygrek> шорт, rproust спалил camlunity в irc
[01:01:50] Typhon чувствует себе каким-то киссинджером недоделанным -- послал письма авторам двух форков ocaml-uint, чтобы они как-то смерджили, вроде конфликтов нету
[01:01:57] <Typhon> ygrek, опа, как ? :-)
[01:02:11] <Typhon> я видел пара человек стали смотреть за wysiwiki
[01:04:56] <ygrek> Typhon: http://tunes.org/~nef/logs/ocaml/11.04.28
[01:05:30] <Typhon> :D отличный ответ!
[01:06:20] ygrek off
[01:08:09] <Typhon> глянул Array.append -- правильно понимаю, что сложность линейная там?
[01:12:17] <superbobry> товарищи, а как бы мне max int получить?
[01:12:22] <superbobry> думал в Sys есть, а фиквам
[01:13:33] <superbobry> ох йо, в pervasives же есть :)
[01:14:54] ygrek вышел(а) из комнаты
[01:20:24] <Typhon> интересно, зачем тебе? :-)
[01:22:28] <superbobry> List.fold_left min :)
[01:23:42] <superbobry> кстати я правильно понимаю что умножение никак не выдернуть?
[01:23:54] <superbobry> (*) -- считается за начало комментария
[01:24:50] <komar> Бида.
[01:35:19] <Typhon> ( * )
[01:35:31] <Typhon> вообще, обычно пробелы вокруг операторов в скобках ставят
[01:35:54] <Typhon> btw, Error: This expression has type mcs/7823 array              
       but an expression was expected of type mcs/7985 array -- раньше не писали ид в этой ошибке, теперь у начинающих должно меньше недоумения быть!
[01:39:26] <superbobry> Typhon, спасибо :)
[02:12:01] <Typhon> выпилил зависимость от батареек -- спас котёнка!
[02:15:09] zert вышел(а) из комнаты
[03:11:51] Typhon вышел(а) из комнаты
[03:17:03] Typhon вошёл(а) в комнату
[03:18:19] <Typhon> ответы на предложения смёрджить веточки:
от форка "Makes sense, I'll try to promote them."
от оригинала "That patch doesn't seem necessary to me. It creates comparison operators inside the Uint32 module, but that isn't really necessary because OCaml's built-in comparison operators work fine."
-- как дальше жить? :-(
ну, надеюсь, что с пул реквест то он примет -- там теперь одним кликом можно делать же :-)
[03:18:27] Typhon вышел(а) из комнаты
[08:06:11] iNode вошёл(а) в комнату
[08:57:00] gds вошёл(а) в комнату
[09:59:36] ygrek вошёл(а) в комнату
[10:10:28] ygrek вышел(а) из комнаты
[10:23:57] ygrek вошёл(а) в комнату
[10:26:51] ygrek вышел(а) из комнаты
[10:26:57] ygrek вошёл(а) в комнату
[11:25:27] komar вышел(а) из комнаты: Replaced by new connection
[11:25:27] komar вошёл(а) в комнату
[11:40:52] ygrek вышел(а) из комнаты
[11:45:20] komar вышел(а) из комнаты
[11:50:21] iNode вышел(а) из комнаты
[11:54:07] iNode вошёл(а) в комнату
[11:55:41] Typhon вошёл(а) в комнату
[12:05:48] <gds> про парвел.  Понял, что нужно где-то регистрировать именованные типы, рядом с функциями для сериализации-десериализации.  Хотя бы для человеческих сообщений об ошибках.  и, да, это не гарантия успешной типизации, и coding guide больше, но лучше, чем ничего.  Но вот не знаю, надо ли как-то выносить отдельно версионность.  Сходу -- было бы удобно.  И даже двухуровневую.  maj_ver:int, min_ver:int.  Если maj_ver совпадают, то десериализация в такую же или в бОльшую min_ver прокатит успешно.  Некоторые json поддерживают такую "подтипизацию" (грубо говоря), ну а в случае маршаллинга -- только maj_ver увеличивать.
[12:08:31] ermine вошёл(а) в комнату
[12:26:16] <Typhon> gds: а функциям версии не собираешься проставлять? вообще, версии для типов звучат разумно ( можно даже мин_вер выкинуть, наверное? ),
[12:29:20] <Typhon> вот люди пошли — https://github.com/andrenth/ocaml-uint/pull/2 —  им патчи дают, а они брать не хотят
[12:31:19] zert вошёл(а) в комнату
[12:32:22] <gds> Typhon: версии функций?  Если шутка, то понял.  Если по серьёзу, то расскажи, зачем.  Как-то связать с версиями типов?
[12:33:19] komar вошёл(а) в комнату
[12:35:01] <Typhon> если я тип поменял, то может и функции сериализации/десереализации могут поменяться (но это врядли, если он чоткие). но рабочие ли функции, которые ждут значения типа предыдущей версии, что будут делать с новой версией типа? или я как-то механизм не так понял, и до функции старой такой тип не дойдёт?
[12:35:15] <gds> min_ver -- если функциям дать версии, то min_ver не нужно, и функция сама как-то определит на основании версии, может ли она его десериализовать или нет.
[12:36:07] <gds> не обязательно функции останутся прежними -- например, если функции мономорфные, рассчитанные на эффективную передачу значений определённого типа, то это просто замечательно, пусть используются.
[12:44:16] <gds> про механизм -- их два прозвучало.  моё предложение: maj+min, версии сверяются до десериализации, в плохом случае отлуп.  твоё предложение, как я понял, состоит в том, чтобы привязать версии к типам и к функциям (либо просто обрабатывать их в функциях) так, чтобы всё было грамотно.
Моё предложение кривое, ибо я не думал про версионные функции.  А на самом деле ведь можно и накрутить, и кошерно.
Тут две проблемы: с самой сериализацией первая, и с эволюцией типов вторая.  Во многих случаях есть мономорфизм от старого типа к новому, и это полезно для эволюции типов.
Подумаем?
[12:49:01] Kakadu вошёл(а) в комнату
[12:50:36] <Typhon> я пока не пойму, зачем может понадобиться эволюция типов без эволюции кода? ну то есть, есть, наверное, какие-то функции, которые смогут работать с новой версией прозрачно, но и профита тогда от эволюции нету — так как новые "поля" в типе некому будет использовать. думаю, раз ты задумался об эволюции, у тебя есть юз-кейс, можешь описать для невтыкающих? :-)
[13:23:44] <gds> Typhon: эволюция кода нужна тоже, очевидно.  Было: type t1, func : t1 -> int.  Стало: type t2, func : t2 -> int.  Но не на всех хостах такое сходу стало.  Поэтому либо ругаемся ("t1 приняли, t2 ожидали"), либо, если есть функция evolution : t1 -> t2, то в случае получения t1 сначала применяем её, потом уже func : t2 -> int.
[13:26:03] <gds> и вообще, я криво излагаю мюсли.  Если что-то непонятно, то скорее всего из-за того, что я криво изложил.
[13:43:02] ftrvxmtrx вошёл(а) в комнату
[13:53:27] <gds> вообще, если брать минимальные требования к парвелу, включающие в себя частичный апгрейд узлов кластера, то очевидно, надо как-то говорить, что версия типа не совпадает -- что сообщение послал узел со старым/новым кодом и типами.  Можно закатывать в имя типа, например, "mytype_v4".  Но тогда не будут отличаться ошибки "неправильный тип" (ошибка программиста) и "неправильная версия типа" (нормальная рабочая ситуация, когда кластер состоит из узлов разных версий).
[14:17:01] Kakadu вышел(а) из комнаты
[14:53:32] <gds> можно сделать "и нашим, и вашим".  интерфейс сериализатора обязать хранить название типа, текущую версию и функцию сериализации в текущую версию, а функцию десериализации иметь с типом " current_version -> received_version -> string -> 'a ".  В некоторых случаях можно себе позволить версионность обрабатывать явно (смотреть по received_version, какой версии принятое, и в зависимости от версии либо ругаться, либо десериализовывать).  В остальных случаях из функции string -> 'a будет создаваться функция, делающая "if current_version <> received_version then raise Version_error else пользовательская_функция_десериализации ...".
[14:55:55] ftrvxmtrx вышел(а) из комнаты
[14:57:06] ftrvxmtrx вошёл(а) в комнату
[15:23:08] gds вышел(а) из комнаты
[15:24:06] gds вошёл(а) в комнату
[15:50:49] <gds> ещё вот думаю.  Слышал, что есть десериализаторы, которые накладывают прямо из буфера recv'а в значения языка, без сохранения строки, представляющей значение, целиком.  Правильно ли я считаю, что в общем случае достаточно, если десериализатор будет представляться функцией, берущей input_channel, известную длину сообщения, и возвращающий прочитанное значение языка, и гарантирующий вычитку из канала ровно указанного количества байтов?  Десериализатор из строки тогда можно обернуть функцией, создающей строку указанного размера, читающей туда и натравливающей на эту строку данную обёрнутую функцию с типом string -> 'a.
[15:59:06] <gds> однако не выйдет фокус-покус, так как в некоторых случаях нужно получить значение, которое вероятно отослать куда-то дальше (пофиг, в виде исходной пришедшей строки либо сериализовать заново), и затраты на хранение строки окупят затраты на повторную сериализацию.  То есть, функцию, читающую из канала, нельзя сделать единственной требуемой от сериализации, но и функцию, читающую из строки, тоже нельзя.
[16:22:00] <gds> гм, а вот и нет, если совсем хорошо делать, то целиком в память всё равно читать не годится, нужно как-то по мере чтения и десериализации научиться сразу отправлять принятое тем, кому оно ещё нужно.  И не знаю, хорошо ли связывать приём значения для десериализации и реализацию типа-мультикаста.
[16:23:28] <Typhon> типа tie такой сделать, где одним концом снова в сокет как строка кидается, а в другом выходе десериализуется для работы тут?
[16:25:51] <gds> вот-вот.  В качестве дебильной идеи было сделать вообще на пайпах -- пусть десериализатор из пайпа кушает.  В качестве умной идеи -- сделать на итератах, где прочитанный поток чанков направлять более чем в одно место, но не хочу туда итераты пока пихать.
[16:27:37] <gds> и так уже манатки запихнул, как бы не порвалось.
[16:30:43] <Typhon> а у тебя такакя топология, что обязательно пересылать надо? (хотя, она такой может быть, поэтому функционал такой полезно иметь). а на стримах не получится как-нибудь? :-) или можно посылать в функцию десереализации функцию (string -> ()) которая должна будет либо ничего не делать, либо слать куда-нибудь дальше, но как-то криво
[16:33:14] <gds> топология пока тупая -- по процессам ОС идёт звезда (главный + рабочие на разных хостах, N соединений до главного процсса), и внутри процесса что-то типа "свитча" по локальному пиду.
Да, прикидываю в основном "на будущее", сейчас конечно ничего не буду делать по этому вопросу, но правильный интерфейс сериализаторов выбрать таки надо.
[16:34:43] <gds> и надо посмотреть, как устроены десериализаторы, сразу строящие значения.
[16:40:23] f[x] вышел(а) из комнаты
[16:40:40] f[x] вошёл(а) в комнату
[16:52:55] ftrvxmtrx вышел(а) из комнаты
[16:54:10] ftrvxmtrx вошёл(а) в комнату
[17:03:53] iNode вышел(а) из комнаты
[17:31:10] gds вышел(а) из комнаты
[17:53:26] <Typhon> http://www.icfpcontest.org/2011/04/contest-schedule.html
[17:56:22] <komar> Че, опять icfpc?
[17:56:26] <komar> Задолбали уже.
[18:37:55] gds вошёл(а) в комнату
[18:47:01] Kakadu вошёл(а) в комнату
[19:39:12] Typhon вышел(а) из комнаты
[19:41:09] superbobry вышел(а) из комнаты
[19:46:02] bobry вошёл(а) в комнату
[20:01:47] Kakadu вышел(а) из комнаты
[20:11:14] ftrvxmtrx вышел(а) из комнаты
[20:45:14] Typhon вошёл(а) в комнату
[21:10:49] Kakadu вошёл(а) в комнату
[21:11:01] Kakadu вышел(а) из комнаты
[21:11:22] Kakadu вошёл(а) в комнату
[21:11:42] Kakadu вышел(а) из комнаты
[21:12:11] Kakadu вошёл(а) в комнату
[21:14:49] <gds> нашёл хорошее применение полиморфным вариантам.  в парвеле "адресат" у меня будет: `LPid of lpid для чисто-локальных штук, `GPid of gpid (gpid = (host_id * lpid)) для глобальных, ну и `MCast of list addr для мультикаста.  Там, где нужно идентифицировать процесс, в типе будут [`LPid | `GPid], а там, где адресат может быть любой, в тип добавится `MCast.  Можно будет и ещё добавлять, и кодэ не сломается, а подтипизация возрулит.
Но это чисто адресаты, а надо ведь и типы как-то учитывать.  Об этом -- в следующей сводке о делах в парвеле.
[21:17:46] <gds> хотя я даже в пределах парвела нахожу, где прокрастинировать.  А мог бы тупо кодить что-то наподобие эрланговских "портов" (ОС-процессы через message passing) со спёртыми из х-я "спецификациями команд" (там они гениально объединили в тип "запускаемая команда" два варианта: Sys.command и Unix.create_process_full(?), надо спереть).
[21:48:28] <ermine> вот так и капча работает, через команду
[21:49:42] <ermine> и кстати, если это возможно, команда предпочитается больше чем вешать сошку на порт
[21:50:13] <ermine> хз почему, но говорят, чтобы не лочило треды
[21:54:06] ftrvxmtrx вошёл(а) в комнату
[22:04:56] <Kakadu> а gene9 - это тот, про которого вчера говорили?
[22:07:24] <Typhon> ага
[22:12:19] <Typhon> кстати, пока всех в камлунити добавляю в овнеры, это ок? или стоит сделать команду с push/pull (но не админстрирование) и туда людей добавлять? (то что все овнеры меня, лично, не парит).
[22:13:59] <Kakadu> а в чем разница?
[22:15:05] <Typhon> овнеры имеют админский доступ и могут, например, всех выкинуть и наделать другие злодеяния :-)
[22:15:33] <Kakadu> но не могут окммитить?
[22:15:59] <Kakadu> а, я понял
[22:16:10] <Typhon> овнеры могут всё
[22:16:50] <Kakadu> я за при условии что настраивать права надо будет не мне
[22:16:52] <Kakadu> )
[22:49:03] ermine пошла смотреть что нового в камлунити
[22:50:34] <ermine> Typhon: а маркдауном еще никто не разродился?
[22:50:57] <Typhon> не видел :-)
[22:51:12] <ermine> интересно, зачем там кетама
[22:51:15] <Typhon> надо "ярмарку идей" сделать
[22:51:27] <Typhon> ermine, я форкнул и починил под свои нужды :-)
[22:51:57] <Typhon> "ярмарка идей" == "что нам хотелось бы чтобы было, но самим некогда"
[22:52:21] <ermine> Typhon: а что ты задумал делать с этим кэшем?
[22:52:28] <Kakadu> а  я хочу коммунизм
[22:52:39] <ermine> Typhon: кстати, на основе CH сейчас конфы тут стали распределенными
[22:53:31] <Typhon> в смысле, по разным сервакам расползаются?
[22:53:40] <Typhon> или учанеги на разных серваках?
[22:54:05] <Typhon> если конфы и балансировка по кол-ву конф, то это не учитывает населённость и активность конфы же?
[22:54:07] <ermine> раньше конференции работали только на одной ноде, теперь баралнсируются по разным нодам
[22:54:39] <ermine> с CH тоже можно наверное как-то сайты распределять, не знаю :)
[22:54:55] <Typhon> одна конференция -> одна нода? или учанеги размазываются?
[22:56:19] <ermine> пока конфа - одна нода
[23:07:51] <gds> ermine: про "сошка на порт" vs команда -- речь про эрланг, про ejabberd и про твою капчу?
[23:09:22] <ermine> gds: ыгы, добавь туда еще экспиринс
[23:09:51] <gds> последнее -- просто "опыт" или какая-то штука, относящаяся к софту?
[23:11:06] <ermine> не, пока вымученный опыт поиска локов при нестабильной работы кластера в сомнительных сетевых условиях
[23:12:21] <ermine> в общем, наш девелопер zinid категорически против новых сошек
[23:28:26] <gds> ermine: то есть, эрланг ставит какие-то локи при работе с сошкой?  Недопонимаю проблему, но хочу понять.  Цель -- знать, как не надо делать, или же, наоборот, почему именно так надо делать, несмотря на гемор.
[23:31:31] <ermine> gds: это лучше zerta мучать такими вопросами, он, в отличие от меня, активно пахает на ырланке
[23:31:36] <ermine> zert: отвечай!
[23:32:02] ermine обнаружила какой-то eliomc, которым надо компилять вместо ocamlc, ну и прогресс
[23:33:09] <ermine> только они забыли сотворить eliombuild до кучи
[23:51:43] f[x] вышел(а) из комнаты
[23:55:44] f[x] вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!