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

GMT+4
[00:10:00] sulci_sqlgg вошёл(а) в комнату
[00:15:15] <ygrek> !!!count
[00:15:32] <ygrek> sulci_sqlgg: !!!count
[00:15:32] <sulci_sqlgg> ygrek: sulci: how can you know ocaml that is a piece of junk
[00:15:39] <ygrek> хм
[00:19:44] sulci_sqlgg вышел(а) из комнаты
[00:20:15] sulci_sqlgg вошёл(а) в комнату
[00:27:35] <ermine> !!!count
[00:27:36] <sulci_sqlgg> ermine: 123
[00:27:39] <ermine> !!!top
[00:27:40] <sulci_sqlgg> ermine:
are | you | 3
do | you | 3
ocaml | is | 2
is | a | 2
it | ? | 2
choose | ocaml | 2
you | are | 2
do | not | 2
not | be | 2
be | boring | 2
[00:28:03] <ermine> гм
[00:28:15] <ermine> sulci_sqlgg: чему тебя научили?
[00:28:15] <sulci_sqlgg> ermine: sulci: how are you ok ?
[00:29:13] <ermine> ygrek: с sqlite есть еще одна беда - долго загружает журнал в память, после паузы неактивности
[00:29:33] <ermine> правда заметно только на больших базах
[00:30:38] ygrek не в курсе
[00:30:47] <ygrek> может прагмы покрутить какие-нибудь
[00:31:12] <ygrek> патч обновил
[00:31:41] ermine за вечер так и ни одной строчки не написала
[00:32:07] <ermine> ygrek: а чонить править в sqlgg по ходу дела не пришлось?
[00:32:24] <ygrek> да
[00:32:25] <ermine> или дописать :)
[00:34:19] <ygrek> стал парсить CREATE INDEX и LIMIT 1
[00:34:25] <ygrek> но это мелочи-вкусности
[00:34:37] <ygrek> а так всё работало из коробки
[00:40:04] <gds> ygrek: а покажи ссылку на документацию по sqlgg, хочу почитать вдумчиво.
[00:41:36] <ermine> gds: rtfs :)
[00:41:57] <gds> ermine: тьфуты. опять программист.
[00:42:00] <ermine> это про вдумчиво
[00:43:11] <ygrek> только то что на странице, программисты не пишут документацию
[00:43:15] <ygrek> и не читают
[00:43:17] <ygrek> :)
[00:43:36] <ygrek> если серьёзно то в планах
[00:44:08] <ygrek> по крайней мере сейчас основные принципы вроде как стабилизировались
[00:44:42] <gds> ну я именно про страницу интересуюсь. там вроде достаточно нормальное введение в курс дела было.
[00:45:42] <ermine> google sqlgg
[00:45:55] <ermine> sulci_sqlgg: эх ты
[00:45:57] <sulci_sqlgg> ermine: now you asking >
[00:46:34] <ermine> wz uuww
[00:46:42] <ermine> ваще все оторвано
[00:46:55] <ermine> ping
[00:46:56] <sulci_sqlgg> ermine: Понг от тебя 0.177 секунды
[00:47:03] <gds> а, если в гугле есть, то оттуда и почитаю.
[00:47:18] <ermine> есть там всё
[00:47:39] <ermine> вон на лоре сегодня писали, что гугль придумал бейсик
[00:47:44] sulci_sqlgg вышел(а) из комнаты
[00:47:55] sulci_sqlgg вошёл(а) в комнату
[00:48:12] <ygrek> http://ygrek.org.ua/p/sqlgg/
[00:48:30] <ermine> по идее гуглопоиск в боте не будет работать - негде теперь добывать ключ
[00:48:45] <ygrek> я все плагины отрубил
[00:48:50] <ygrek> !!!count
[00:48:51] <sulci_sqlgg> ygrek: 151
[00:49:08] <ygrek> ну так то лучше
[00:49:11] <ygrek> !!!count
[00:49:11] <sulci_sqlgg> ygrek: 156
[00:49:16] <ermine> talkers
[00:49:16] <sulci_sqlgg> Болтун Слов /me Фраз Эфф.
ermine 181 2 34 5.3
ygrek 151 1 36 4.2
gds 70 0 8 8.8
[00:49:26] ermine - трепло
[00:49:36] ygrek задолбался патч руками выкладывать
[00:49:53] <ygrek> если буду ещё ковырять - выложу репо
[00:59:46] <gds> чото страница с sqlgg не открывается; ну да ладно, в домашнем браузере ссылка останется, чего и хотел.
репо -- правильный ход.
дописал я реализацию, интерфейс, и, главное, документацию на свою гламурненькую "multiple readers queue". Поборол проблему с утечками в байткоде, реализовав императивный интерфейс к очередям. На завтра план -- прикрутить это к threads, а там и thread pool оформить, к которому долговато уже иду.
Пока не публикую исподники, ибо, как обычно, ёый стыд с английским языком, когда дело под вечер. Завтра пересмотрю.
Поведение байткода на больших/бесконечных функциональных структурах данных -- просто отвратительное. Думаю, надо бы изучить, по каким точно причинам в ocamlc всё работает нормально, т.е., чего точно добиваются "пайплайном" функций, осуществляющих разные стадии компиляции. И может что-нибудь оформить для улучшения ситуации. Критические вещи в комбинаторы вынести, штоле.
[01:00:16] ygrek ушёл спать
[01:02:49] <ermine> gds: да ты потрудился на славу
[01:10:04] <gds> издеваешься :) такие вещи (с байткодом) должен был сразу чувствовать, пятой точкой. а так -- постная .ня. Единственное, чем сегодня хорошо -- не потратил день зря, а хоть чем-то полезным занимался, что бывает далеко не всегда (а часто бывает или как у тебя, когда всё влом, или всякий реаллайф, или ещё какая-нибудь срань господня).
[01:14:05] gds спать. Ибо воистину!
[01:14:34] ygrek вышел(а) из комнаты
[01:16:45] sulci_sqlgg вышел(а) из комнаты
[03:54:56] daapp вошёл(а) в комнату
[05:19:39] sevenov вышел(а) из комнаты
[05:20:33] sevenov вошёл(а) в комнату
[05:32:37] sevenov вышел(а) из комнаты: Replaced by new connection
[05:32:46] sevenov вошёл(а) в комнату
[05:53:18] sevenov вышел(а) из комнаты
[05:54:42] sevenov вошёл(а) в комнату
[05:58:48] sevenov вышел(а) из комнаты
[06:00:17] sevenov вошёл(а) в комнату
[07:31:06] sevenov вышел(а) из комнаты
[07:31:10] sevenov вошёл(а) в комнату
[08:19:07] gds вышел(а) из комнаты
[08:59:40] sevenov вышел(а) из комнаты
[09:08:17] gds вошёл(а) в комнату
[10:06:21] ygrek вошёл(а) в комнату
[10:15:15] Typhon вошёл(а) в комнату
[10:32:36] sevenov вошёл(а) в комнату
[10:53:23] gds вышел(а) из комнаты
[10:56:28] gds вошёл(а) в комнату
[11:04:08] ygrek вышел(а) из комнаты
[11:07:44] <gds> подскажите, как документацию сгенерить, наподобие той, которая в мануале по модулям stdlib'а?
ocamldoc -html -o mrq -pp camlp4r mrq.mli -- показывает только индексы типов/значений/модулей и сам модуль, но некрасиво.
буду читать доки, но подсказке буду рад.
[11:08:20] f[x] вошёл(а) в комнату
[11:09:21] <f[x]> gds: создаёшь mrq.odocl, в нём перечисляешь модули по одному в строке, запускаешь ocamlbuild mqr.docdir/index.html
[11:11:37] <gds> благодарю, сработало отлично. теперь осталось разобраться с разметкой ocamldoc'а, и дело в шляпе.
[11:14:57] <f[x]> проще всего сразу в ocaml/lib/*.mli посмотреть
[11:37:59] <ermine> гы-гы
[11:48:57] <f[x]> чего? там сразу актуальные примеры использования, в доке много буков
[12:00:32] <gds> ну хз, в общем... выродилась такая штука: http://paste.defun.ru/m10c58f91
[12:01:12] <gds> мне она нужна для отправки "броадкастов" в очередях сообщений, которые промеж тредов.
[12:05:35] <f[x]> из того что в caml-list'е написано то space leak'и зависят от использования
[12:06:34] <gds> кое-как -- зависят. Но let x = .. in E -- тут x будет привязан в байткоде чотко до окончания вычисления E.
[12:07:10] <f[x]> т.е. в f* интерфейсе по ссылке нет принципиальной увечности
[12:07:24] <gds> в байткоде?
[12:07:28] <f[x]> если E не tail call
[12:08:25] <f[x]> то есть использование вида
let rec loop q = let (x,q) = fpop q in process x; loop q
[12:08:42] <f[x]> во время process старый q жив, а во время рекурсивного loop - уже нет
[12:08:57] <f[x]> правильно?
[12:10:18] <f[x]> я бы в это описание проблемы с liveness добавил reference ссылки на caml-list
[12:10:33] <gds> ссылки добавлю, пример сейчас асилю.
[12:11:06] <f[x]> ещё очепятка "observationally equavalent"
[12:12:58] <gds> насчёт примера -- в том-то и дело, что наш спектральный анализ показал, что старое q тоже живо. Хотя по идее не должно было быть. Сейчас буду тестить дальше.
Опечатка -- гуд, пофиксил.
[12:20:31] <gds> видимо, у меня жрётся память не из-за loop, а из-за
let (created_reader, w) = Mrq.fcreate () in выражение, запускающее тест
вот этот created_reader и остаётся живым.
[12:41:21] <gds> в принципе, хвостовой рекурсии мне бы хватило для fr. Как-то извратиться бы, чтобы не хранить созданное значение.
может через
value run_reading : w 'a -> (r 'a -> 'b) -> 'b
но очевидно, тут процесс чтения, если и возвращает что-то, то его уже не восстановить с той точки, где он вернул результат.
[13:05:46] ygrek вошёл(а) в комнату
[13:35:30] ermine езидно смотрит на gds
[13:35:35] <ermine> это заразно
[13:36:28] <ermine> *ехидно
[13:36:46] <gds> епоял. где зоораза?
[13:37:56] <ermine> ну насчет возвращаемых значений и прочих типов мусорящих процессов
[13:38:48] <ermine> я щас думаю о том, как правильно резетить "читающий процесс", чтобы продолжать читать с чистого листа
[13:40:25] <ermine> одно из двух - читающий процесс вызывает обработчика входных данных, которых он прочел, или обработчик вызывает читающую функцию, чтобы получить данные, вот выбираю между ними
[13:42:33] <gds> смотря что дальше будет с данными.
случай, когда обработчик вызывает читающую функцию, в целом гибче.
[13:44:56] <ermine> а вот вопрос не в том, что дальше будет, а в том, как управлять этим хозяйством: в первом случае надо писать рекурсивную функцию loop (), которая читает и сует в обработчик, во втором случае такая функция не нужна, и соответственно разные решения для случаев многопроцессинга
[13:45:13] <ermine> второй случай подстраивается под lwt
[13:46:45] <gds> если нужно lwt -- ясно, что второй случай лучше.
[13:53:34] ygrek вышел(а) из комнаты
[14:08:26] daapp вышел(а) из комнаты
[15:13:39] <gds> понадобилась мне возможность клонировать не Mrq.w 'a, а как раз даже Mrq.ir 'a. А там и понял, что если есть
clone_writer : w 'a -> ir 'a
, то окажется, что можно клонировать и очереди с функциональной читалкой (ну и ок, т.к. механизмы писалки одинаковые). В общем, апи съехало конкретно.
На критику: http://paste.defun.ru/m65a184c4
И занимательный факт: mli больше, чем ml, почти в 4 раза (по байтам).
[15:39:52] abiogenesis вошёл(а) в комнату
[15:40:32] abiogenesis вышел(а) из комнаты
[15:40:33] abiogenesis вошёл(а) в комнату
[15:40:38] abiogenesis вышел(а) из комнаты
[15:40:51] abiogenesis вошёл(а) в комнату
[16:23:59] ygrek вошёл(а) в комнату
[16:48:14] gds вышел(а) из комнаты
[16:51:38] gds вошёл(а) в комнату
[17:33:47] gds вышел(а) из комнаты
[18:20:13] gds вошёл(а) в комнату
[18:34:34] <gds> ygrek: дошли руки посмотреть sqlgg, пока с теоретической стороны. Как планируешь инферрить тип @var в случае вида "select ... from table t where @var in (t.string_column, t.number_column)", в целом? ну или "select .. from (select 123.45 as x .. union select "234.56" as x ..) where x = @var"?
[18:36:35] <f[x]> второй пример не понял
[18:36:43] <f[x]> в первом вроде никаких проблем
[18:36:59] <f[x]> ну т.е. сейчас туплы вообще не понимаются, но в принципе
[18:37:03] <gds> второй -- union'ом собираем разнотипные столбцы, по ним делаем выборку.
[18:37:15] <f[x]> а
[18:37:18] abiogenesis вышел(а) из комнаты
[18:37:27] <f[x]> такое разве бывает?
[18:37:45] <f[x]> в смысле реально встречается?
[18:38:22] <gds> хохо, ещё как! а ещё всякие NULL'ы встречаются и влияют на типизацию.
[18:38:41] <f[x]> на будущее есть todo явно указывать типы в query
[18:39:07] <gds> про "@var in (..)" -- тут и не тупл. если брать оракловский sql, то тут условие, чтобы @var было одним из значений перечисленного списка -- в данном случае или строкой, или числом.
[18:39:46] <f[x]> по стандарту это вроде тупл
[18:40:15] <f[x]> ну тогда пример эвивалентный
[18:40:29] <gds> выражение "column in (1, 2, 3)" -- однозначно "одно из".
[18:40:54] <f[x]> ок
[18:40:57] <f[x]> NULLи я вообще сейчас игнорирую..
[18:41:29] <f[x]> пока всегда обходился coalesce
[18:42:10] <f[x]> ну вообщем этого всего пока нет и неясно
[18:42:25] <gds> ещё замучаешься с нуллами. Если будешь инферить для них option 'a в случае nullable, то результат инферилки будет сильно гулять при малых изменениях запроса, и будет нужда переписывать статически типизированный код. Вот тут уже хитрее. Если типы и можно привести к общему знаменателю согласно правилам конкретной СУБД, то тут мрачно.
[18:43:34] <f[x]> это я в камле смогу option использовать, а со всякими плюсами что делать?
[18:44:28] <f[x]> да, касты очень сильно зависят от БД, и вообще fine-grained types, сейчас то у меня просто text и int
[18:44:29] <gds> мде.. хуже дело.
да и в окамле хз, стоит ли option. по явному требованию или ещё как.
[18:45:02] <f[x]> видимо в общем виде оно и не решается
[18:46:01] <gds> ну а в плюсах -- NULL нельзя?
[18:46:02] <f[x]> поэтому либо query'ить у базы тип запроса либо затачиваться на частные случаи
[18:46:37] <f[x]> это только для указателей, а мне нужно для любого типа
[18:47:23] <f[x]> можно конечно пробрасывать эту информацию, а конкретные traits определят как представлять её (boost::option или NULL или exception итд)
[18:47:51] <f[x]> т.е. так и надо делать если это делать
[18:48:46] <gds> спрашивать базу при компиляции (ака подход pgocaml'а) мне не нравится тем, что нужна база.
спрашивать у базы типы при выполнении -- вариант. Возможно даже приличный, думать надо.
[18:49:16] <f[x]> ой, а при выполнении я что с этим буду делать?
[18:50:35] <gds> логично, туплю.
но в случае, когда хотят строку, а в базе число или дата, то очевидно, что делать: to_char().
[18:52:05] <f[x]> что значит хотят? если в базе число то и получайте число :)
[18:52:51] <f[x]> ну вообще да, оно так сейчас и есть, если тип не вывелся то используется string и все приличные врапперы автоматически отдают строку
[18:57:21] ygrek вышел(а) из комнаты
[18:57:22] <f[x]> вообще про самый первый вопрос - эквивалентно "как в камле сравнить число и строку? " - скастить одно в другое, ну а если хочется автоматически? - тогда добро пожаловать в питон
[18:59:01] <f[x]> но возможность выполнять query обычным образом остаётся (а потом можно будет указывать явный тип и хоть чуть-чуть получать бенефит от того что не надо весь boilerplate руками писать)
[18:59:58] <gds> ну хоть строку отдают, и то хорошо.
про указание типов -- это да, неплохо бы. но лучше, чтобы это шло из практических применений, поэтому можно смело забить пока.
[19:00:39] <f[x]> +1, поэтому я в sulci и вкрутил чисто из интереса как оно пойдёт на "стороннем" коде
[19:02:02] <gds> sulci у нас как подопытный кролик -- ты его по sql терзаешь, я его падвендой собираю.
[19:02:38] <f[x]> :)
[19:14:02] <f[x]> кстати, может у тебя есть кусок кода с использованием оракла, которым можешь поделиться - пригодился бы для опытов, ато я от оракла далёк
[19:16:02] <gds> у меня он на биндингах луговского, а он с нуллами тоже не дружит, да и failwith "shit!" не кошерны. Оно у меня только на работе, в будний день вспомню и поделюсь.
[19:18:24] <f[x]> ок, спасибо
[19:21:12] f[x] вышел(а) из комнаты: Computer went to sleep
[19:38:06] sceptic вышел(а) из комнаты
[19:57:46] Typhon вышел(а) из комнаты
[20:27:26] sceptic вошёл(а) в комнату
[20:28:21] sceptic вышел(а) из комнаты: Replaced by new connection
[20:28:24] sceptic вошёл(а) в комнату
[20:49:06] <ermine> а кто-нибудь страдал автоматическим впомпиливанием кода в основную программу, если что-нибудь типа autotools находило нужную библиотеку?
[21:00:48] ygrek вошёл(а) в комнату
[21:13:32] <gds> в теории всё выглядит вполне прозаично.
[21:20:26] <gds> если чо, есть то ли pa_ifdef, то ли скорее pa_macro для подобных вещей. хз входят ли они в базовый дистр. если чо, рядом подложить реально.
[21:20:55] <gds> (второе "если чо" в целях сохранения чистоты речи читать как "если совсем чо")
[21:24:31] sevenov вышел(а) из комнаты
[21:27:31] <ermine> твою мысль поняла
[21:29:20] <ermine> а насчет fsm - я решила применить систему калбэков
[21:32:07] <ermine> убиваются несколько кроликов: не нужно рисовать дерево типов sum для state, и не надо особо проверять входные данные - по ним вызывается нужный калбэк
[21:32:22] <ermine> если калбэка нету, то ой
[21:42:40] <ermine> вот блин, по окамлевой доке не всегда понятно, будет ли Not_found при вызове функции remove в Make.Map
[21:52:34] <gds> а как это может быть, что нет калбэка? имеешь ввиду, что Match_failure / assert false будет, когда попробуешь заматчить нужные данные?
[21:53:50] <ermine> нет калбэка в том случае, если входные данные в таком вот виде не предусмотрены задачей
[21:54:14] <ermine> такие данные можно либо отвергать, либо выпасть в кору
[21:54:19] <gds> здравый смысл подсказывает, что remove не кидает exception.
[21:54:26] <ermine> ну, я пошутила насчет коры
[21:55:52] <ermine> gds: хотелось бы верить в такой здравый смысл всегда
[21:55:54] <gds> ну насчёт определения нужного калбэка -- тебе уж решать, как делать. можно и дефолтовое поведение предусмотреть, вида match some_input with ... | _ -> whatthefuck "???"
[21:56:16] <gds> конечно надо указать явно про remove. есть желание файлить баг? :)
[21:57:34] <ermine> в другой конфе один человек ждет когда лерой пофиксит багу в камле, точнее в генераторе ассемблерного кода
[21:58:16] <gds> а сам чел не может?
[21:58:21] <ermine> это наверное посложнее чем экспшн в каком-нибудь remove, но прогресса давно не видно
[21:59:06] <ermine> надо изучать ассемблер
[21:59:12] <gds> с простыми вещами они справляются быстро. раньше не верил, на одном примере убедился в реальности этого.
[22:00:08] <gds> если платформа общеизвестная/общеупотребительная, то удивительно, что не пофиксили.
[22:00:13] <ermine> ну это и так понятно
[22:05:35] <gds> если бы цель была в том, чтобы "заставить кодогенерилку работать без бага" (а не в том, чтобы "штатный дистр окамла работал без бага"), то я может быть и торганул бы собой слегка. А так -- смысла нет, в официальный дистр патчи не принимают, особенно по таким охрененно важным вещам.
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!