Home
Objective Caml
ocaml@conference.jabber.ru
Пятница, 20 мая 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:01:38] <Kakadu> а я только что понял почему revised это круто.
[00:02:06] <Kakadu> потому что если уже есть [a;b;c]
[00:02:29] <Kakadu> то породить список очень длинный и приписать его туда не составляет проблем
[00:04:27] <komar> Э-э, шо?
[00:05:06] <Kakadu> ну ты написал два пункта меню: начало и редактирование
[00:05:20] <komar> И, кстати, у меня на устройстве ssh-клиент, а птиц со свинями нету.
[00:05:55] <Kakadu> потом понял что надо ещё издалека список взять и приписать
[00:06:23] <Kakadu> тебе нужно либо много :: либо один @
[00:06:40] <Kakadu> а в revised просто через ; написать
[00:07:16] <ygrek> не в том сила
[00:09:03] <komar> Kakadu: не понял, как?
[00:14:35] <Kakadu> вроде если было в обычном x::y::z::t то в revised это [x; y; z :: t]
[00:15:02] <Kakadu> т.е. превратить из [a;b;c] в a::b::c::lst сложнее чем из
[00:15:13] <komar> А, понял.
[00:15:18] <komar> Да, прикольно.
[00:28:55] olegfink вошёл(а) в комнату
[00:33:34] <ermine> Kakadu: сдал модули ядра?
[00:34:00] <Kakadu> ermine: не-а, только распечатал blk.c
[00:34:16] <Kakadu> хотел спросить на #linux
[00:34:23] <Kakadu> в итоге я им еле объяснил
[00:34:37] <Kakadu> и получил ответ "ну коль ты такой умный что к нам пришел"
[00:35:52] <Kakadu> ermine: кстати, про какую css ты вчера читала? чтонить любопытное есть? а то я ни ухом, ни рылом
[00:39:44] <ermine> Kakadu: http://softwaremaniacs.org/blog/category/primer/
[00:42:35] <Kakadu> ermine: отлично, полистаю как-нибудь
[00:43:18] <ermine> Kakadu: да, оно того стоит, жалко, что тот мужик тогда забил на это дело
[00:43:55] ermine придумала себе новый проект с оксигенем и сетапит его
[01:15:10] <ermine> понеслось 8)
[01:18:19] ermine вышел(а) из комнаты
[01:27:28] Kakadu вышел(а) из комнаты
[01:30:04] ygrek вышел(а) из комнаты
[01:51:51] Typhon вышел(а) из комнаты
[02:11:54] zert вышел(а) из комнаты
[08:56:38] gds вошёл(а) в комнату
[09:44:41] Typhon вошёл(а) в комнату
[09:45:18] Typhon вышел(а) из комнаты
[10:37:12] ygrek вошёл(а) в комнату
[10:57:36] ftrvxmtrx вышел(а) из комнаты
[10:58:25] Typhon вошёл(а) в комнату
[11:00:19] gds вышел(а) из комнаты: Replaced by new connection
[11:00:20] gds вошёл(а) в комнату
[11:06:35] <gds> вынесено из другого разговора:
"думаю, что надо намонстрячить общий интерфейс к "коллекциям ключ=>значение", которые могут быть сортированным массивом, списком, мапкой, хештаблицей.  (дбм, сикель, днс...)
сделаю полностью императивный интерфейс, а мапка будет на самом деле ссылкой мапку (ref).
надо и функциональный сделать (его -- в первую очередь, а его можно уже будет обернуть в императивный) -- для ассоциативных списков, сортированных массивов, мапок."
и думаю -- не слишком ли явный велосипед я изобретаю?
то есть, что хочу: набросать объектные типы (можно и первоклассные модули, но не уверен), имеющие нужный набор методов, одинаковый для простых случаев: get для всех интерфейсов, put для императивных, add для функциональных, ну и всё такое: fold/iter, concat.
[11:09:10] Kakadu вошёл(а) в комнату
[11:12:07] ygrek вышел(а) из комнаты
[11:12:32] Kakadu вышел(а) из комнаты
[11:12:50] Kakadu вошёл(а) в комнату
[11:36:12] ftrvxmtrx вошёл(а) в комнату
[11:44:49] ermine вошёл(а) в комнату
[11:50:36] <ermine> gds: видел мою новую репку на гитхабе? можешь смотреть туда как в зеркало
[11:51:09] ermine раздумывает, что сегодня туда добавить - форму логина или форму поста
[11:53:01] <gds> ermine: не видел.  смотреть https://github.com/ermine/erm_blog ?
[11:54:20] <ermine> gds: ага
[11:54:39] <ermine> gds: я постараюсь чтобы оно развивалось максимально на виду
[11:55:44] <ermine> gds: оно отображается на http://ermine.camlunity.ru
[11:57:03] <ermine> любые плевки и чмоки приветствуются, а также советы
[11:57:43] <Kakadu> ermine: наверное myocamlbuild.ml и setup.ml надо убить из репозитория... они же вроде из _oasis генерятся или не?
[11:58:35] <ermine> Kakadu: нет, они нужны там где нет оазиса
[11:58:49] <gds> ага, идею понял, буду зырить в репку.
кстати вот, недавно поборол своё нежелание публиковать кривые коммиты.  сейчас публикую все, которые есть, даже мелкие и недоделанные.  в случае, когда выделываются, делаю ветку stable и держу её ок.
[11:59:12] <ermine> Kakadu: и собирать ocaml setup.ml -configure, ocaml setup.ml -build, -install, -uninstall
[11:59:45] <Kakadu> ermine: да понятно как собирать)
[12:01:03] <Typhon> если их убрать, придётся oasis setup делать перед сборкой, а озиса и не быть может!1!
[12:02:04] <ermine> gds: ну коммитить всё подряд и так можно, мало кто читает их как художественную прозу или вообще читает, чтобы оценить кривизну
[12:02:08] <Typhon> ermine: а где BuildDepends: giska ? (или как там модуль для гита назвали?)
[12:02:49] <ermine> Typhon: пока нету!
[12:05:50] <gds> кстати, гиска -- это http://tinyurl.com/6bvqhwb
[12:07:28] <ermine> Typhon: а еще хочу маркдаун с визуализацией! где они???
[12:07:46] <ermine> блин, еще и капчу придеца публиковать
[12:08:13] <ermine> вопрос - насколько безопасно публиковать алгоритм капчи
[12:19:48] <Typhon> """стойкость шифра должна определяться только секретностью ключа""" ;-) к капчам применимо, интересно?
[12:20:31] <gds> тоже вспоминал это.  частично применимо, но, зная алгоритм, можно набрутфорсить за весьма конечное время, если данный случай рассматривать.
[12:26:39] <gds> так насчёт mappable/foldable -- если критики (кроме "кому это нахрен нужно?") нет, то как обозвать репку-пакет?  ocaml-data-intf и data_intf?  кривовато.
[12:36:06] komar вышел(а) из комнаты: Replaced by new connection
[12:36:06] komar вошёл(а) в комнату
[12:40:34] komar вышел(а) из комнаты: Replaced by new connection
[12:40:34] komar вошёл(а) в комнату
[13:04:40] zert вошёл(а) в комнату
[13:05:30] gds вышел(а) из комнаты
[13:30:58] ftrvxmtrx вышел(а) из комнаты
[13:35:22] ftrvxmtrx вошёл(а) в комнату
[13:44:55] ftrvxmtrx вышел(а) из комнаты
[14:06:38] ftrvxmtrx вошёл(а) в комнату
[14:23:16] ygrek вошёл(а) в комнату
[14:23:31] ygrek вышел(а) из комнаты
[14:49:15] <ermine> что надо сделать такое, чтобы при компиляции можно было задействовать опцию, указанную юзером?
[14:49:31] <ermine> в конкретном случае - надо указать файл шрифта для капчи
[14:50:20] <ermine> тупой путь - закарходить в код определенное имя шрифта и сам шрифт добавить в репу
[14:50:27] <ermine> а белые негры как делают?
[14:51:00] ermine пишет форму логина для erm_blog
[14:51:42] <Typhon> а почему во время компеляции это надо делать? а в райнтайме нельзя менять шрифты? так надо добавить какую-нибудь опцию в конфигурь, наверное
[14:52:40] <ermine> Typhon: шрифт вкомпиливается в бинарь
[14:53:25] <ermine> Typhon: ну это код капчи, который используется на jabber.ru, я щас делаю форк этой капчи, выдирая шрифт :)
[14:53:34] <ermine> форк будет на гитхубе
[14:55:36] <ermine> щас имя шрифта захардкочен в myocamlbuild.ml, и сам шрифт в репе
[15:05:20] ftrvxmtrx вышел(а) из комнаты
[15:07:15] ftrvxmtrx вошёл(а) в комнату
[15:31:45] Kakadu вышел(а) из комнаты
[15:51:28] <f[x]> ermine: в oasis :
FilesAB: Files to generate using environment variable substitution.
[15:51:41] <f[x]> а variable берётся из configure
[15:51:54] <f[x]> либо в prebuild'е если надо что-то более сложное
[15:55:22] <ermine> f[x]: оазис - не тот случай
[15:55:49] <Typhon> ну так заодно и на оазис перепишешь :-)
[15:56:12] <ermine> еще можно брать из env :)
[15:56:58] <ermine> ладно, сделаю как-нить некрасиво, потом макияж наведу
[15:58:05] gds вошёл(а) в комнату
[15:58:49] <Typhon> gds: по поводу "mappable/foldable" — есть не критика, но живой интерес — зачем и как ты хочешь использовать такое?
[15:59:57] <Typhon> название — "kakeva" — kamlo key value ^_^ (у меня любовь к дурацким названиям, ага :-) )
[16:01:50] <ermine> Typhon: надо было сначала проконсультироваться по поводу названия erm_blog
[16:05:02] <gds> Typhon: использовать -- 1. там, где неизвестно, какая структура данных будет лучше (assoc list, sorted array, map, hashtbl), чтобы можно было переткнуть тип контейнера и изучить новую производительность, 2. для отсутствия привязки алгоритма к конкретной структуре, 3. для гибкасти -- под key-value попадает и директория файловой системы, и днс, и запрос к бд.  В частности, это мне надо для веб-сервера, там каждый компонент пути будет матчиться сначала по соответствиям "компонент -> обрабатывающая функция" (затем будет выбираться функция для "не найдено"), и можно будет с помощью этих подмен сделать хоть роутинг запросов, хоть отображение файловой системы для раздачи статики -- в общем, паттерн попал мне на глоза, и я его не отпущу, пока не накодю.
[16:05:53] <gds> Typhon: названия у тебя хорошие, один cobson чего стоит :)  Но тут скорее не key-value, а просто, "общие интерфейсы к данным" -- и массивы, и списки, и множества тут будут, по мере нужды.
[16:07:06] <gds> кстати, думаю таки на объектах лепить.  Модули было бы конечно идеально, но старое камло тоже нада.  А с функторами уже наплясался, как бы хватило.  А тут и подтипизация будет нахаляву.
[16:11:13] <Typhon> ermine: из blog и ermine можно собрать ругательное слово запросто :-)
[16:13:16] <Typhon> gds: прикольное слово "кадастр" — типа, камло, дата структуры :-) французское, к тому же
[16:13:44] <gds> погуглю, но сходу только каподастр знаю.
[16:14:04] <Typhon> список, реестр <http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B5%D1%81%D1%82%D1%80> чего-либо или кого-либо, например, землепользователей, подлежащих налогообложению. Само это слово происходит от средневекового лат. <http://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D1%82%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA> catastrum, то есть capitastrum (от caput — голова), которое означало регистр душ, подлежавших поголовной подати.
[16:16:52] <gds> ага.  Нравится.  Типа "реестр интерфейсов к структурам данных".
[16:17:01] <Typhon> угу
[16:18:42] <gds> и, наверное, cadastr, а не cadastre, чтобы гуглилось лучше, да и "ca"ml "da"ta "str"uctures, а не "str"e..., всё-таки.
[16:26:42] <gds> какой замечательный веб-сервер на jabber.ru -- "nginx-catap/1.0.0".
[16:33:34] Kakadu вошёл(а) в комнату
[17:23:33] <ermine> гавно
[17:23:44] olegfink вышел(а) из комнаты
[17:23:58] <ermine> может, заменить на итераты
[17:24:12] <gds> да ладно, падать в корку при кривом конфиге -- это самый шик сейчас.
[17:24:37] <gds> про итераты -- мне по-любому тестить их придётся под нагрузкой, потестю -- сообщу результаты.
[17:25:07] <ermine> Typhon: там в nginx используется большей частью proxy_pass
[17:25:15] <ermine> тьфу
[17:25:21] <ermine> это к gds
[17:26:15] <gds> тогда что вообще нужно от nginx?  работает -- не трожь :)  однако про чанкед помню.
[17:26:37] <ermine> чанки, редирект
[17:26:55] <gds> ну какой-то редирект там точно есть, даже пробовал давно.
[17:27:29] <ermine> катап написал патч, который позволяет proxy_pass самостоятельно отрабатывать редирект
[17:27:46] <ermine> но потом оказалось, что nginx еще и не умеет чанки от бэкенда
[17:28:23] <gds> если _от_ бэкенда не умеет, то в чём проблема?  Connection:close и лить до упора.
[17:28:39] <ermine> gds: осилишь get, post, chunked, redirect - зови меня в бетатестеры
[17:29:23] <ermine> gds: ну это к сысоеву, не ко мне
[17:29:41] <ermine> нету там вроде connection: close, там многоэтажный чанк
[17:30:22] <ermine> и кстати, не факт, что апач тоже умеет отдавать такой ответ от бэкенда
[17:30:35] <gds> так и не понял, в чём проблема с чанками от бекенда.
[17:30:35] <ermine> но проверить кому-либо такой случай лень :)
[17:31:06] <gds> про тестинг -- понел.  Фактически осталось сделать "сервисы с человеческим летсом", chunked на итератах Олег сделал Сам, редирект -- вроде бы, проблем нет (или я их просто не вижу).
[17:31:16] <ermine> gds: в nginx проблема в апи всего лишь
[17:31:39] ermine тут столкнулась с проблемой в апи елиома и втупилась
[17:31:50] <ermine> апи - такая злая шутка
[17:33:01] <gds> в общем, слава С-т-не, я nginx'а касаюсь редко и несерьёзно, поэтому забьём на него.
[17:34:29] <ermine> двигай итераты
[17:35:14] <gds> ща кадастр => человеческие сервисы => остальное, а остальное -- это и итераты в том числе.
[17:36:00] <ermine> gds: в смысле, я уже вижу практическое применение итератеев
[17:36:16] <gds> фигассе.  колись!
[17:36:43] <ermine> вместо нгинха с его прокси_пасс
[17:37:55] <ermine> чо, не радует такое практическое применение?
[17:38:45] <gds> приличное.  Но надо посмотреть по производительности, не будет ли оно тупить.  По идее нет, но всё же.
[17:41:09] <ermine> вдобавок там всё просто - получить запрос от юзера, отправить его бэкенду, получить ответ, отдать юзеру, и таких бэкендов у нас несколько
[17:44:28] <gds> тут у меня проблемка, о которой я никому не говорил до этого момента...  Итераты у меня работают с элементами любого типа, сложенные в массивы (фактически, работа с под-массивами: array 'a + ofs + len).  Ну вот, имеем array char...
[17:45:01] <gds> конечно помню, что асиливал хак для "унификации" массивов и строк, но всё же, надо подумать.
[17:45:43] <gds> да и там Obj.  Не комуфло, как говорится.
[17:46:12] <gds> а честные биндинги оформлять -- не будут инлайниться даже при большом желании.
[17:56:35] <gds> кстати вот, хз как проверить, на чём больше потерь -- на проверке Obj.tag при каждой операции с так называемым "массивом", либо на конвертации строки в массив и назад и на потерях в памяти и в кеше при обработке данных.
[17:57:19] <gds> хз как проверить без переписывания кода, имею ввиду.  бенчмарки может и ок, но хз.
[17:58:23] <ermine> gds: чож ты разрушаешь сказку?
[17:58:53] <gds> ненавижу магию в реальной жизни (в том числе Obj.magic).
[17:59:51] <ermine> ну значит не видать мне итератеев вместо нгинкса
[18:02:35] <gds> ну как посмотреть.  Я-то сделаю, потестю своё, а далее, если чо, помогу с прокси_пасс.
Но вообще, разве это проблема, что строки занимают в 4 раза больше памяти и жрут в 4 раза больше процессорного кеша?  Это мелочи.  Вон, кому ни скажи, все так скажут, что мелочи.
[18:06:07] <gds> и вообще, посмотрел насчёт mappable.  "Это уже было в батарейках!".  Плюс в карму батареечникам.  Там ml-style решение: всякие list 'a, array 'a вероятно объявляются в соответствующих модулях как mappable 'a (предположение, но наверняка верное), и есть Data.Mappable.map, который ('a -> 'b) -> mappable 'a -> mappable 'b.  С другой стороны, тот же Map является mappable как по ключу, так и по значению.  Неудобняк у ребят получится.
С другой стороны, мне нужно далеко не mappable, т.е. не "применимость функции map".
[18:06:12] ermine пока без собственного бэкенда в уме не особо понимает, о чем речь
[18:06:49] <gds> дык ocsigen мучаешь же, бэкенды должны быть.
[18:07:28] <ermine> про array - не в курсе
[18:07:35] <Typhon> gds: а зачем строки жрут в 4 раза больше? ты их как-то иначе представляешь штоле?
[18:07:55] <gds> "Итераты у меня работают с элементами любого типа, сложенные в массивы (фактически, работа с под-массивами: array 'a + ofs + len).  Ну вот, имеем array char..."
[18:09:26] <Typhon> хм, надо покурить про эти итераты, видимо, чтобы толком въехать. массив строк не подойдёт, потому что оффсеты "негибкие". а сабстринги тут никаким боком, а?
[18:10:13] <ermine> gds: а что бывает кроме char, на практике?
[18:10:51] <gds> Typhon: а там массив строк не нужен, там работа с чанками.  В х-е это просто списки элементов, но нам нужно лучше.  substrings -- пойдёт и даже очень, но см. следующую реплику.
[18:14:09] <gds> ermine: итераты -- штука универсальная, на этом построено очень много всего.  Потоки не только символов обрабатываются.  Если бы целью было просто распарсить строки и сложить в список/поток, то подошли бы итераты над символами, где чанки хранились бы в строках (точнее, лучше было бы в substrings).  Но хочется больше -- enumeratees (комбинаторы над итератами), которыми реализуется и фрейминг, и "лимитирование" количества съеденных данных, и чанки, и прочее.  А там не сведёшь всё до итератов, кушающих только символы.
[18:18:29] <gds> во, пример из нужных: имея type uchar = int, и имея итерат с типом iteratee uchar 'a, я могу запустить его поверх потока байтов, фактически преобразовав его в iteratee char 'a.
[18:19:31] <gds> конечно, uchar -- коды символов, а преобразование -- это парсинг utf8.
[18:29:21] <ermine> gds: не, я спросила про практический случай
[18:29:42] <ermine> случай из практики :)
[18:32:02] <gds> ну вот, поток utf8 делал из потока char, разбирал его итератом, кушающим array int фактически.
[18:32:46] <ermine> клево
[18:32:55] <ermine> в этом смысл итератов, да
[18:33:44] <ermine> gds: тогда для моей задачи не особо подходит, в моей задаче все проще и скучнее
[18:35:13] <ermine> попсовее
[18:35:27] <gds> для твоей задачи -- брать первые n килобайт заголовка, парсить его тупо и шустро, и дальше решать, что-куда.  Если не влезло в n килобайт -- сами дураки, в топку их.
[18:39:00] <ermine> gds: не, итераты тут наверное хороши, что первый итератор берет поток байтов, второй итератор отдает уже распарсенные данные, но тут мне уже непонятно, как вставить третий итератор конвертирует всё это в поток обратно и шлет бэкенду, а где тут четвертый итератор, который принимает ответ от бэкенда - я промолчу
[18:39:27] <ermine> наверное, четвертый на самом деле и не четвертый, а опять же первый
[18:44:16] <gds> ermine: итераты в себе умеют ввод-вывод делать, поэтому первый итерат может возвращать вообще unit, а в это время припихивать данные, которые ему дают.  То есть, когда понятно, кому данные -- устанавливаем соединение к апстриму (имеем сокет), запускаем lwt-тред для приёма данных (1), и дальше форвардим тельце, опционально как-либо преобразованное, в апстрим.  В потоке (1) можно либо напрямую отдавать, либо теми же итератами пофиксить заголовки как надо, ну и всякие нужные штуки сделать -- чанкед, например.  То есть, итераты -- они в одном направлении работают, но lwt-потока может быть два.
[18:45:14] <gds> будет не одна труба, а две (для запросов и для ответов), возможно как-то связанные изнутри.
[18:46:57] <gds> итераты работают поверх IO-манатки, а там -- что хочешь, то и используешь.  Хочешь стандартный окамловский ввод-вывод -- берёшь его (с небольшим оверхедом, конечно), хочешь lwt -- берёшь его, заодно и параллельность можешь использовать.  От IO-манатки (модуля) важно, чтобы этот модуль реализовывал как минимум то, что от него требуют, а если будет больше -- не беда.
[18:52:16] <gds> ещё один милый момент с итератами.  оверхед ввода-вывода, как и вообще, стратегию ввода-вывода, определяет ровно один кусок кода -- enumerator.  Он берёт нужные данные на вход (имя файла, сокет, канал), читает оттуда так, как ему удобно (например, строго чанками по 4кб), а дальше, как бы итерат ни хотел, реальное чтение ему не в силах вызвать (пока не асилит весь чанк, конечно).
[19:09:09] Digimmortal вошёл(а) в комнату
[19:10:05] Digimmortal вышел(а) из комнаты
[19:10:31] Digimmortal вошёл(а) в комнату
[20:03:37] Digimmortal вышел(а) из комнаты
[20:12:56] ftrvxmtrx вышел(а) из комнаты
[20:17:19] <gds> придумался ещё один метод, как можно итератами часть потока обработать культурно, а часть тупо форвардить без особых задержек.  Так называемые recoverable errors.  Можно кинуть такую ошибку, которую словит Кто Надо и отфорвардит нужное количество байтов без привлечения итератов, а по окончании этого дела передаст управление обратно итерату.  Я на практике не пользовал recoverable errors, но у Олега есть сэмпл с ними -- читает tiff-файл и seek'ает по мере необходимости, именно через такие ошибки.  Понятно, что "нецелевое использование", но кто не писал raise Exit для прерывания выполнения кода :)
[20:23:52] ftrvxmtrx вошёл(а) в комнату
[20:39:39] <gds> не, функторы над модулем IO -- это неудобно.  Любая мелочь, которая работает с вводом-выводом и итератами, требует завернуть себя в функтор.  А там, если в интерфейсе модуля есть оба модуля, надо ещё следить за type sharing, чтобы компилятору было ясно, что эти итераты построены именно поверх этого ввода-вывода.
Думаю сделать модуль типа "current_io.ml", в котором делать include нужного модуля ввода-вывода.  Всё равно пока с lwt работаю только.
Но это криво.  Есть идеи получше?
[21:11:29] komar вышел(а) из комнаты
[21:11:38] komar вошёл(а) в комнату
[21:11:41] komar вышел(а) из комнаты
[21:11:49] komar вошёл(а) в комнату
[21:11:56] komar вышел(а) из комнаты
[21:12:05] komar вошёл(а) в комнату
[21:37:59] ftrvxmtrx вышел(а) из комнаты
[21:40:16] ygrek вошёл(а) в комнату
[21:40:30] ygrek вышел(а) из комнаты
[21:40:57] ygrek вошёл(а) в комнату
[21:44:55] ygrek вышел(а) из комнаты: Replaced by new connection
[21:44:59] ygrek вошёл(а) в комнату
[22:02:56] Typhon вышел(а) из комнаты
[22:56:41] <ygrek> lold http://ru-lambda.livejournal.com/129496.html
[23:06:05] <Kakadu> ну видел  и что?
[23:06:37] ftrvxmtrx вошёл(а) в комнату
[23:46:11] <ermine> забавное кривое css получилось на ermine.camlunity.ru
[23:46:50] ermine выполнила туду на сегодня
[23:48:26] ermine запушила на гитхуб
[23:50:16] <ermine> все уже залогинились?
[23:54:37] <gds> вы когда-нибудь видели леденящий душу ужас, от которого стекает пот по спине, взгляд каменеет и хочется развидеть всё?  Я вам покажу.  Но потом не говорите, что я не предупреждал.  http://paste.in.ua/2427/
[23:58:55] <ermine> в этом еще разбираться надо
[23:59:00] <ermine> а что оно делает?
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!