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

GMT+4
[00:09:47] ygrek вошёл(а) в комнату
[00:14:41] ermine вышел(а) из комнаты
[00:17:58] Typhon вошёл(а) в комнату
[01:24:35] ygrek вышел(а) из комнаты
[02:21:32] zert вышел(а) из комнаты
[02:33:08] komar вышел(а) из комнаты
[03:51:36] Typhon вышел(а) из комнаты
[08:16:36] iNode вошёл(а) в комнату
[08:39:23] gds вышел(а) из комнаты
[09:06:12] gds вошёл(а) в комнату
[09:45:54] Typhon вошёл(а) в комнату
[10:16:57] Mon вошёл(а) в комнату
[10:44:07] serp256 вошёл(а) в комнату
[10:46:57] ermine вошёл(а) в комнату
[11:04:30] f[x] вошёл(а) в комнату
[11:16:54] serp256 вышел(а) из комнаты
[11:24:41] zert вошёл(а) в комнату
[11:37:02] serp256 вошёл(а) в комнату
[12:13:53] komar вошёл(а) в комнату
[12:28:42] <gds> кто-нибудь нормально вникал в iteratees?
я их слегка этосамое (сделал два типовых параметра) у меня для их bindI компилятором выводится тип
('a -> ('a, 'b) iteratee) -> ('a, 'a) iteratee -> ('a, 'b) iteratee
, тогда как я ожидаю
('b -> ('b, 'c) iteratee) -> ('a, 'b) iteratee -> ('a, 'c) iteratee
Скорее всего где-то налажал в коде, но может кто-нибудь заметит, что я что-то делаю явно не так.
(понятно, что iteratees+ocaml -- это само по себе "не так", но этот момент мы опустим)
[12:36:36] <Typhon> "понятно, что iteratees+ocaml -- это само по себе "не так"" -- почему?
[12:36:59] Typhon прочитал пока одну типа вводную статью про iteratees, собирается поже имплементить на окамле это дело
[12:38:25] <gds> не так -- потому что есть другой ввод-вывод, прямой.  Ну, input_char и все дела.
[12:40:27] <gds> поже = позже или тоже?
[12:41:10] <Typhon> *позже, да :)
[12:41:41] <Typhon> и *имплементить = реализовывать, пожалуй
[12:44:25] <gds> думаю, наламывать ли тебе кайф, комментируя срань, которая вылезает при реализации?  Ведь когда сам на новое говно наступаешь -- эмоции позитивнее, чем в случае, если по этому говну уже ходили до тебя.
[12:46:37] <zert> если по говну уже прошлать рота пехотинцев, то говна уже и нет
[12:46:41] <zert> так что напротив
[12:47:15] <gds> ну, а то, что есть, оно засохнет и само отвалится, знаем.
[12:55:09] <gds> (далее я буду писать утверждения, которые для меня самого спорные.)
в общем, такие пироги: у олега эти сущности имеют один типовый параметр -- тип результата.  Т.е. iteratee 'a.  И всю обработку он предлагает делать путём композиции-слева (звучит глупо, так как это означает, что ново-присоединяемый обработчик будет обрабатывать результат выполнения старого iteratee).  А на входе у них -- строка.  Так как со входа ничего не присоединяется, только с выхода, следовательно, на входе любого iteratee у нас строка.
Спорное свойство.  Несимметричненько.  И оформил я хранение входа как array 'i, а выход как IE_Done of 'o and error, и стал тип iteratee 'i 'o.
Далее -- описал расклад про bindI выше.
Кстати, ужасно туплю, так что поправляйте меня, если чо.
[15:31:15] <gds> кто-нибудь видел/делал окамловские биндинги к mpg123?  гуглинг говорит, что нет таковых, но спрошу навсяк.
[15:33:22] komar поглядел в аптитуд и ничего кроме libogg-ocaml не нашел.
[15:34:43] <komar> О, еще libao.
[15:39:51] <gds> поглядел, вроде они не умеют мрз играть, а мне в основном это и надо.  Что ж, абыдна.
[15:40:54] <Typhon> не Pomodoro  <http://code.activestate.com/recipes/577358-pomodoro-timer/>timer <http://code.activestate.com/recipes/577358-pomodoro-timer/> случаем делаешь? :)
[15:44:20] <gds> не :)  памедорки мне без цели, мне ими нечего решать.  А вот автофокус уже в планах (но не знаю, блокнот тоже удобен).
Думаю в эту сторону: http://metaclass.livejournal.com/554656.html?thread=7574432#t7574432
Прикидываю усилия.
[15:45:24] <f[x]> gds: посмотри в savonet.sf.net , у них там много всякого аудио-related
[15:46:36] <f[x]> http://sourceforge.net/projects/savonet/files/
[15:50:33] <f[x]> а для mpg123 собственно достаточно Unix.system
[15:52:15] <gds> о, "Output stream to local sound card using libao" умеет.  ocaml-mad есть, следовательно, декодить мрз тоже умеет.  Интересно, геморно ли его падвендой запустить.
[15:55:19] <gds> а я хочу ещё опцию -C (консольный интерфейс mpg123), а падвенду оно не умеет его.  Потому и подумал про биндинги -- mpg123.h рядом с libmpg123*.dll таки лежит, что подразумевает нормальное апи.
[15:57:08] <f[x]> а, не знал
[15:57:33] <f[x]> taglib ихний под виндой собирался
[15:57:47] <f[x]> * биндинг к
[16:14:33] <gds> вопрос не совсем в тему (хотя нужен для окамловской софтины).  современные браузеры умеют общаться с веб-серверами по http/1.0, или он уже считается устаревшим и не поддерживается?
[16:16:08] <f[x]> поддерживается
[16:16:38] <gds> ну вы понели, что я хочу обойтись без ocamlnet.  Ах какой я плохой!
[16:23:24] <f[x]> ну дык, даёшь каждой софтине свой веб-сервер
[16:24:07] <gds> ну и разумеется NIH!
[17:11:50] Kakadu вошёл(а) в комнату
[17:32:15] gds вышел(а) из комнаты
[18:08:52] iNode вышел(а) из комнаты
[18:44:31] gds вошёл(а) в комнату
[19:22:16] Typhon вышел(а) из комнаты
[19:22:30] serp256 вышел(а) из комнаты
[19:39:23] <gds> в lwt есть что-то типа Unix.establish_server?
[19:41:00] <komar> А кто это?
[19:41:03] <komar> Че-то должно быть.
[19:41:24] <gds> val establish_server : (in_channel -> out_channel -> unit) -> sockaddr -> unit
[19:41:41] <gds> "Establish a server on the given address.    The function given as first argument is called for each connection    with two buffered channels connected to the client. A new process    is created for each connection. The function Unix.establish_server never returns normally."
[19:46:59] <Kakadu> а кто-нить из вас использует версию stdlib от janestreet?
[19:49:01] <komar> gds: такой нет.
[19:49:45] <gds> komar: ок, понял.  Но слегка удивлён.
[19:50:04] Kakadu поправляет stdlib на Сore_Core_extended
[19:53:30] <komar> gds: я сервера на окамле ни разу не писал, но ocsigen вроде как работает нормально. И он на lwt.
[19:55:11] <gds> мда.  Оказывается, Lwt_io.establish_server.
[19:56:01] <komar> Гы, лол.
[19:57:07] <gds> только тип у неё стрёмный:
val establish_server : ?buffer_size:int ->
       ?backlog:int ->
       Unix.sockaddr ->
       (input_channel * output_channel -> unit) -> server
