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

GMT+4
[00:00:21] DiGiTAL_CuRSe вышел(а) из комнаты
[00:00:46] DiGiTAL_CuRSe вошёл(а) в комнату
[00:01:35] DiGiTAL_CuRSe вышел(а) из комнаты
[00:01:50] DiGiTAL_CuRSe вошёл(а) в комнату
[00:03:06] DiGiTAL_CuRSe вышел(а) из комнаты
[00:03:09] DiGiTAL_CuRSe вошёл(а) в комнату
[00:03:34] DiGiTAL_CuRSe вышел(а) из комнаты
[00:03:36] DiGiTAL_CuRSe вошёл(а) в комнату
[00:06:12] DiGiTAL_CuRSe вышел(а) из комнаты
[00:06:15] DiGiTAL_CuRSe вошёл(а) в комнату
[00:07:57] DiGiTAL_CuRSe вышел(а) из комнаты
[00:08:33] DiGiTAL_CuRSe вошёл(а) в комнату
[00:09:20] DiGiTAL_CuRSe вышел(а) из комнаты
[00:09:23] DiGiTAL_CuRSe вошёл(а) в комнату
[00:38:28] DiGiTAL_CuRSe вышел(а) из комнаты
[00:38:33] DiGiTAL_CuRSe вошёл(а) в комнату
[00:46:52] DiGiTAL_CuRSe вышел(а) из комнаты
[00:46:55] DiGiTAL_CuRSe вошёл(а) в комнату
[01:04:12] DiGiTAL_CuRSe вышел(а) из комнаты
[01:04:16] DiGiTAL_CuRSe вошёл(а) в комнату
[01:09:25] DiGiTAL_CuRSe вышел(а) из комнаты
[01:09:29] DiGiTAL_CuRSe вошёл(а) в комнату
[01:19:10] DiGiTAL_CuRSe вышел(а) из комнаты
[01:19:13] DiGiTAL_CuRSe вошёл(а) в комнату
[01:33:01] sceptic вышел(а) из комнаты
[01:38:07] DiGiTAL_CuRSe вышел(а) из комнаты
[01:44:15] DiGiTAL_CuRSe вошёл(а) в комнату
[01:53:44] DiGiTAL_CuRSe вышел(а) из комнаты: Replaced by new connection
[01:54:33] kerneltrap вышел(а) из комнаты
[04:25:10] daapp вошёл(а) в комнату
[05:25:52] daapp вышел(а) из комнаты
[06:53:55] sevenov вошёл(а) в комнату
[07:58:46] john вышел(а) из комнаты
[08:23:20] gds вышел(а) из комнаты
[08:29:04] john вошёл(а) в комнату
[08:42:04] sceptic вошёл(а) в комнату
[09:11:28] gds вошёл(а) в комнату
[10:23:04] ak вошёл(а) в комнату
[10:27:55] f[x] вошёл(а) в комнату
[10:55:16] <gds> да, в ocamlnet та самая проблема с повторной линковкой, предполагаю.
( try ... with
...
| (Unix.Unix_error (err,func,param)) as e -> ... "unix exception %s %s(%s)" (Unix.error_message err) func param ...
| e -> ... "another exception: %s" (Printexc.to_string e) ...
)
и в отладочных сообщениях несколько раз:
another exception: Unix.Unix_error(_, "single_write", "")
и один раз (последний):
unix exception Удаленный хост принудительно разорвал существующее подключение. single_write()
остальные замеченные глюки вероятно являются следствием этого.
[11:40:16] f[x] вышел(а) из комнаты
[11:44:28] f[x] вошёл(а) в комнату
[11:45:20] <f[x]> т.е. unix дважды?
[11:59:00] <gds> предполагаю. Потестил, внёс небольшой код для того, чтобы поглядеть (Obj.field exn 0) : int (там, по идее, указатель структуру с исключением: например, в Obj.field (Obj.field exn 0) 0 : string -- имя исключения). И тесты показывают, что разные исключения, даже с одинаковым именем, имеют разное Obj.field exn 0.
Поставил отладочную печать, так теперь "another exception" пропало, и везде стало unix exception.
Сейчас верну взад. Интересно.
[12:06:06] Typhon вошёл(а) в комнату
[12:12:28] <gds> вернул взад, теперь везде нормальные unix exception.
что-то я делаю не так, видимо. Но что точно -- не могу представить, так как делаю так: при перекомпиляции ocamlnet -- делаю ocamlfind remove для всех его пакетов (удаляю директории под site-lib), беру чистый ocamlnet, копирую в рабочую директорию, меняю там один файл, компилирую и ставлю весь ocamlnet через его процедуру инсталляции. То есть, удаляю прошлые .cm* и не повторяю компиляцию в уже грязной директории. Тестовую прогу компилирую безусловно, вызовом "ocamlfind ocamlc ..".
[12:15:29] <f[x]> а когда компилишь тестовую - unix.cma даёшь?
[12:15:36] <f[x]> может он там в паке каком-нибудь?
[12:16:11] <gds> ocamlfind ocamlc -g -package netcgi2 -linkpkg counter.ml counter_fcgi.ml -o counter_fcgi_byt.exe
[12:17:24] <f[x]> а как конкретно вызывается ocamlc можно увидеть?
[12:20:12] <gds> кажется нашёл :)
http://camlcvs.inria.fr/cgi-bin/cvsweb/ocaml/otherlibs/win32unix/write.c -> последняя версия там такая: http://camlcvs.inria.fr/cgi-bin/cvsweb/ocaml/otherlibs/win32unix/write.c?rev=1.4.2.5;content-type=text%2Fplain
см. функцию unix_single_write. Я там в упор не вижу инициализации DWORD err.
Глянь, не туплю ли я где-нибудь.
[12:20:55] sceptic вышел(а) из комнаты
[12:22:08] <gds> а вообще у меня версия этого файла
/* $Id: write.c,v 1.11 2006/10/18 08:26:54 xleroy Exp $ */
, что не совсем понятно, но код такой же.
[12:23:06] <f[x]> хмм
[12:23:43] <f[x]> нет инициализации
[12:23:46] <gds> (такой же -- в плане инициализации err, имею ввиду. другое не сравнивал.)
[12:24:00] <f[x]> это обьясняет сумасшедшее поведение
[12:24:01] sceptic вошёл(а) в комнату
[12:24:47] <gds> ПАТЧЬ @ КОМПИЛЯЙ
[12:24:49] <gds> попробую.
[13:54:00] <gds> во, counter/fastcgi работает отлично. зафайлил баг заодно ( http://caml.inria.fr/mantis/view.php?id=4836 ).
[13:57:58] <f[x]> gds: крут
[14:04:07] daapp вошёл(а) в комнату
[14:20:43] daapp вышел(а) из комнаты
[14:39:39] sevenov вышел(а) из комнаты
[14:39:57] sevenov вошёл(а) в комнату
[14:47:47] sceptic вышел(а) из комнаты
[14:50:00] sceptic вошёл(а) в комнату
[15:59:33] f[x] вышел(а) из комнаты: Replaced by new connection
[15:59:34] f[x] вошёл(а) в комнату
[16:52:31] john вышел(а) из комнаты
[17:24:25] ak вышел(а) из комнаты
[17:30:57] gds вышел(а) из комнаты
[17:48:22] john вошёл(а) в комнату
[18:16:34] gds вошёл(а) в комнату
[18:52:10] Mon вышел(а) из комнаты
[19:21:00] john вышел(а) из комнаты: Replaced by new connection
[19:21:01] john вошёл(а) в комнату
[19:35:56] <gds> скоро думаю бинарный билд оверблд делать, на радостях. из недавних пожеланий -- ulex, menhir имеются. из моих потребностей -- camltemplate и objsize зафигачу. что-нибудь ещё?
[19:38:43] f[x] выбил себе линуксовую машину на работе, так что на какое-то время проблема виндосборки отпадает :)
[19:41:03] <gds> f[x]: рад, что будет сильно меньше самоистязаний и мазохизма :)
[19:42:15] f[x] из нового использует json-static, bitstring и camlzip
[19:42:27] <f[x]> в смысле для меня нового
[19:43:36] <gds> ага, bitstring тоже уже есть, а остальное и мне будет полезно.
[19:45:03] <gds> всякий cryptokit надо бы ещё, но уже потом.
[19:46:22] <ermine> тут из самоистазятелей никто не собирал сульци под виндой?
[19:46:44] <ermine> просто интересно - какие там основные проблемы появляются
[19:47:13] <ermine> про одну я слышала - open_process_in
[19:47:23] <gds> а чего с open..?
[19:47:52] <gds> можно было бы попробовать. асинхронный xml парсер дописала уже? если нет, то не так интересно :)
[19:47:53] <ermine> ненаю, но якобы патчить кому-то пришлось
[19:48:24] <ermine> та виндовые сборки как бы существуют
[19:48:54] <ermine> только вот их создатели не рассказывают мне, чего они натерпелись во время сборок :)
[19:49:54] <ermine> а переход на новый xml парсер все еще длится и длится в вечном разгаре
[19:49:56] <gds> понятно, что существуют, но всё равно, это хорошая проверка для моего дела была бы. как и любой другой софт.
и заодно рассказал бы в деталях.
[19:51:19] <gds> если в процессе долбания с парсером будет что-нибудь концептуальненькое -- интересно будет почитать.
[19:52:33] <gds> http://www.google.com/search?q=sulci+open_process_in -- тут рыбы нет. Для чего open_process_in пользуешь?
[19:53:20] <ermine> а концептуальный писк несомненно ожидается - мне подсказали идею об asn.1-подобном генераторе кода обработки xml
[19:54:10] <ermine> ну про эту проблему я слышала от первого сборщика виндовой сборки, но это было сто лет назад
[19:54:34] <ermine> наверное где-то при 3.08.x еще
[19:55:38] <gds> asn.1? ээ. давай лучше старую версию :]
[19:57:06] ermine пакует тарболл старого
[19:57:27] <gds> заодно может положишь его на видное место?
[19:57:50] <ermine> угу
[20:00:23] <ermine> gds: http://files.jabber.ru/sulci/sulci-svn.tgz :)
[20:00:53] <ermine> как есть из свина, без чистки и прочих подметалок
[20:01:12] <ermine> правда полугодовой древности
[20:01:15] <sevenov> ermine, свежий sulci?
[20:01:22] <sevenov> а, блин. Пинг большой (
[20:02:03] <ermine> последний какой был в свине перед переходом на git
[20:02:38] <sevenov> А. А то вчера только слил за 2008
[20:03:20] <ermine> ну этот sulci-svn чуток посвежее будет и поглючнее
[20:04:21] <gds> взял. но лучше пусть лежит как есть, на будущее.
ещё мне важна версия: 0.6-alpha-20081215 -- это правильная?
[20:04:37] <sevenov> поглючнее -- это в чем-то хорошо )
[20:05:01] <gds> в общем, на досуге попробую собрать, но сроки не обещаю. зато обещаю обратную связь.
[20:06:16] <ermine> gds: а чтоб я помнила
[20:07:05] <ermine> gds: этот файлик был скорее для ocamlbuild, в Makefile все же другая дата стоит
[20:11:42] <gds> ermine: ага, верно, разобрался.
[20:12:31] <ermine> gds: всегда мечтала избавиться от ручной простановки дат, но ничо придумать не смогла :)
[20:13:35] <ermine> gds: требуемы пакеты описаны в sulci/README
[20:16:14] <sevenov> ermine, всегда хотел спросить, что лично Вас интересует в "экзотических" ЯП? :)
[20:16:30] <gds> а не надо избавляться от ручной простановки даты. В последнее время мне гораздо больше проблем доставляет слишком умный софт, нежели слишком тупой.
[20:17:25] <sevenov> gds, похоже, в этой реплике скрыто: "Убунта не нужна" )
[20:17:33] <gds> sevenov: экзотические -- это j/k/r и прочий брейнфак?
[20:17:50] <gds> про убунту ниасилил.
[20:18:47] <sevenov> gds, для императивщиков это любой другой язык, на котором они не пишут. Я о OCaml, Erlang. Русскоговорящее коммьюнити очень мало => можно отнести к экзотике, а всякие брейнфаки я не отношу к ЯП :)
[20:19:20] <sevenov> gds,
>В последнее время мне гораздо больше проблем доставляет слишком умный софт
Убунта и прочие винды считают себя умнее юзера.
[20:19:27] <gds> для императивщиков и ООозабоченных, видимо, так как ООП чертовски популярно.
[20:20:14] <ermine> действительно, экзотический - это рапира и брейнфук
[20:20:31] <sevenov> кстати, начал замечать, что ООП стало уж через чур модным. Пихают даже там, где он ааабсолютно не нужен.
[20:20:36] <ermine> про рапиру небось уже никто не помнит
[20:20:51] <sevenov> я помню :-)
[20:21:38] <ermine> ооп стал модным еще лет 10 назад
[20:21:51] <ermine> роликовые коньки - чуть раньше
[20:21:54] <gds> винда считает себя черезчур умной, это факт. убунту пользую несколько месяцев, пока не замечал умничаний от неё. но я её юзаю принципиально как пользователь, а не как одмин. вручную конфиги исправлял мало, разве что по старым привычкам.
[20:22:18] <gds> ооп стал модным в 92 где-то, может самую малость позднее. лет 15, т.е.
[20:22:50] <ermine> турбо с++?
[20:22:58] <gds> smalltalk!!!1111111111111
[20:22:59] <sevenov> ermine, ну я бы не сказал. Сейчас с наплывом школоты и доступностью толковой документации/книг, ооп применяется там, где не нужен.
[20:23:02] <ermine> или турбо паскаль?
[20:23:57] <ermine> sevenov: я осваивала с++ под влиянием моды еще в начале 90 годов, так что не надо
[20:24:32] ermine собсно знает с++ только той эпохи, более современный не знает
[20:24:34] <gds> да хотя бы tc++. да и были какие-то поделки вне интеловских архитектур, если помню.
[20:24:45] <sevenov> ermine, мода, ага. А сейчас что модно? Сишарпы всякие, жабаэфиксы.
[20:24:57] <sevenov> А там оопа на каждый пук.
[20:25:24] <gds> sevenov: кстати, замечу. ооп в 90% случаев применяется там, где не нужно. Но -- ооп примитивное, модное, пипл хавает.
[20:26:09] <sevenov> gds, фп приятнее и логичнее, имхо.
[20:26:32] ermine еще помнит, что около середины 90 годов пыталась проникнуться объектами в ассемблере, да не проникнулась
[20:26:44] <sevenov> >кстати, замечу. ооп в 90% случаев применяется там, где не нужно.
Об этом же, мои две реплики выше )
[20:27:03] <gds> в большинстве случаев -- верно, но бывает полезен и императив, и ОО.
[20:27:58] <sevenov> Ну вот, хоть тема для разговора появилась :-)
[20:28:10] f[x] вышел(а) из комнаты: Computer went to sleep
[20:28:19] <ermine> объекты лучше избегать, чтобы не кружили голову своим чудесным поведением
[20:29:06] <gds> нифига, сейчас её на скучный окамл переведу :)
объектно-ориентированное погроммирование конкретно в окамле решает две задачи: структурная типизация на уровне first-class values и позднее связывание.
[20:29:14] Typhon вышел(а) из комнаты
[20:31:40] <ermine> ты еще просвети нам, чем полиморфизм отличается от объектов :)
[20:34:05] ermine сейчас страдает попытками описать один общий тип для функций, засовываемых в hashtbl, проблема в том, что вывод функций не типизируется под одну гребенку
[20:34:33] <gds> давай конкретику.
[20:35:03] <ermine> на ум приходит одно - не применить ли json для создания эмуляции динамического типа
[20:35:40] <sevenov> ermine, а смысл?
[20:36:49] <gds> не смысл, а предназначение интересно. что дальше с функциями делать собираешься?
[20:37:25] <ermine> gds: ну вот тот asn.1-подобный генератор - в нём описываются функции, которые берут на вход один и тот же тип данных, а на выход - рекорды с разными типами полей, в hashtbl хранится пара xmlns и функции, тот кто вызывает по xmlns функцию может (и должен) знать, что вернет та функция
[20:38:53] <ermine> json - динамическая структура...
[20:40:42] <ermine> gds: пример:
let f1 "a" = 1
let f2 "b" = {b="c"}
[20:41:21] <ermine> как видно, string -> неодинаковый_тип
[20:42:18] <ermine> надо подумать о другом подходе
[20:42:27] <gds> прям так -- не получится. Да и давай конкретную цель -- что с этим добром будешь делать? Представь, что есть func : string -> что-я-захочу.
Дальше-то что? :)
[20:45:10] <gds> простой пример, к чему я это: как протипизируется List.map func ["a"; "b"]?
[20:48:22] <ermine> gds: давай рассмотрим запрос версии клиента, он состоит из двух частей: заголовка и вложения, заголовок для всех любых запросов одинаков: <iq to=gds type=get>, и вложение, которое в данном случае описывается как <query xmlns=version>; в данном запросе у запроса нет дополнительных параметров. В качестве ответа приходит заголовок <iq from=gds type=result> и вложение <query xmlns=version><client=pidgin><os=linux></query>. Мне не хочется создавать кучу таблиц для каждого типа запроса/ответа, а лишь привязывать к "version" нечто, что должно ответить на запрос, а именно функцию которая обрабатывает только вложения в запросах
[20:48:54] <ermine> и эта функция знает только про version в данном случае
[20:50:47] ermine подумала и поняла, что в описывемом случае все просто и нет связи с внешним миром, только вывод в виде xml в сеть
[20:51:44] <ermine> а вот чтобы передать куда-то наверх результаты ответа твоего клиента - это да, надо куда-то девать данные и в каком-то виде
[20:52:43] <ermine> в erlang из-за динамической типизации такой заморочки нет
[20:53:24] <gds> тут просто, string -> xml -> xml получается.
конечно, чисто повезло.
[20:54:09] <ermine> это в случае "послать ответ"
[20:54:21] <gds> зато тут нет другой заморочки -- runtime type errors.
а какие случаи ещё бывают?
[20:54:29] <ermine> теперь давай про "принять ответ"
[20:56:33] <gds> то есть, клиент хочет запросить нечто у сервера (условно), который может послать абсолютно любой ответ, который надо привести к нужному типу?
[20:56:37] <ermine> 4 случая - принять ответ, послать ответ, запросить ответ и получить ошибку
[20:57:27] <ermine> ну с получением ошибки имхо все просто - вызвать функцию вывода ошибок и забыть
[20:57:57] <gds> может прийти невалидный xml, например.
[20:58:27] <ermine> на это надо послать ошибку
[20:58:35] <sevenov> охох, xml ужасен же
[20:59:02] <ermine> xml тут ни при чем
[20:59:45] <sevenov> да это я к слову
[20:59:49] <ermine> это можно представить в виде тупого текстового или бинарного протокола, все дело в злобной типизации камля
[21:00:50] <sevenov> ermine, все таки, для решения определенных задач, лично я предпочитаю использовать разные инструменты.
[21:01:32] <gds> sevenov: реши задачу общения по xmpp.
[21:02:08] <sevenov> gds, я вот о таких моментах, когда внезапно натыкаешься на то, что нужно "наипать" сам ЯП и как-то костылить код.
[21:05:09] <ermine> и почему-то для xmpp самый стабильный софт - сервер, бот и клиент - на "экзотических" языках, два из которых, tcl/tk и erlang, любят вываливать ошибки в рантайме :)
[21:06:04] <gds> ermine: если основу брать, то можно хранить значения, вписывающиеся в вариантный тип. string -> xml -> [ Receive_response of xml (* который дальше руками до нужного типа *) | Reply of xml -> xml (* в том числе для ошибок *) | Query of xml -> xml -> xml (* получаем xml из запроса, отправляем соответствующий запрос и получаем ответ *) ]
[21:07:24] <ermine> gds: угу, я об этом думала, но это вряд ли круто
[21:07:59] <gds> sevenov: в обычных случаях для xml берут ocamlduce, если нет некоторых особых требований. В случае нормальных языков почти всё решается библиотеками, и всё разумное решается синтаксическими расширениями.
[21:08:08] <ermine> gds: пару лет назад я обнаружила в одном своем коде в списке вариантов такие опечатки, которые не всплывали при компиляции
[21:08:09] <gds> ermine: это не круто, это работает :)
[21:08:23] <gds> опечатки -- плохо, -w A -- хорошо.
[21:09:07] <ermine> вроде не появлялось в варнингах
[21:09:55] <ermine> но я еще подумаю
[21:10:27] <ermine> может и чонить более хитрое типа вызова api-функций получится
[21:10:55] <ermine> чтобы те глушили типизацию
[21:12:52] <gds> если встретится ещё что-нибудь, обходящее варнинги, и связанное с опечатками, переименованиями и типизацией самих вариантных типов -- сообщи. Потому что за это надо еть окамл-тим.
[21:14:25] <ermine> gds: чтобы выявить опечатки, понадобилось рисовать .mli и явно указывать там типы в нужных местах, без этого оно позволяло всё
[21:14:47] <gds> апи -- ну вариант. только учти такую штуку: если в возвращающей функции что-то стало известно касаемо того, какого типа значение возвращается, то в обрабатывающей функции должно быть соответствующее решение на этот счёт. Если возвращаешь 'a t и используешь в функции, знай, что функция обязана обрабатывать 'a t для любого 'a. (с existential types всё ещё хитрее; надеюсь, не понадобятся.)
[21:15:53] <gds> про полиморфные варианты -- возможно. их вообще без привязи наружу за модуль не выпускают, по-хорошему. а если обычные -- шоке шоке.
[21:17:55] <ermine> а про апи - можно описывать только партиально :)
[21:18:32] <gds> но принцип ведь сохранится.
[21:19:11] <ermine> хотя я мысль до конца еще не додумала, типа
val f: string -> (unit -> unit) -> unit
let f a b =
b a ()
[21:22:56] <gds> так определись, что в конце будет. Если в конце тупо unit, то рисуется замечательно:
f : string -> ((string -> xml) * (xml -> unit)) -> unit
и ага.
[21:32:28] <ermine> ну в теории выглядит... теоретически
[21:32:51] ermine пока переключится на чо-нить другое
[21:35:17] sevenov вышел(а) из комнаты
[21:36:31] sevenov вошёл(а) в комнату
[21:43:00] <ermine> gds: но это действительно ближе к потребностям encode/decode тенологии, ага, надо думать дальше в этом направлении
[21:43:46] <ermine> а вот в ocsigen можно описывать типы данных для GET/POST запросов, надо тырить технологию
[21:47:47] <gds> имхо, encode/decode -- либо, если гламурно, camlp4, либо, если поизвращаться, то functional unparsing.
[21:48:46] <ermine> ну генератор все же пишет две основные функции - encode и decode
[21:48:48] <gds> а хотя, не только. функторы вон ещё есть.
[21:49:15] <gds> функции-то он пишет, но типы даёт им статические, известные на момент компиляции.
[21:49:42] <ermine> encode c непонятными аргументами и рожает xml, decode берет xml и рожает эти непонятные данные
[21:50:08] <ermine> это просто в терминах asn.1
[21:51:33] <gds> type 'a enc_dec = { encode : 'a -> xml ; decode : xml -> 'a };
если же понадобится спрятать 'a из типа enc_dec -- сообщай. только лучше при реальной необходимости.
[21:54:29] <ermine> та еще пока куча увязочных вопросов осталась :)
[22:20:39] <ermine> gds: я пока решила засовывать в таблицы функции-обертки, а эти обертки сами вызывают... сгенерированный код encode/decode и сами разжевывают параметры/результаты, собсно идея генератора в том, чтобы упростить написание оберток
[22:22:13] <ermine> чем дальше, тем все проще, как кажется :)
[22:22:30] <ermine> убью того кто первым нарушит эту иллюзию
[22:24:51] sevenov вышел(а) из комнаты: Replaced by new connection
[22:25:25] sevenov вошёл(а) в комнату
[22:36:59] <sevenov> :-))
[22:39:11] <gds> обертки -- это замечательно, если с типами всё оке.
и будь умницей, не убивай ни реальный мир, ни себя :)
[22:43:46] <sevenov> А в сульце есть что-то типа автоприведствия? Что-то не могу найти.
[22:47:08] <ermine> greet
[22:47:15] <ermine> зато нету ungreet
[22:48:59] <sevenov> Хм
[22:49:31] <sevenov> Тогда допишу. Хочу, чтобы бот визиторам писал в приват, что войс просить у модеров.
[22:49:37] <ermine> там в doc есть описалово
[22:50:00] <sevenov> ок, спасиб
[22:50:19] <ermine> описалово не я писала, кто-то прислал
[23:07:09] sceptic вышел(а) из комнаты
[23:09:36] sceptic вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!