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

GMT+4
[00:22:31] <ygrek> Typhon: затем что нет смысла линковать syntax в бинарник, и так проще применять расширение только к нужным сорсам
[00:22:52] <ygrek> т.е. делается true: pkg_mikmatch_pcre а на выбранные файлы pkg_mikmatch_pcre.syntax
[00:23:37] <ygrek> а в текущей ситуации так нельзя сделать, иначе расширение применится ко всем исодникам и запросто может с каки-нибудь другим расширением конфликтовать
[00:23:59] <ygrek> вроде взрослый дядька, а не знает зачем отдельный .syntax?
[00:26:51] <Typhon> не влезает в 140 симвволов :D
[00:31:48] <ygrek> it simplifies using it in big projects, and avoids linking syntax extension into final binary
[00:37:04] Kakadu вышел(а) из комнаты
[00:43:17] <Typhon> ок, спасибо, а то я вне контекста + день слишком суатошный сегодня :-)
[00:46:24] <ygrek> та это я просто ленюсь мыло писать :)
[02:03:46] <Typhon> http://redlizards.com/blog/tag/ocaml/
[02:06:58] <Typhon> https://nicta.silkroad.com/epostings/index.cfm?fuseaction=app.jobinfo&jobid=89&company_id=16182&version=1&source=ONLINE&jobOwner=993265&aid=1
[02:07:14] <Typhon> Red Lizard Software develops state-of-the-art static analysis tools that find bugs in C/C++ code at compile-time. It does this without need for code annotations or test harnesses. It is written in OCaml and makes use of the latest research results.
[02:08:02] <Typhon> мы говорим -- "статический анализ кода", подразумеваем -- ocaml
[02:15:40] <Typhon> в батарейках есть build/optcomp -- pp типа cpp, для #if/#else всяких. но не могу найти, как он используется у них
[02:19:06] <ygrek> в realworld
[02:19:58] <ygrek> а, goanna же
[02:20:11] <ygrek> но всё равно, забыли упомянуть
[02:22:51] ygrek вышел(а) из комнаты
[02:27:07] <Typhon> bobry, https://github.com/wickedchicken/ocaml_skeleton/pull/2 <- почему я не вижу тут твоего "+1"? :-) а то чувак чота завис, а от тебя issue было
[02:59:11] shaggie вышел(а) из комнаты
[03:15:06] <Typhon> классно чуваки сделали https://github.com/ocaml-batteries-team/batteries-included/wiki/%22Junior-tasks%22-for-batteries
[03:15:24] <Typhon> но вот билдчейн у них какое-то г :-(
[03:16:29] letrec вошёл(а) в комнату
[03:49:56] <Typhon> http://paste.in.ua/3195/ да ну его нафиг %)
[03:50:11] Typhon вышел(а) из комнаты
[04:43:39] letrec вышел(а) из комнаты
[07:49:54] gds вошёл(а) в комнату
[09:37:04] ygrek вошёл(а) в комнату
[09:37:39] ygrek вышел(а) из комнаты
[09:38:02] ygrek вошёл(а) в комнату
[09:47:07] <ygrek> Typhon: ну это camlp4 - завязка на версию компилера
[09:47:21] <ygrek> что конечно не мешало бы чётко указывать это
[09:52:00] <gds> раньше файл cd_String.ml был, теперь файла нет, но оазис помнит о нём:
W: File '/home/gds/dev/cadastr/_build/src/cd_String.cmi' has been marked as built for library cadastr but doesn't exist
как бы заставить его забыть?
[09:52:04] <gds> oasis setup делал.
[10:04:27] <gds> замочил setup.log, оно его пересоздало.  не тупка ли?
[10:24:31] Kakadu вошёл(а) в комнату
[10:25:07] Typhon вошёл(а) в комнату
[10:25:28] <Kakadu> поздравляю всех с выходными!
[10:25:58] <gds> кому выходные, а кому обычные.
[10:26:29] <Kakadu> я после военных сборов начал выше ценить выходные
[10:27:30] <gds> поработай с пятидневным графиком несколько лет, так ещё начнёшь фапать на "вечер пятницы" и у тебя разовьётся алкоголизм.
[10:27:49] <Typhon> ygrek, не понял про завязку на версию. Я хотел optcomp использовать, чтобы условную компиляцию сделать. А там тиипа сап опткомп собирается только на определённых версиях?
[10:29:00] <Typhon> выходные, бывает, лучшее времт, лучшее время для раоты :) никцто не отвлекает
[10:29:23] <ygrek> Typhon: получается да :)
[10:29:50] <ygrek> так что юзай camlp4.macro с надеждой что его будут поддерживать рабочим при изменениях
[10:30:27] <gds> да, выходные хороши для работы.  Но с фиксированным графиком плохо то, что, поработав в выходные, обычно маловероятно, что дадут возможность отдохнуть в будние, хотя бы отдохнуть от рабочего места.
[10:31:57] <Typhon> ygrek, надо использовать условную компиляцию для тулзы, облегчающей условную компеляцию! :)
[10:32:40] <ygrek> не, надо юзать тулзу которая компилится безусловно !
[10:46:35] <Kakadu> фадиез настолько тупой, что не может без меня вывести тип даже у
let x = ref None;;
[10:47:41] <gds> камло недалеко ушло:
# let x = ref None;;
val x : '_a option ref = {contents = None}
видимо, есть какие-то причины, как думаешь?
[10:48:31] <Kakadu> чо?
[10:48:54] <Kakadu> я был уверен что камло сообразительное и только что устно материал мелкомягких
[10:49:05] <Kakadu> а зачеркните
[10:49:43] <Kakadu> а не, всё ОК
[10:49:55] <Kakadu> в камле это хотябы компилится
[10:50:09] <Kakadu> мономоризм же? или как его там?
[10:50:48] <gds> не скомпилит.  создай file.ml с таким содержимым, попробуй.
[10:50:58] <gds> а причём тут сообразительность?
[10:52:25] <Kakadu> http://nooooooooooooooo.com/
[10:52:38] <gds> Так!
[10:53:18] <gds> но это нормально.  мутабельность.  было бы 'a ref, то один модуль сделал бы File.x := 123, а другой -- print_string !File.x
[10:54:03] <Kakadu> ааааа
[10:54:07] <Kakadu> вспомнил
[10:54:46] <Kakadu> меня троллили в рассылке haxe про то что при добавленн чего попало в мутабельный Array тип выводится Array<Dynamic>
[10:55:09] <Kakadu> gds: кстати, тебе таки ответили в теме про ООП и статическую типизацию?
[10:58:11] <gds> не ответили.  http://udpn.livejournal.com/56866.html?thread=625954#t625954
[11:00:45] <Kakadu> я тут на днях сидел на лекции про Software Engeneering, препод задвигал, что использование старых технологий может быть обосновано тем, что у людей слишком тонкая инновационная составляющая, чтобы они могли принять новый подход (инновацию)
[11:01:19] <Kakadu> P.S. Не ругайтесь за слово инновация, я знаю, что его любят неверно юзать чиновники)
[11:02:02] <gds> правильно препод двигал.
[11:02:40] Typhon вышел(а) из комнаты
[11:02:56] <Kakadu> у меня первая мысль была : "вот поэтому линукс не захватил десктопы"
[11:20:29] Typhon вошёл(а) в комнату
[11:26:53] Typhon вышел(а) из комнаты: Replaced by new connection
[11:26:54] Typhon вошёл(а) в комнату
[11:43:14] letrec вошёл(а) в комнату
[11:47:07] ygrek вышел(а) из комнаты
[11:51:38] Typhon вышел(а) из комнаты: Replaced by new connection
[11:51:40] Typhon вошёл(а) в комнату
[11:53:13] <Typhon> линукс не захватил десктопы, потому что он неудобен для повседневного использования. чтобы посмотреть через хми видео на телеке нужно чуть ли не конфиги руками править, в 2011 то году от Р.Х.! какой тут десктоп
[12:11:44] <Kakadu> gds: btw, у меня не получилось выполнить метод с параметрами вчера.
[12:12:19] <Kakadu> если указывать ещё параметры в caml_callbackN то всё падает, а если не указывать, то тело метода не работает
[12:14:29] <gds> я видел, но 1. не знаю точно, как правильно (о чём вчера говорил), 2. нет идей, почему у тебя неправильно, 3. кастратофически не было времени заниматься другими делами.  Впрочем, и сейчас тоже вот -- 4 часа отпахал, думаю пойти погулять скоро.
Рекомендую глянуть в имеющиеся примеры.  Но там принцип такой: после obj#foo у тебя на руках лямбда, которую имей как хочешь.  Можешь, например, сначала потренироваться вызывать функцию let f s n b = printf "%s %i %b\n%!", а потом запихнуть её в метод.
[12:40:53] ermine вошёл(а) в комнату
[13:40:18] komar вышел(а) из комнаты: Replaced by new connection
[13:40:18] komar вошёл(а) в комнату
[14:15:04] Kakadu вышел(а) из комнаты
[14:24:23] Typhon вышел(а) из комнаты
[14:41:45] Kakadu вошёл(а) в комнату
[14:49:51] ygrek вошёл(а) в комнату
[15:29:08] <ermine> ой, в почте еще один маклейн
[15:29:43] <gds> закрывай почту!  они лезут на почту!
[15:29:57] <gds> Kakadu: так чо, дело было только в int vs string?
[15:31:11] <ermine> правда непонятно в каком формате
[15:31:15] <ermine> gds: да от какаду
[15:32:02] <gds> так сравни.  если у него лучше -- кинь мне.
это мы так вычисляем максимум на кластере.
[15:32:46] <ermine> дифф показывает, что это та же книжка, что ты дал!
[15:33:07] <ermine> будем читать хором и вникать вместе
[15:34:39] <ermine> Kakadu: спасибо anyway, я хоть знаю, что не пропустила чонить
[15:42:08] ygrek вышел(а) из комнаты: Replaced by new connection
[15:42:08] ygrek вошёл(а) в комнату
[15:42:08] ermine в парсинге загибается над интерпретацией грамматики
[15:42:16] <ermine> gds: ты уже играл в эту игру?
[15:42:46] <ermine> вот интересно как аттрибутивную грамматику имплементить
[15:45:48] <gds> ermine: не, только хотел как-то раз.  Но мне интересно было более-менее абстрактную байду сделать для грамматики.  Чисто для её хранения и работы с ней.  Чтобы к ней с одной стороны прикручивать, грубо говоря, парсер .mly, а с другой стороны -- генерилку ll/lalr/lr/glr и прочей сранограмматики.
[15:58:53] <ermine> gds: я попыталась как-то культурно переложить грамматику xml на камло, в итоге играюсь с интерпретацией бнф :)
[15:59:42] <ermine> прямо щас зависла над интерпретацией терминальных строк - то ли их представлять как набор терминальных символов, то ли как-то циклить в рамках итератов
[16:00:20] <ermine> собственно итераты побуждают к сильной абстракции, чтобы не повторять код
[16:10:01] <gds> про бнф -- не ясно, зачем она точно.  прикольно, да, но нужна ли?
[16:10:33] <ermine> бнф таки удобна как нотация формальной грамматики
[16:10:44] <gds> если используешь итераты -- проще сначала писать высокоуровнево, так как [лично мне] понятно, что всегда можно будет соптимизировать.
[16:10:58] <ermine> интерпретируешь бнф и попутно парсишь, а в идеале - генеришь код для парсинга
[16:11:26] <ermine> просто в спеках хмл и yaml используются бнфы и много еще где
[16:11:50] <gds> про нотацию -- вариант.  как-то не думал.  но это будет "вход" для собственно представления грамматики.
вот видишь, какие разные входы бывают, и какие разные выходы.  надо выделять отдельно представление грамматики.  вплоть до "в отдельную либу".
[16:11:55] <ermine> палюбому надо автоматом прочитать файл с описанием в виде бнф и произвести над этим зверские операции
[16:12:21] <ermine> gds: прикинь, что в yaml 211 правил в бнф - предлагаешь вручную клепать код?
[16:12:44] <gds> предлагаю посмотреть на более компактный способ представить эти 211 правил.
[16:13:28] <ermine> да один фиг в контекстно-независимой грамматике
[16:13:56] <ermine> ну, в этом бнфе всяко уже есть регулярные выражения с звездочками и плюсиками
[16:14:18] <gds> но если берёшься за бнф -- я этому очень рад.  Пожелания: отфактори отдельно представление грамматики (а то и грамматик!  они разные бывают), и сделай отдельно парсилку бнф в грамматику.
[16:15:41] <ermine> у меня только итераты не твои итераты
[16:15:48] <ermine> :P
[16:16:01] <gds> А ЧЬИ???
[16:16:13] <ermine> мои
[16:16:40] <ermine> и без массивов
[16:16:42] <gds> я знал, что леди не любят появляться на публике в одной и той же одежде, но чтобы настолько...  :]
[16:17:02] <gds> а на чём у тебя?  Колись!
[16:17:24] <ermine> оно выдает ровно один символ по запросу
[16:17:40] <ermine> т.е. я точно устанавливаю, что бэктрекинг не нужен
[16:18:08] <gds> а, тогда соптимизировать на чанковости не получится.
а бэктрекинг тут до жопы, кстати, сколько бы символов ни было.
[16:19:48] <ermine> не нужно, просто не нужно уже проверять пуст ли чанк или нет, это уже а-ля камлевый stream, ыдает Some или None, если None, то как обычно - возвращаешь IE_cont
[16:20:18] <ermine> а внутри чанка обычная строка (не массв), позиция и длина и декодер
[16:21:08] <ermine> мне приснился страшный сон, в котором кто-то с пеной у рта доказывал, что больше не надо думать про обычные string, ибо в нашу эпоху любой символ - это int
[16:21:37] <gds> т.е. каждый элемент оборачиваешь в option?  у меня такого не будет, точно.
про обычную строку -- расскажи.  позиция-длина utf8-символа?
[16:21:40] <ermine> а поэтому пофигу как декодить, просто в инт или через iconv
[16:22:14] <ermine> и даже теперь есть гарантия, что можно вернуть остаток неиспользованной строки
[16:22:28] <ermine> вот
[16:22:57] <gds> ermine, прошу, выражайся чуть более конкретно, у меня парсер ломается.
[16:23:17] <ermine> да, у меня процессинг данных двухслойный, сначала один тип стримов, внутри другой тип
[16:23:40] <gds> кстати, в итератах тоже можно остаток вернуть.  распасить/схавать нужное и всё.
[16:23:46] <ermine> из самого внешнего итерата, который читает файл/канал, стрим - это строка и ее длина
[16:24:06] <ermine> а следующий итерат уже беспокоится во что превращать стрим
[16:24:25] <ermine> gds: в общем, спасибо за технологию, я с ней счастлива :)
[16:24:35] <gds> Олегу спасибо, да :)
[16:25:16] <ermine> я детище Олега как-то немного извратила
[16:25:26] <ermine> оставила только принцип фолдинга
[16:26:32] <ermine> теперь бы дописать интерпретатор грамматики, и можно будет создавать репу на гитхубе
[16:27:16] <gds> а я вот буду писать итерат, который будет (в типах из http://paste.in.ua/3196/ ) брать input_token, и с помощью ещё пары шагов делать tree.  А парсинг собственно входного языка будет до него.  А разбиение байтиков на символьчики -- собственно до парсера входного языка.  У тебя, вроде, такое структурирование программы не выходит.
[16:28:50] <gds> то есть, я могу и буду писать программу так, как надо -- а именно, сначала будет ядро, собственно первый пункт.  обвеска -- потом.
[16:29:12] <gds> * так, как мне надо
[16:29:22] <ermine> да вот, в своей интерпретации грамматики я думаю порождать следующий итерат, который как раз из инпута делает токены, потому что никак не могу придумать про attribute grammar
[16:29:57] <ermine> но это наверное временное затруднение
[16:29:58] <gds> то есть, концепция твоя, как я понял, это -- первый итерат фиксировано берёт из string, а дальше уже извращения?
[16:30:22] <ermine> главное было отвязаться от навязчивой идеи использования монад и комбинаторов
[16:32:07] <gds> комбинаторы -- тупо удобство, чтобы побыстрее и поошибкозащищённее.  монады -- тупо клей.
кстати, я создал весьма годный проект, как в итератах отвязаться почти от всех монад, оставить только монаду Identity, чтобы можно было выбросить lwt.  Пока не нужно особо, но проект есть.  Меняем одну монаду на другую и всё.
[16:32:17] <ermine> gds: не, у Киселева же есть итераты, которые трансформируют, это оно и есть
[16:34:16] <Kakadu> gds: да, дело только в  int vs string
[16:35:06] <Kakadu> ermine: про читать хором это хорошо. Будем вместе разбираться, в январе сдавать это  gds'у на оценку.
[16:35:25] <ermine> с int vs string - вопрос еще в том, что такое строка из интов: список, массив или структура с декодером
[16:37:04] <gds> только не знаю, годится ли эта конфа для "чтения вслух".  имхо не очень.
да и вообще, всем будет лениво.  кроме того, базовые вещи я смогу рассказать, а дальше -- жопка.  с другой стороны, повод мне разобраться.  а на самый худой конец можно будет пригласить специалюг.
[16:38:33] <ermine> {buf: string; len: int; pos: int: decode: (string -> int -> (OK of уникодный символ) * (новая позиция) | Ошибки декодинга)) Ъ
[16:39:56] ermine поскакала за пиццей
[16:43:51] <gds> ermine: у тебя идёт оптимизация сразу, а у меня сразу идёт рабочий код, который я смогу по указаниям профайлера оптимизировать, будь на то нужда.  Так-то!
[16:46:21] <ermine> gds: не сразу, если у меня под рукой уже есть собственный код парсинга xml
[16:46:30] <ermine> gds: сам видел, сколько там строк :)
[16:47:18] <ermine> и оно жутко тормозид, а еще унылое настроение во время кодирования попыток сравнения двух строк через уникоду
[16:48:58] <ermine> короче, будет лучше чем старый код
[16:49:18] <gds> а глядела, что именно тормозит в текущем варианте?  Если побайтовое и посимвольное доставание, то не поможет же.
[16:50:02] <ermine> gds: партиал аппликешн
[16:50:22] <ermine> остального за ним не видно было
[19:25:39] ermine глянула в книжку маклейна и ужаснулась
[19:25:53] <ermine> ну, как-нить попробуем почитать по странице в день и жевать
[19:29:51] <gds> маклейна -- я уже год читаю потихоньку.  это не беда.  просто читай и вникай.  но не во всё -- в сложный мотан не надо.  кстати, я долбал знакомого категорщика, он мне клёвые примеры подкидывал.  может действительно как-то это обособить от камла, если будет большой поток оффтопика.
но хз, в формате чата или нет.  может lj\category_theory или как его там.
[19:48:59] <Kakadu> ничего, разберемся как-нибудь
[20:16:41] <bobry> товарищи, а можно как нибудь в камле поюзать сишные short / char для интов?
[20:17:13] <bobry> а то мне для школы нужно решать задачки, а там везде ограничения на память такие что просто int не влезает
[20:17:23] <bobry> приходится мучаться на богомерзком с :(
[20:49:06] <ermine> bobry: камло не настолько императивен, чтобы заниматься такими детскими глупостями ранних языков
[20:49:27] <bobry> :(
[20:49:51] <gds> bobry: лиминтарно.  см. InfixOps.md или как там его, там есть пример с "реализация интов с переполнением".  вот, по обрезу и подобию.
можно вкодить тип так, чтобы в рантайме определять тип операции, типа Short 123 + Int 234 = Int 357
[20:50:26] <ermine> я вот тоже страдала со строками: список интов уникоды или как, расслабилась когда привела выше приведенную стркутуру
[20:50:46] <ermine> а то инт - это или 32 бита или аж 64 бита, ууу
[20:51:01] <ermine> а в строке усе компактно
[20:51:27] <Kakadu> bobry: напиши язык с камловым синтаксисом, где инты такие какие тебе нужны
[20:51:29] <gds> зато адресация utf8-символов -- ад.  Проще было bigarray int32 какой-нибудь.
[20:51:29] <Kakadu> )
[20:52:40] <ermine> чтобы написать новый язык, надо владеть категориями
[20:53:13] <ermine> и программировать какую-то категориальную абстрактную машину всякими лямбда-исчислениями и теориями вычислений
[20:53:18] letrec вышел(а) из комнаты
[20:54:39] <gds> ermine: ты порешь!
[20:55:13] <ermine> gds: нед!
[20:55:19] <gds> * нерд
[20:57:47] <gds> вообще, если по уму, для реализации языка программирования действительно неплохо бы представлять декартово-замкнутую категорию его типов _и_ значений.  Но кому это нахрен нужно?  C++ и Java работают и так замечательно.  Похапэ так вообще звизда!  (да, я завидую.)
[20:58:57] <ermine> gds: а ты уже освоил КАМ? (кстати, основа камля..)
[20:59:21] <ermine> CAM если уж латинскими пуквами
[21:00:21] <ermine> gds: давай как-нить разработаем декоративный язык
[21:00:54] <gds> CAM -- читал, понял, забыл.  Не проняло до глубины души, но штука годная, практичная (судя по байткоду камла, как я понимаю -- хрен у кого такой быстрый байткод есть).
[21:01:18] <gds> ermine: будем действовать в категориях Рюшечек, Свистелок и Перделок?
[21:02:14] <ermine> о да, ты шаришь, если уже и байткод одобряешь
[21:02:58] <ermine> gds: я пока таких фамилией не знаю, знаю только про числа Брейна
[21:03:13] <ermine> это про байткод такая шутка
[21:03:38] <ermine> Kakadu: а у вас подобных лекций не читают?
[21:14:32] Typhon вошёл(а) в комнату
[21:16:23] <gds> кстати, про short/int/long -- плохо то, что, когда понимаешь, как всё клёво замутить, таких заданий уже не задают :)
[21:17:01] <Kakadu> ermine: Про теоркат?
[21:18:03] ermine начала приставать а кффтару развивающейся ветки lablgtk
[21:19:49] <ermine> Kakadu: ну еще не теоркат, но лямбда вычисления, теория автоматов, теория алгоритмов, теория вычислений и тд и прочие теории computer science
[21:20:48] <gds> ermine: это не нужно.  я привёл примеры успешных языков.  там принцип "чем хуже, тем лучше".
[21:21:15] <Kakadu> теоркат есть, но совсем факультативно. Теории алгорифмов касались. Про автоматы и КС грамматики говорили. Что такое теория вычислений не знаю.
[21:21:16] <ermine> а может это курс "теория языков и компиляторов"
[21:21:24] <ermine> вроде у них программа схожая
[21:21:51] <Kakadu> Про то как канпеляторы на императивщине писать рассказывали
[21:23:13] <ermine> Kakadu: а зачем - не рассказывали?
[21:23:55] <Kakadu> ну препод канпелятор паскаля для сана писал в 90х
[21:24:10] <Kakadu> а про функциональщину он только знает что она существует
[21:26:07] <ermine> ну существует в виде партиал аппликешна или взятия только первого аргумента, но мне вот интересно почему выкидывают второй
[21:35:39] <ermine> тэкс
[21:38:07] <ermine> блин, интерпретилка грамматики за день не успела свариться, итераты мешают, мать их!
[21:39:38] <ermine> Kakadu: кстати, разработчик живой ветки lablgtk использует смесь make и build.ml, непонятно чо за такая мода нонче пошла, не к добру это
[21:40:36] <Kakadu> угу
[21:41:18] <ermine> но у него собралось без добавлений моих путей куда-то еще
[21:41:42] <Kakadu> а что за чел то?
[21:41:58] <ermine> adrien mader
[21:42:20] <ermine> гит lablgtk на форге, его добавления там в бранчах
[21:42:29] <gds> фамильё неправильное
[21:43:36] <ermine> ага, у него фром собсно без фамилии :)
[21:43:48] <ermine> чота показалось, что мадер
[21:44:42] <ermine> gds: а как правильно и откуда знаешь?
[21:45:25] <gds> как-то за что-то говорили с ним.  вроде провенду.  nader
[21:45:57] <gds> да, имяфамилия ищутся, в гуглотой находятся на камлофорже в качестве первой ссылки.
[21:47:07] <Kakadu> дык это adrien из из ирки! так бы сразу и сказали
[21:47:56] ermine никакой ирки не знает
[21:48:20] <ermine> возможно что общительный чуваг
[21:48:24] <ermine> это гуд
[21:50:29] Typhon вышел(а) из комнаты: Replaced by new connection
[21:50:31] Typhon вошёл(а) в комнату
[22:15:32] ermine вышел(а) из комнаты
[22:58:22] shaggie вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!