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

GMT+4
[00:26:06] Typhon вышел(а) из комнаты
[00:31:31] ygrek вышел(а) из комнаты
[06:32:42] john вошёл(а) в комнату
[06:44:59] sevenov вышел(а) из комнаты
[08:22:03] gds вышел(а) из комнаты
[08:55:18] gds вошёл(а) в комнату
[09:26:29] Typhon вошёл(а) в комнату
[09:46:10] ygrek вошёл(а) в комнату
[09:46:24] ygrek вышел(а) из комнаты
[09:46:42] ygrek вошёл(а) в комнату
[10:00:26] <gds> интересно, как бы лучше работать с позициями выражений в синтаксическом дереве? Два варианта сходу:
type pos_wrapped 'a = { p : position ; v : 'a } и оборачивать токены/выражения
или
type ast = [ Expr1 of position and string | Expr2 of position and int | ... ]
(вариант "привязать через weak hash set" не нравится, точно)
[10:19:26] f[x] вошёл(а) в комнату
[10:24:09] <f[x]> я когда надо по-быстрому делал ad-hoc: position * expr
[10:24:39] <f[x]> вопрос вообще довольно субъективный - постоянно выбор между туплом и рекордом (и иногда объектом)
[10:24:55] <f[x]> в смысле этот выбор постоянно всплывает
[10:25:40] <f[x]> я начинаю с туплов, а когда появляются трёхуровневые матчи начинаю думать как переделывать :)
[10:27:53] <gds> ага, понял, то есть, вариант №1 примерно. (тип может быть вне или внутри выражения, и в варианте №1 тип вне выражения)
а у меня тут есть время на подумать, и думаю начать с записей -- больше документирования, чем в туплах, и пока не особо нужна расширяемость, и рефакторить по типам проще.
[10:40:14] <Typhon> btw, объектами часто пользуетесь? в паре мест встречал настойчивые рекомендации по их неиспользованию, что думаете?
[10:47:25] <gds> объекты -- это круто. только их нужно использовать там, где они нужны. примеры: оформление полиморфных расширяемых штук, duck typing, использование одинаковых значений для разных целей, late binding (для гуя ок).
конечно, есть копеечный оверхед, но если вся программа написана на объектах, она может быть сильно тормознее, чем в случае неиспользования объектов. А может и не быть, смотря какая программа.
[10:48:35] <f[x]> +1
[10:55:30] <gds> (паранойя mode on) кстати, советы не изучать объекты могут идти от злодеев, которые потом говорят: "эй, а в окамле нет type classes!", тогда как при использовании объектов type classes не нужны почти никогда, а где нужны, там их можно эмулировать объектами. (ну или функторами, как в deriving).
[10:56:11] <Typhon> я у minsky видел и еще где-то
[11:20:51] <gds> а вот и проблемка: хочу deriving (Show) на типе ast, но там есть значения Lexing.position, которые объявлены без deriving (Show). Как бы определить Show для них, кто-нибудь копал?
[11:21:52] <f[x]> можно попробовать вручную нужный модуль определить - подхватит?
[11:22:46] <gds> вот это и хочу. сейчас видимо буду копать в эту сторону.
[11:24:02] <gds> type loc = (Lexing.position * Lexing.position) deriving (Show);
Error: Unbound value Lexing.Show_position.format
то есть, придётся видимо
module Lexing = struct include Lexing; module Show = ..; end;
или как-то так.
[11:25:31] animist вошёл(а) в комнату
[11:33:13] sevenov вошёл(а) в комнату
[11:44:59] <gds> вот так работает:
module Lexing = struct include Lexing;
module Show_position = struct
value format formatter pos = Format.fprintf formatter
"@[file %S,@; lnum=%i,@; bol=%i,@; cnum=%i]"
pos.pos_fname pos.pos_lnum pos.pos_bol pos.pos_cnum;
end;
end;
type loc = (Lexing.position * Lexing.position) deriving (Show);
но забыл как пользовать Format, так как некрасиво разбивает на строки.
[11:47:00] Typhon вышел(а) из комнаты
[11:48:10] <f[x]> можно сгенерить Show для пары интов и скопировать format оттуда :)
[11:49:11] Typhon вошёл(а) в комнату
[11:59:10] john вышел(а) из комнаты
[12:00:18] john вошёл(а) в комнату
[12:20:57] <gds> не, всё равно хрень. Ну ничо.
module Show_loc = struct value format _formatter _loc = (); end;
=>
{v =`List [{v =`Space "\n "; loc =};
пока так нормально, главное чтобы ast было видно.
думал изобразить модуль, чтобы для печати with_loc 'a вызывать печать 'a, но типы нужно знать статически, 'a неизвестен. Функторы рожать пока не хочу особо, хотя спасло бы.
module MakeWithLoc (Type : sig type t; end) = struct type with_loc 'a = { v : 'a; loc : loc }; module Show_with_loc = показ типа Type.t
[13:06:23] <ermine> какой медведь меня тут хайлатит?
[13:06:52] <ermine> кста, один из разработчиков ocsigen пригласил меня в свою сеть в linkedin
[13:07:13] <ermine> boris yakobowsky
[13:07:23] <ermine> интересно, он шпрехает по-русски?
[13:08:50] <gds> странный разработчик -- не гуглится.
[13:24:39] <ermine> boris yakobowski
[13:24:46] <ermine> c последней буквой наврала
[13:29:20] <gds> вроде ничего от него по-русски не встречается. однако, знание русского языка легко проверить, если реально интересно :)
[13:29:51] <ermine> gallium.inria.fr/~yakobows/
[13:30:30] <ermine> а вот представить себе персональную страничку на inria.fr - это ж сдохнуть от собственной крутизны можно
[13:31:27] <gds> но он как-то держится пока.
[13:32:36] <ermine> а с ним контачила только в мейллисте ocsigen, когда требовала заменить make на $(MAKE) во всех мейкфайлах
[13:35:17] john вышел(а) из комнаты
[14:00:24] Mon вышел(а) из комнаты: Replaced by new connection
[14:00:25] animist вышел(а) из комнаты
[14:00:28] Typhon вышел(а) из комнаты
[14:00:34] gds вышел(а) из комнаты: Replaced by new connection
[14:00:39] Mon вошёл(а) в комнату
[14:01:59] sceptic вышел(а) из комнаты
[14:03:45] animist вошёл(а) в комнату
[14:05:35] aloner2k вошёл(а) в комнату
[14:10:01] gds вошёл(а) в комнату
[14:11:25] Typhon вошёл(а) в комнату
[14:26:25] Typhon вышел(а) из комнаты
[14:36:05] Mon вышел(а) из комнаты
[14:36:20] Mon вошёл(а) в комнату
[14:42:56] john вошёл(а) в комнату
[14:45:43] sceptic вошёл(а) в комнату
[14:47:40] john вышел(а) из комнаты
[14:49:39] john вошёл(а) в комнату
[14:58:42] <gds> запарился уже писать такое:
type +'t t_sub_gen = [ `A | `B of 't ];;
type +'t t_gen = [ 't t_sub_gen | `C of 't ];;
type t = t t_gen and t_sub = t t_sub_gen;;
а всё почему --
# type t_sub = [ `A | `B of t ]
and t = [ t_sub | `C of t ];;
Characters 41-46:
and t = [ t_sub | `C of t ];;
^^^^^
Error: The type constructor t_sub
is not yet completely defined
[15:19:11] sevenov вышел(а) из комнаты
[15:52:07] <sceptic> gds: ты не планируешь публиковаться в fprog?
[15:53:47] <gds> пока нет. Писать-то не о чем. Ни мощных теоретических исследований, ни чего-нибудь реально крутого, наподобие описанного в fprog2.
[15:54:14] <sceptic> неужели нет саксесс-стори?
[15:56:29] <gds> есть, но какие-то слишком прозаические и неинтересные.
[16:52:26] <ermine> да, надо просто иметь большой словарный запас слов для статьи
[17:00:45] ygrek вышел(а) из комнаты
[17:18:08] animist вышел(а) из комнаты
[17:31:11] gds вышел(а) из комнаты
[17:32:03] sceptic вышел(а) из комнаты
[17:35:37] sceptic вошёл(а) в комнату
[17:39:21] sevenov вошёл(а) в комнату
[17:45:08] <f[x]> этого мне ещё не хватало
Unixqueue: Got event without resource (implementation error?), for descriptor 32 (out)
[17:47:40] aloner2k вышел(а) из комнаты
[17:49:08] <ermine> небось из-за несафетности тредов
[17:52:14] <f[x]> elaborate?
[17:53:01] <f[x]> ocamlnet учитывает треды (по крайней мере должен, судя по коду)
[17:54:51] <ermine> а там есть мутекс, где ресурсы добавляются?
[17:55:09] <ermine> и изменяется очередь для select()
[17:55:56] <ermine> попробуй добавлять ресурсы только в одном треде - в том, в котором equeue стартовало
[17:56:47] aloner2k вошёл(а) в комнату
[18:15:42] <f[x]> у меня это вообще валится из Convenience.http_get который сам по себе сериализованный
[18:19:24] <f[x]> по крайней мере я так думаю..
[18:22:30] <f[x]> в любом случае сейчас попробую провести осмотр этого кода, спасибо за подсказку
[18:22:39] <f[x]> кстати, ermine, может у тебюя есть идеи насчёт http://sourceforge.net/mailarchive/forum.php?thread_name=20090915215355.b6e1227c.ygrek%40autistici.org&forum_name=ocamlnet-devel
[18:25:33] <ermine> до сих пор бодаетесь? Вроде прошло уже две недели, как начали бодаться
[18:26:12] <ermine> да какие идеи могут у меня быть
[18:27:15] gds вошёл(а) в комнату
[18:27:46] <ermine> какие угодно идеи
[18:33:15] <ermine> насчет пайпа - а это точно не лимит пайпов? он обычно полкило пайпов позволяет
[18:33:27] <ermine> в ulimits задается
[18:33:57] <ermine> я даже как-то с пайпами подъезжала к Герду, он пофиксл чота там
[18:34:35] ermine мучается тут, пытаясь скрестить ырланк и камло
[18:39:47] <f[x]> бодаюсь я в одиночку, и не так чтобы активно, читаю стивенса пока :)
[18:39:59] <f[x]> пайпы там не при чём
[18:42:50] <ermine> а пчу сигпайп?
[18:43:08] <ermine> это ж пайп от нгинкса к фасцги?
[18:46:58] <f[x]> там tcp
[18:48:07] <f[x]> можно ещё конечно попробовать юникс сокеты вместо tcp, но это уход от решенеия
[18:48:12] <ermine> нуишо?
[18:48:50] <f[x]> чего?
[18:49:38] <f[x]> sigpipe там к месту, попытка писать в закрытое соединение - ядро банит, fcgi закрывает сокет и переходит к следующему - всё ок
[18:51:57] <ermine> а кто закрывает? :)
[18:55:33] <f[x]> nginx обрывает по таймауту
[19:08:58] <ermine> а fcgi типа этого не замечает?
[19:11:27] <ermine> в этом плане можно потестить настройки tcp/ip в линуксе, например задать tcp_keep_live гденить полминуты
[19:17:50] sevenov вышел(а) из комнаты
[19:23:23] <f[x]> у меня такое впечатление что это ядро не замечает.. попробую keep_alive - но это как-то криво
[19:25:22] <ermine> это только чтобы проверить
[19:25:31] <ermine> по-нормальному он равен двум часам
[19:31:21] <gds> была же у меня идея подождать подольше :)
[19:33:05] <f[x]> gds: я подождал - до следующего утра :)
[19:33:19] <f[x]> и после хибернейта - отсалось висеть
[19:36:14] <ermine> а с кипаливом какое поведение будет?
[19:36:21] <ermine> просто интересно
[19:39:08] <f[x]> я расскажу, завтра скорее всего
[19:39:11] <gds> f[x]: как вариант, можно поставить отладочную печать (или strace, если его хватит, в чём сомневаюсь) на сишные unix_read и unix_select -- посмотреть, что там с чтением и ожиданием этого дескриптора. ну и придётся ещё на accept тоже, чтобы ловить соответствие порта и дескриптора.
[19:39:54] <f[x]> gds: по strace'у видно что висит read, в письме есть
[19:40:11] Typhon вошёл(а) в комнату
[19:40:36] <gds> понятно, но интересно, что было до того, как он повис -- при предыдущем чтении и при предыдущем селекте.
[19:41:40] <f[x]> --> http://sourceforge.net/mailarchive/forum.php?thread_name=20090915215355.b6e1227c.ygrek%40autistici.org&forum_name=ocamlnet-devel
[19:41:59] <f[x]> или что-то ещё?
[19:43:36] <gds> > select(0, [], [], [], {30, 0}) = 0 (Timeout)
> read(13,
интересно, с чего ocamlnet решил читать fd 13?
[19:43:50] <gds> его ведь не вернули. и его даже не проверяли.
[19:44:50] <gds> например, интересно, какая была предыдущая операция на нём, перед read, и в каких select он участвовал.
[19:45:31] <f[x]> выше
[19:45:38] <f[x]> это select от Thread.delay
[19:46:19] <f[x]> точнее ниже :)
[19:46:22] <f[x]> accept(3, {sa_family=AF_INET, sin_port=htons(56163), sin_addr=inet_addr("127.0.0.1")}, [16]) = 13
[19:46:53] <gds> ага, понял. А оно должно было поставить опцию "неблокирующие операции", если всё в select()'ах диспетчится -- или это в strace не видно?
[19:48:30] <f[x]> было бы видно
[19:49:17] <f[x]> select не нужен т.к. муллтиплексинга в netcgi_fcgi нет
[19:50:33] <gds> тогда вроде ocamlnet реабилитирован. и пришли к исходной позиции.
[19:50:48] <f[x]> :)
[19:55:39] <ermine> чё?
[19:55:42] <ermine> кто виноват?
[19:56:00] ermine не поняла
[19:57:01] <f[x]> пока не ясно
[19:57:03] <gds> линупс, видимо.
[20:00:00] f[x] надеется что нет
[20:06:08] <ermine> в fcgi неблокируемый сокет, ага?
[20:06:37] ermine тут сама бредит со своими неработающими проблемами
[20:10:40] <f[x]> блокируемый
[20:11:46] <ermine> в общем, логично
[20:12:09] <f[x]> хых
1254240571.930328 setsockopt(4, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0 <0.000006>
1254240571.930376 read(4, 0x7fffd1cc4de0, 8192) = -1 ECONNRESET (Connection reset by peer) <29.999421>
[20:12:22] <f[x]> сработало
[20:12:27] <f[x]> что это даёт?
[20:13:05] <ermine> ты про кипалив?
[20:13:08] <f[x]> угу
[20:13:24] <ermine> ну значит что тцп-сессия не закрывается по-человечески
[20:13:35] <ermine> таких жалующихся на джаббере дофига :)
[20:14:00] <ermine> а вот пчу это на локалхосте такая беда - хз
[20:14:12] <f[x]> т.е. из-за того что другой конец неправильно закрыл соединение моя прога будет висеть?? что-то тут не так
[20:14:21] <f[x]> кстати надо nginx тоже strace'нуть
[20:14:29] <ermine> кипалив - это посылка пинга
[20:14:45] <ermine> сокет в fcgi попинговал
[20:15:24] <ermine> не знаю, какой вывод делать
[20:16:10] <ermine> есть еще идеи про bsd-сокеты и не bsd сокеты
[20:16:14] <f[x]> ядро то весь локалхост видит
[20:16:30] <ermine> ты там посмотри что nginx юзает
[20:17:22] <ermine> а ping 127.0.0.1 пашыт (ну чиста теоретический вопрос)?
[20:18:05] <f[x]> работает
[20:18:10] <f[x]> фаерволла нет
[20:21:48] f[x] off
[20:24:40] john вышел(а) из комнаты
[20:25:08] john вошёл(а) в комнату
[20:26:25] john вышел(а) из комнаты
[20:26:44] sevenov вошёл(а) в комнату
[20:51:25] ygrek вошёл(а) в комнату
[20:56:04] ermine научилась цеплять в ырланке драйвер с кодом из камля
[22:10:26] sceptic вышел(а) из комнаты: Replaced by new connection
[22:10:30] sceptic вошёл(а) в комнату
[22:26:14] Vladimir Zapolskiy вошёл(а) в комнату
[23:00:49] sceptic вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!