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

GMT+3
[00:16:57] <ermine> а блин, проблема всего лишь из-за того, что списки дополняются с головы и потом их надо развертывать в обратном порядке
[01:02:16] iNode вошёл(а) в комнату
[01:17:53] Typhon вышел(а) из комнаты: Replaced by new connection
[01:17:56] Typhon вошёл(а) в комнату
[01:24:09] Typhon вышел(а) из комнаты
[02:42:55] aloner2k вошёл(а) в комнату
[03:15:03] ExplicitCall вышел(а) из комнаты
[03:28:51] aloner2k вышел(а) из комнаты
[03:41:15] ExplicitCall вошёл(а) в комнату
[07:46:26] geovit вошёл(а) в комнату
[07:52:59] iNode вышел(а) из комнаты
[08:29:30] <gds> ermine: unit ref в качестве ключа -- бессмысленно: если брать хеш структурный, он будет одинаковым, а если брать в качестве хеша что-то, получаемое из адреса ячейки, то он будет меняться после работы сборщика мусора. (т.е. даже для map не заюзаешь)
Давай задачу полнее, подумаем.
[08:29:34] gds вышел(а) из комнаты
[09:03:48] gds вошёл(а) в комнату
[09:12:40] <gds> кто-нибудь пользовал на практике lazy patterns?
[09:36:25] iNode вошёл(а) в комнату
[10:07:30] Typhon вошёл(а) в комнату
[10:28:27] ygrek вошёл(а) в комнату
[10:37:09] animist вошёл(а) в комнату
[10:40:34] sevenov вышел(а) из комнаты
[10:42:07] animist вышел(а) из комнаты: Replaced by new connection
[10:52:27] sevenov вошёл(а) в комнату
[10:57:15] ygrek вышел(а) из комнаты
[11:34:32] animist вошёл(а) в комнату
[11:36:02] ygrek вошёл(а) в комнату
[11:45:22] animist вышел(а) из комнаты: Replaced by new connection
[11:45:37] animist вошёл(а) в комнату
[12:00:28] Dema вошёл(а) в комнату
[12:01:03] zert вошёл(а) в комнату
[12:01:18] zert вышел(а) из комнаты
[12:10:02] dottedmag вошёл(а) в комнату
[12:10:27] dottedmag решил подкинуть и сюда: http://nekovm.org/doc/nekoml
[12:10:40] <dottedmag > ocaml-inspired, компилируется в байткод nekovm
[12:36:06] <ermine> а зачем он нужен?
[12:41:23] <ygrek> embedded?
[12:41:34] <dottedmag > да, embedded
[12:45:25] <ygrek> так таки обычное камло не влазит?
[12:45:47] <dottedmag > Этого влазит больше.
[12:46:00] <ygrek> :)
[12:46:39] <dottedmag > Опять же, апстрим не дохлый.
[13:12:47] iNode вышел(а) из комнаты
[13:37:04] <sevenov> dottedmag точно везде :-)
[13:38:38] <sevenov> О, и Dema тут. Таки за камль решил взяться?
[13:38:57] <Dema> sevenov, не, просто почитать :)
[13:39:56] <sevenov> Dema, даже в haskell@cjr пишут чаще, чем в ocaml@ :D
[13:40:05] <Dema> :)
[13:40:39] <gds> я только поэтому там и не сижу. будь трафик более концентрированным, было бы интересно читать.
[13:40:57] <animist> dottedmag: у тебя есть планы скрещивать openinkpot и ocaml ?
[13:41:21] <dottedmag > animist: openinkpot и nekoml, скорее
[13:41:25] <dottedmag > А что их скрещивать?
[13:41:42] <animist> Я про package maintainance
[13:41:58] <dottedmag > эээ
[13:42:10] <dottedmag > я соберу neko/nekoml для OI. На этом package maintenance закончится.
[13:42:23] <animist> ясно
[13:42:55] <animist> А место nekoml в чём? UI? DBUS?
[13:43:04] <animist> в рамках OI
[13:43:11] <dottedmag > UI
[13:43:20] <animist> Спасибо
[13:44:26] <animist> Посмотрю на него тоже, ибо embedded это то, что мне нужно
[13:44:50] <dottedmag > Заодно и на IPlinux посмотри :)
[13:46:15] <animist> IPlinux это наследие slind ?
[13:46:24] <dottedmag > Да
[13:46:54] <animist> Меня после года с perchenon от slind немного воротит
[13:47:33] <dottedmag > А что именно? От чего меня воротило, то я взял напильник и исправил.
[13:47:45] <animist> Но я посмотрю на IPlinux :)
btw, virtuoso в IPlinux коммитит?
[13:47:49] <dottedmag > Нет.
[13:47:59] <dottedmag > Всё собирался, и никак не собрался.
[13:48:32] <gds> что за срань всё это?
[13:49:20] <animist> gds: долгая история :)
[13:49:33] <sevenov> gds, я вот тоже сижу читаю и думаю.
[13:49:42] <animist> Но ocaml, я смотрю, людей объединяет :)
[13:50:32] <gds> animist: разъединённые люди мне тоже нравятся.
[13:50:33] <animist> Я верю в embedded будущее ocaml, и потихоньку пытаюсь его приблизить
[13:51:05] <animist> А речь шла о полунаколенных embedded дистрибутивах
[13:51:06] <dottedmag > Таки-да. Исправить ошибку на сервере куда как проще, чем на десяти тысячах устройств.
[13:51:38] <dottedmag > Так что для эмбедщины все compile-time проверки хороши.
[13:54:15] <dottedmag > animist: я до вчерашнего дня собирался насиловать Lua. Но как-то динамический язык в девайсе использовать страшно.
[13:56:19] <sevenov> dottedmag , дык у него ж jit свой. Вполне шустро работает.
[13:56:34] <dottedmag > sceptic: jit у него для x86
[13:56:57] <sevenov> а, понятно.
[13:57:16] <dottedmag > sevenov: а страшно не из-за производительности (VM нормально работает), из-за того, что или тонна тестов, или поломается из-за того, что запятую забыли где-то.
[13:57:33] <dottedmag > UI тестить - вещь не самая приятная.
[13:59:02] <sevenov> ох, одни проблемы.
[14:01:50] Typhon вышел(а) из комнаты
[14:39:09] Str[i]ke® вошёл(а) в комнату
[14:40:48] Str[i]ke® вышел(а) из комнаты
[14:51:21] sevenov вышел(а) из комнаты
[14:51:39] sevenov вошёл(а) в комнату
[14:52:17] sevenov вышел(а) из комнаты
[14:52:31] sevenov вошёл(а) в комнату
[16:18:29] <ygrek> интересно, -g на скорость ведь не влияет? т.е. либу собирать так нормально?
[16:20:45] <ygrek> и ещё кто знает, куда положено вписывать -Wall -Wextra (для биндингов) в проекте с configure.in?
[16:32:31] <gds> смотря какова судьба -Wall -Wextra. Они всегда для биндингов нужны? Тогда пофиг, в myocamlbuild запихать даже можно.
[16:33:31] <gds> но вообще лучше брать CCOPT из окружения на момент вызова configure, где-нибудь сохранять, а потом дописывать к нему вещи, нужные только для биндингов.
[16:33:46] <gds> это если я правильно понимаю идеологию autoconf'а.
[16:34:43] <ygrek> ну, там сейчас подставлятся -g -O2 автоматически. можно сказать ./configure CFLAGS=.. но я хочу чтобы -Wall был всегда
[16:35:17] <gds> тогда там, где используется CFLAGS, добавлять -Wall, что ли.
[16:35:52] <ygrek> как-то не совсем тру, а вдруг компилятор не поддерживает такую опцию :)
[16:36:37] <ygrek> хотя /me таких компиляторов и не видел никогда, окромя msvc но там весь этот configure побоку
[16:43:50] <gds> посмотрел в доки на autoconf, сходу не нашёл готового способа проверки -Wall. Если что, можно и написать подобную проверку прямо в configure.in.
[16:44:46] <ygrek> мрак
[16:44:53] <ygrek> по-моему я самсебе придумываю проблемы
[16:46:49] <gds> проще тупо забить CFLAGS="${CFLAGS} -Wall" в configure.in, а при первом же багрепорте пофиксить.
[16:47:25] <ygrek> угу
[16:55:05] geovit вышел(а) из комнаты
[17:31:06] gds вышел(а) из комнаты
[17:41:02] iNode вошёл(а) в комнату
[17:52:13] ygrek вышел(а) из комнаты
[18:03:03] gds вошёл(а) в комнату
[18:08:14] Dema вышел(а) из комнаты
[18:28:26] michael.holub вошёл(а) в комнату
[18:28:27] michael.holub вышел(а) из комнаты
[18:44:08] ygrek вошёл(а) в комнату
[18:57:28] Mon вышел(а) из комнаты
[18:57:34] Mon вошёл(а) в комнату
[19:26:28] dottedmag вышел(а) из комнаты: Replaced by new connection
[19:26:41] dottedmag вошёл(а) в комнату
[19:42:27] Typhon вошёл(а) в комнату
[19:42:55] dottedmag вышел(а) из комнаты
[19:43:16] dottedmag вошёл(а) в комнату
[20:08:46] <ermine> gds: что лучше: List.rev (x :: List.rev xs)) или xs @ [x]?
[20:11:57] <gds> "лучше" -- понятие растяжимое. если не хранить в списках десятки тысяч элементов (чего делать по-любому не следует), то лучше xs @ [x].
[20:13:32] <ermine> gds: а что лучше вместо списков? нужен сортированнный список с возможностью вставки в нужное место
[20:14:01] ermine потихоньку оттачивает сульцю на мелочах
[20:14:25] <ermine> там в конце туннеля мигает прожектор поезда
[20:16:22] <ermine> кто там у нас хорошо делает деревья в камле?
[20:16:29] <ermine> hq
[20:16:47] <ermine> кажись у меня где-то была реализация hq
[20:17:10] <ermine> она основана на какой-то статье из википедии и применяет array
[20:18:07] <gds> как определяется "нужное место"?
[20:19:31] <ermine> приоритетом
[20:19:58] <ermine> http://github.com/ermine/scheduler/blob/a31456b3fcd32661c575436c8cd83460304abb0f/heapqueue.ml
[20:21:58] <ermine> там только одна проблема - массив штука нерезиновая
[20:22:34] <gds> ресайзить, значит.
в целом штука годная, если реализована правильно.
[20:31:21] Typhon вышел(а) из комнаты: Replaced by new connection
[20:31:24] Typhon вошёл(а) в комнату
[20:32:35] <gds> ermine: а сколько элементов ожидается в среднем, и как распределён "приоритет"?
[20:37:59] Typhon вышел(а) из комнаты: Replaced by new connection
[20:38:02] Typhon вошёл(а) в комнату
[20:45:44] <ermine> gds: не больше 10
[20:47:01] <gds> тогда бери список и xs::[x].
[20:47:16] <ermine> мне скорость важна
[20:47:30] <gds> на таких мелочах сильно не выиграешь умными структурами данных.
[20:47:34] <gds> такты считать будешь?
[20:47:36] <ermine> это хуки и хочется иметь возможность дополнять хуки на каждом чиху
[20:47:53] <ermine> и так на каждом пакете из джаббера
[20:48:27] <ermine> правда в данном случае обычно достаточно добавить в конец
[20:50:02] <gds> по сравнению со всем стеком парсеров и с остальными действиями, на списке экономии не будет заметно.
И можно сортировать список по отрицательному значению приоритета, если большинство добавлений идут в конец.
[20:55:13] <ermine> а прокрутка для исполнения - всегда с начала :)
[21:06:22] <gds> если список исполняется весь всегда, и его изменения внутри действия могут быть проигнорированы до следующего обхода, то почти пофиг, как по нему идти.
[21:07:37] <ermine> весь - хз
[21:07:45] <ermine> зависит от плагина
[21:08:27] <ermine> в общем, я медленно, как обычно, решаю разные теологические проблемы...
[21:11:12] <gds> да я тоже торможу с теологией, философией, типизацией и семантикой своей "разметки". и тоже думал, что всё будет гораздо быстрее. ан нет, сначала надо рассмотреть сотню вариантов и почти все откинуть.
[21:13:52] <ermine> да основная помеха как раз от типизации, мать ее туда-растудыть!
[21:14:32] <gds> основные проблемы начинаются, когда типизации нет, но позднее и массивнее.
[21:20:25] Typhon вышел(а) из комнаты
[21:33:02] <ermine> вот недавно я видела вживую игрушку Pleo
[21:33:17] <ermine> надеюсь до такого же уровня разумности довести сульцю
[21:40:28] <ygrek> мне ещё учиться и учиться у ermine придумывать себе заморочки :)
[21:41:28] <ermine> если у тебя нет заморочек, то это мне у тебя учиться надо
[21:42:30] <ermine> ygrek: а как давно ты камлишь?
[21:43:42] <ermine> когда я начинала сульцю - заморочек кажись вообще не было
[21:44:04] dottedmag .oO(камлаешь)
[21:44:56] <gds> да, без крепкого бубна сложно.
[21:45:19] <ermine> надо налить бейлиз
[21:45:22] <ygrek> ermine: где-то с 2007
[21:46:18] <ermine> ygrek: молодой еще!
[21:46:32] ermine из вежливости не сказала "салага!"
[21:48:38] <ygrek> я уже озвучивал классный принцип, про make it run
[21:48:47] Typhon вошёл(а) в комнату
[21:48:54] <ygrek> ну там и premature optimization где-то рядом
[21:49:29] <ermine> так оно всегда в начале
[21:49:37] <ermine> чем меньше знаешь - тем лучше спишь
[21:50:57] <dottedmag > ygrek: сначала оно всегда make it crawl
[21:51:07] <gds> но в списке на 10 элементов -- всё-таки нужно доверить вопрос производительности профайлеру.
[21:54:07] <ygrek> dottedmag : точнее make it compile :)
[22:00:45] <gds> у меня порой коммиты заканчивают стадию "make it typewritten", и то хорошо.
[22:02:34] <ermine> оо, одна заморочка отпала
[22:03:38] <ermine> ygrek: я пишу код и оно почти всегда компилится, но ожидаемый результат выполнения обычно не случается
[22:05:15] ermine тестит свой продукт недоразумений в sulci2@
[22:08:24] <ermine> ygrek: спасибо
[22:39:27] <ermine> ых
[22:44:19] <gds> ermine: в общем, хитра твоя задачка насчёт маркова. трудно уложить её на простые структуры данных. думал, но не придумалось ничего интересного из того, что не геморно было бы реализовать.
[22:45:36] <ermine> gds: таблица тупо простая - три поля: первое слово, второе слово и каунтер (частота встречаемости пары слов в тексте)
[22:45:52] <gds> простота таблицы -- не аргумент :)
[22:45:53] <ermine> таблица удобна чтобы инкрементить каунтер
[22:46:00] <gds> может по приколу почитать про fingertrees. если брать свой алгоритм их обхода, может и получится довести всё до культурного времени выполнения. и окамловские исходники где-то видел.
[22:46:12] <ermine> а вот выискивать нужную пару - надо щелкать все строчки с начала до..
[22:46:53] <gds> а, так всё ещё хуже. про fingertrees скорее забудь. разве что для общего развития интересно почитать.
[22:46:54] <ygrek> лучше соптимизировать на время поиска, а апдейт каунтеров накапливать и откладывать
[22:46:55] <ermine> а как его хранить в файле?
[22:47:59] <ermine> ygrek: все время придется апдеитить ВСЕ строки
[22:48:11] <ermine> ниже трогаемой строки
[22:48:23] <ygrek> ermine: во-первых забудь про базу
[22:48:42] <ermine> ygrek: ну плевать мне как она называется
[22:49:02] <ygrek> во-вторых не апдейть каунтеры на каждый чих - накапливай изменения в памяти, а потом за один раз мержить на диск
[22:49:40] <ermine> ну давай дальше
[22:49:51] <ygrek> для каждого первого слова из пары - список из (running sum счётчика, индекс слова в словаре)
[22:50:01] <ermine> база маркова в иных конфах накапливается до 100 мб
[22:50:34] <ermine> дальше
[22:50:42] <ermine> а для непервых слов? :)
[22:50:53] <ygrek> т.е.?
[22:51:03] <ermine> вот каунтеры для первых слов можно держать в памяти
[22:51:04] <ygrek> у тебя же марков на пары слов?
[22:51:19] <ygrek> ну это отдельная оптимизация
[22:51:55] <ygrek> я имею ввиду цепочки первое_слов -> второе_слово
[22:52:14] <ermine> мама мыла раму == ("", "мама") ("мама", "мыла"), ("мыла", "раму")б ("раму", "")
[22:54:05] <ygrek> т.е. дана статистика (частоты пар) -- ab ac ab bq ab ad ac bq be
хранишь
a --> (3,b) (5,c) (6,d)
b --> (2,q) (3,e)
[22:54:56] <ygrek> тогда по заданному первому слову поиск второго - простым делением
[22:55:44] <ygrek> можно ещё нормировать частоты до max_int
[22:56:38] <ermine> думаешь, я рублю в математике? я гуманитарка!
[22:56:46] ermine нифига не понимает :)
[22:56:51] <ygrek> но обновление тогда становится дороже, т.е. получаем на вход ещё одно ab - апдейтим весь список
(4,b) (6,c) (7,d)
[22:58:02] <ygrek> какая тут мат-ика, кратко - группируем по первому слову и храним не значение счётчика, а частичную сумму
[22:59:09] <ermine> я тут вообще никаких групп не вижу
[22:59:49] <ermine> рандом на каждую искомую пару слов для сочинения новой фразы рандомен
[23:00:30] <ygrek> я лучше кодом напишу
[23:00:33] <ygrek> завтра
[23:00:43] <ermine> давай кодом
[23:02:08] ermine пошла разбираться, пчу в talkers пропадают ники
[23:02:38] iNode вышел(а) из комнаты
[23:12:39] <gds> алгоритм одобряю. но он и на rdbms хорошо ложится, если слов много. индекс по первому слову и выборка по индексу до тех пор, пока не найдём нужное. можно эвристик понакидывать, связанных с частотами распределения. да хоть то же heap tree поверх sql'я родить, для определения границ выборки.
[23:14:14] <ermine> abc
[23:14:17] <ermine> .talkers
[23:14:32] <ermine> ой не сюдааа
[23:15:15] <ermine> gds: да, индекс - это зер гут
[23:16:30] dottedmag вышел(а) из комнаты: offline
[23:16:47] <gds> а в ораклах всяких, если правильно помню, можно практически форсировать выборку в нужном порядке по индексу, если он отсортирован. А если в индекс включены все нужные поля, но всё обходится в простое шастанье по btree на диске.
[23:17:12] <gds> однако, тут масштаб задач имхо не тот, и к счастью :)
[23:18:21] <ermine> но если выделишь аккаунт на оракле - помучали бы мы тебя с ораклом
[23:18:38] <ermine> марковым и sqlgg
[23:18:55] <ygrek> в rdb как ни крути чтобы выбрать where first_word = x это N чтений с диска
[23:19:46] <ermine> хэштабло!
[23:19:48] <ygrek> плюс если хранить running sum то преимущество апдейта теряется
[23:20:05] <ermine> там ж btree
[23:20:06] <ygrek> а если не хранить, то при поиске придётся полный скан делать
[23:20:40] ermine .oO(вот так рождаются слоны, то бишь новые модели rdbm)
[23:21:03] <ygrek> ermine: да, btree, оно быстро найдёт _где_ на диске лежат соответствия, но лежать они будут в разброс
[23:21:44] <ermine> да пущай вразброс
[23:22:00] <ygrek> да, я кстати тоже плавно избежал этого вопроса (как хранить компактно..)
[23:23:04] <ermine> я тут уже жаловалась, что в модуле Unix нет функции, позволяющей вернуть позицию в файле
[23:23:18] <ermine> задать есть
[23:23:24] <ygrek> кстати оффтопичный вопрос но не выгодней ли "большим БД" не доферять работу с файлами ОС и работать напрямую с диском?
[23:23:25] <ermine> Unix.lseek
[23:23:30] <ygrek> ermine: как это нет, tell
[23:24:36] <ermine> ygrek: Unix.tell?
[23:24:43] ermine пошла смотреть
[23:25:08] <Typhon> ygrek, на работе так сделали: в базе адреса к файлам, сервис основной с диском через nfs, а клиентам конечным через веб в виде ссылок на фтп
[23:25:20] <ermine> нэту tell
[23:25:46] <ygrek> точно нету
[23:25:57] <ygrek> хм, но я помню что использовал..
[23:27:07] <ermine> погрепай свой код :)
[23:27:09] <ygrek> а, lseek SEEK_CUR 0 :)
[23:27:26] <ermine> хм
[23:27:52] <gds> ygrek: оракл умеет отхапать себе раздел диска под т.н. tablespace (туда можно много напихать). на серьёзных нагрузках чувствуется, говорят. у нас же пару уровней индирекции через кеши не проявили себя на тестовых случаях.
[23:27:58] <ermine> ну ура, доточить словарь мюллера можно будет
[23:28:40] <ermine> а постргес читает блоками по 8 кб сразу
[23:29:02] ermine типа вставить умное слово в диспут
[23:30:08] <ygrek> вообщем /me всё равно думает что руками складывать в файл и периодически его переупаковывать будет выгодней чем в rdb как сейчас, хотя сложнее..
[23:30:11] <gds> оракл можно заставить читать подряд сколько угодно большими блоками, и он умеет в рантайме профилироваться по этому поводу (по явному запросу, конечно), плюс учитывать это при построении планов запросов, и более-менее корректно строит планы даже для btree-индексов.
[23:31:08] <ermine> ygrek: ты еще предложи dbm
[23:31:11] <gds> конечно, я не хвалю реляционки -- они в основном сосут-с. И, да, я бы предпочёл ту же ndbm, где ключом было бы первое слово, а значением -- сериализованное list (
[23:31:21] gds заранее предложил
[23:31:28] <ygrek> о!
[23:31:39] <gds> .. сериализованное list (щоччик * слово2)
[23:31:59] <gds> опционально сортированное.
[23:32:39] <gds> только ограничения у той структурки данных -- ой-вэй. реляционки проще. знать бы ещё, как у sqlite с индексами, а то всё руки не доходили.
[23:32:54] <ygrek> получается dbm сам перепаковывает всё в одном файле? или он тупой как пробка?
[23:33:19] <ermine> в dbm только два поля
[23:33:47] <ygrek> gds: похоже как раз то что нужно. в идеале было бы не читать весь список в память..
[23:34:35] <ermine> а sqlgg разве читает всю таблицу в память в моем случае?
[23:35:00] <ygrek> смешались в кучу кони люди..
[23:35:02] <ermine> в sqlite есть функция step
[23:35:33] <gds> dbm туп, но имплементация позволяет извращаться, и, предполагаю, этим пользуются, так как краем третьего глаза видел "free blocks" в спеке на *dbm.
[23:35:54] <gds> тьфуты, опять не по-русски.
[23:36:08] <ygrek> думаю для make it run сгодится
[23:36:57] <ermine> а еще у gds есть dbf
[23:40:05] <gds> хехе. а ещё я некоторые данные в xml храню, с поиском. праастихосспадя.
[23:41:55] <ermine> а вот чтобы что-то менять в xml - надо его считать целиком в память и отредактировать (ну можно не целиком в память, но прочитать - целиком)
[23:42:51] <gds> так я ведь и не хвастаюсь..
[23:43:11] <gds> у меня много кала есть. не только dbf и не только оракл.
[23:43:51] ygrek маршалит гигабайтные блобы и не парится :)
[23:44:30] <ermine> я маршалю негигабайтные хэштаблы стандартных фраз сульци
[23:44:54] <ermine> но для маркова оно плохо
[23:48:12] ygrek в очередной раз читает harper'а про ML модули
[23:48:21] <ygrek> * Harper
[23:48:28] <gds> откуда ты это читаешь?
[23:49:20] <ygrek> http://www.cs.cmu.edu/~rwh/courses/modules/
[23:52:59] <ermine> а зачем?
[23:55:36] <gds> буквы прикольно складываются слова, а слова -- в мысли, а мысли чешут извилины. щекотно, ух! лично я только поэтому читаю cs-литературу.
[23:58:21] <ygrek> ermine: а потом можно громить оппонента терминами типа translucent functor :)
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!