надо посмотреть, как оно параллелит.
[19:57:24] Kakadu вышел(а) из комнаты
[20:07:05] <komar> $ grep -nIR establish_server ~/src/ocsigen-1.3.0 | wc -l
0
[20:07:43] <gds> дык старьё потому что.  В 2.1.0 -- есть.
[20:07:52] <komar> А, ёлки.
[20:11:36] komar вышел(а) из комнаты
[20:35:23] Typhon вошёл(а) в комнату
[20:37:24] <Typhon> gds, а чо стрёмного в типе? :)
[20:39:01] <Typhon> (внутрях у lwt select был, емнип. были попытки на libev перевести, но что-то не продвинулось. если ты это имеешь ввиду под "параллелит". )
[20:57:14] <gds> Typhon: в типе стрёмно то, что возвращается не Lwt.t, и прибиндить нельзя.  Поглядел, разобрался, там оно внутри само делает всё что надо.
[21:02:10] <gds> с другой стороны, прикинул, как я буду читать http-запрос.  Напомню, что: разделители -- CR | LF | CR LF.  Далее, с целью безопасности нельзя читать длинные запросы (если более 4кб -- явно попытка зламать).  Это значит, что надо будет читать посимвольно, смотря на разделители строк и считая размер (можно, но геморно, и всё равно какой-то буфер нужен будет: например, прочитав CR, мы обязаны далее посмотреть, будет там LF или другой символ, и если именно другой символ, то надо как-то взад его запихнуть, или где-то сохранить).  Или же читать блок и внутри него разбирать, возвращая в том числе кусок блока, из которого выкусили строку, чтобы дальше его обрабатывать при необходимости.
И сравниваю я весь этот бардак с подходом iteratees, которые я обломался правильно накодить сегодня днём и забил.
FFFUUUUUUUUUUUUUU
[21:14:52] <Typhon> 1) может закодить "несимметричные" iteratees, с один типовым параметром?
2) таки ошибка не обнаружилась в коде? (в рассуждениях я ошибки не нашел, но не эксперт (пока :) ) -- только одну статью читал)
[21:20:08] <gds> обнаружил проблему -- bindI судя по тому, что он делает, должен иметь тип ('b -> iteratee 'c 'd) -> iteratee 'a 'b -> iteratee 'c 'd, и этот тип противоречит логике (а именно, теряется связь тем, что их комбинация должна кушать 'a).  И по логике должно быть
bindI : ('b -> iteratee ... 'c) -> iteratee 'a 'b -> iteratee 'a 'c
хотя, смотря на enumerator/enumeratee, оно именно там как-то учитывает два типа (eli + elo; element in/out).  Но я не могу понять пока, ибо трава зело забористая у олега.
[21:35:18] komar вошёл(а) в комнату
[21:59:06] arhibot вошёл(а) в комнату
[22:38:44] arhibot вышел(а) из комнаты
[23:32:17] ygrek вошёл(а) в комнату
[23:35:40] <ygrek> ы, просто вычитывать 4К и потом одним куском парсить
[23:50:33] <ygrek> gds: -> http://dmzlj.livejournal.com/161114.html
[23:51:07] ygrek кстати думает в далёком будущем заюзать какой-то шаблонизатор для mldonkey ибо сейчас в web ui там творится тсрах и ужас
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!