Home
Objective Caml
ocaml@conference.jabber.ru
Воскресенье, 5 июня 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:00:06] <komar> А, ну это правильно.
[00:04:49] <ermine> а оно скомпилится?
[00:05:08] <gds> ermine: извени, не почесался, реаллайф был (меня, скажем так, чесали.).  Но если просто t, то это приятнее: вообще, как-то не очень хорошо, когда пытаешься тип параметризовать параметризованным типом, и катит только через функторы.  А потом, как упрёшься в функторы и их тупак (там есть), снова в рантайм это всё елозить.
[00:07:07] <ermine> gds: ну вот я попыталась параметризовать string как char t и задумалась
[00:10:57] <gds> ermine: ты, главное, не трать силы на лишние эксперименты.  Я тратил, порядка нескольких раз по 1..3 часа, и оказалось, что не очень здорово получается.  С Obj вообще не дело, по моим прикидкам, ибо кое-где компилятор при выводе решения "является ли это мусорособираемым или long всегда" смотрит на типы.  Если в одной ветке будет char, а в другой будет boxed value, будет очень не ок.
[00:11:21] <gds> конечно, в теории, char t изобразить можно, но надо подумать, что и как хочешь.
[00:15:19] <ermine> а пока что у меня не компилится предположение ygreka
[00:16:29] <Typhon> а окамл 3.12? можно попробовать include третий модуль with type в оба модуля (предположение).
[00:17:05] <ermine> а в доку лезть чота лень
[00:18:01] <ermine> ща попробую
[00:21:21] <ermine> таки придется листать доку
[00:21:44] gds вышел(а) из комнаты
[00:21:58] <ygrek> мда, такие констрейнты не получается выписать
[00:24:37] <ygrek> можно проще
module X(Y:sig type t end)(Z:sig type t = Y.t end) = struct end
[00:32:08] <komar> Я пошел в винду. Про JS не холиварьте тут без меня.
[00:32:10] komar вышел(а) из комнаты
[00:53:57] gds вошёл(а) в комнату
[00:56:20] gds вышел(а) из комнаты
[01:00:31] komar вошёл(а) в комнату
[01:15:54] ermine вышел(а) из комнаты
[01:39:26] ygrek вышел(а) из комнаты
[01:51:54] Kakadu вышел(а) из комнаты
[03:20:51] komar вышел(а) из комнаты: Replaced by new connection
[03:20:52] komar вошёл(а) в комнату
[03:24:06] komar вышел(а) из комнаты
[03:55:54] Typhon вышел(а) из комнаты: Replaced by new connection
[03:55:56] Typhon вошёл(а) в комнату
[03:56:16] Typhon вышел(а) из комнаты
[05:49:33] komar вошёл(а) в комнату
[08:02:46] rexim вошёл(а) в комнату
[08:03:43] rexim вышел(а) из комнаты: offline
[10:38:26] Kakadu вошёл(а) в комнату
[10:48:43] ygrek вошёл(а) в комнату
[11:13:38] Digimmortal вошёл(а) в комнату
[11:58:45] ermine вошёл(а) в комнату
[12:08:03] gds вошёл(а) в комнату
[12:15:56] Typhon вошёл(а) в комнату
[12:24:52] zert вошёл(а) в комнату
[12:28:33] <gds> оазис странный.  http://paste.in.ua/2538/ .  я как-то подразумевал, что make install должно включать в себя компиляцию в том числе.
[12:29:44] <ygrek> нет, см. GNU guidelines
[12:29:50] <ygrek> (я тоже был удивлён)
[12:30:07] <ygrek> это упрощает жизнь пакетособирателям
[12:32:29] <gds> чото не могу найти по "gnu guidelines" ничего похожего.
однако понял, что "здесь так принято".
[12:36:19] <ygrek> http://www.gnu.org/prep/standards/standards.html#Standard-Targets
[12:36:31] <ygrek> > Compile the program and copy
[12:36:33] <ygrek> хм
[12:38:28] <ygrek> значит можно рисовать багу!
[12:39:29] <gds> хотя бы узнать у не ле галла, всё ли соответствует его задумкам.  потому что guidelines это одно, а оазис -- в теории, совсем другое.
[12:40:45] <ygrek> ну создаваемый makefile лучше чтобы соответствовал общепринятым стандартам
[12:49:04] Digimmortal вышел(а) из комнаты
[13:03:24] <gds> опять оазис чудит.  причём, не могу понять, в каких случаях uninstall срабатывает, а в каких нет.  http://paste.in.ua/2539/
[13:05:49] <Typhon> setup.log есть?
[13:06:05] <Typhon> (или setup.data)
[13:06:40] <gds> у меня делаюся make uninstall, make clean, make all, make install.  после какого этапа интересуют эти файлы?
[13:07:38] <Typhon> перед uninstall. по идее, если специально их не удалять, то они останутся, а если удалить, то что-то в духе "ничего не удаляется" может быть.
[13:09:36] <gds> при удалении я делаю так: перехожу в директорию проекта и выполняю там make uninstall.  При установке -- копирую исходную директорию в другую, типа-временную, там делаю make clean, make all, make install, затем эту директорию удоляю.  Может дело в этом?
[13:12:15] <Typhon> а зачем во временную директорию ходить? в оригинальной получается у тебя нет setup.log и setup.data, который нужен для того, чтобы оазис понял, что это он ставил пакет, емнип.
[13:17:31] <gds> временная дира -- для чистоты процесса.  чтобы последовательные билды не влияли друг на друга.  натыкался на лажу, связанную с этим, причём на труднодиагностируемую, поэтому всегда так делаю.
[13:35:44] <ygrek> принцип такой что make uninstall можно сделать только в том же дире что и make install
[13:35:58] <ygrek> если есть те же файлы setup.* что и при install
[13:36:54] <ygrek> но если у тебя своя пакетная система то можно юзать install в destdir и это дело сохранять как "пакет" и потом его распаковывать/удалять самостоятельно
[13:37:10] <ygrek> так же как это все паетные системы делают - они не используют make uninstall
[13:37:28] <ygrek> они записывают что именно они проинсталлили а потом именно по этому списку удаляют
[13:37:36] <ygrek> (вдобавок различая конфиг файлы)
[13:37:56] <ygrek> setup.data из oasis'а это такой же список только локальный, в рамках одного проекта
[13:38:16] <Typhon> ygrek, "только в той же дире" -- это из-за путей в setup.ml и прочем? или дело в setup.data ?
[13:38:23] <Typhon> и если его положить -- то всё ок будет?
[13:38:24] <ygrek> очевидно для глобвльной системы он не годится и надо свой велосипед лепить
[13:38:26] <ygrek> в setup.data
[13:38:34] <ygrek> если положить - думаю будет ок
[13:39:07] <ygrek> в setup.ml вроде никаких путей хардкоженных нет
[13:39:52] <Typhon> там они только в комментах были, ага
[13:40:48] <ermine> химики
[13:41:30] <ermine> Typhon: как назвать проект с комбинаторными парсерами?
[13:41:31] <ygrek> из коментов я кстати выпиливаю
[13:41:59] <Typhon> ygrek, руками сам? я видел от тебя багу ЛёГаллу, но каков статус -- не знаю
[13:42:16] <Typhon> ermine, есть же уже pluck и ostap, чем твоя либа будет лучше? %)
[13:42:30] <ygrek> патч в трекере
[13:42:51] <ermine> Typhon: пусть будет еще один
[13:43:46] <ermine> Typhon: пока назвала тривиально - erm_pc
[13:46:59] <Typhon> называй Kombain ^_^
[13:47:59] <ermine> а чо, хорошая идея
[13:48:25] <Typhon> вроде как либ ещё нету таких
[13:49:18] <ermine> на гитхубе - так вообще ни одной pc
[13:52:40] <gds> мда, во дают в этом оазисе.  эдак я его не смогу пользовать.
ну, пока будет так: была дира ./amall, я её перенесу в ./amall/orig, а в amall/Makefile напишу cd orig && make install для цели install, и ocamlfind remove amall для uninstall.
[13:53:34] ermine с сомнением смотрит в остапа
[13:58:32] <ermine> gds: а чо такое amall?
[13:58:40] <gds> моя либка
[13:58:53] <ermine> ну понятно что всё твое
[13:59:06] <ermine> но я тут слышала несколько раз это название :)
[13:59:52] <gds> вкратце -- мои велосипеды про stdlib, хттп поверх итератов, будущий ocamldbi2 ну и прочие мелочи.
[14:01:16] <gds> ermine: https://bitbucket.org/gds/amall
[14:01:42] <ermine> даа, чего только люди не делают с негибким камлом
[14:03:54] <ermine> даже hg отказался склонировать этого верблюда
[14:04:52] <gds> чем аргументировал?
[14:05:25] <Typhon> сертификаты, наверняка
[14:05:52] <Typhon> по хттпс с бб как-то тупо копируется, периодически
[14:06:05] <ermine> ой, не ту ссылу скопировала, оно хотело ssh ключи
[14:07:50] <ermine> таак, склонировала, хде там хттп...
[14:08:54] <Typhon> tests/test_http_service.ml
[14:09:54] <ermine> не, я пока погляжу в amall_http
[14:11:05] <Typhon> а, тебе итераты смотреть хочется
[14:11:30] <ermine> реализацию хттпа
[14:13:42] <ermine> пока сказать нечего
[14:18:32] <ermine> сместь деталей парсера и деталей засылки в сокет в одном коде - жуткая штука
[14:18:56] <gds> это где такое?
[14:19:32] <gds> засылка осуществляется в одном месте, где Amall_http.response (или как там его) расковыривается, который Body_string.
[14:20:16] <ermine> ну вот is_spaces - детали парсинга
[14:20:58] <ermine> а, у тебя файл поделен на секции? :)
[14:21:10] <ermine> просто я привыкла, что делят на файлы, а не секции
[14:23:42] <gds> недопонял.  Отсылка в сокет -- amall_http.ml, строка 522, функция
value output_body outch rs_body =
-- только она делает IO.write.
[14:25:18] <ermine> gds: у тебя там что - описание протокола хттпа или работа с итератами?
[14:25:42] <gds> у меня там всё вместе.  итератами разбираю хттп-протокол.
[14:25:51] <ermine> в файле amall_http.ml
[14:26:15] <ermine> ну вот
[14:26:21] <gds> что "ну вот"?
[14:26:36] <ermine> в одном коде!
[14:26:54] <gds> ты так говоришь, как будто это что-то плохое.
[14:27:11] <ermine> и поэтому все рожают верблюдов с квадратными ногами
[14:27:34] <ermine> что вот нет нормального отделения мух от котлет
[14:28:41] <gds> парсинг хттп осуществляется итератами.  Тут наоборот не нужно отделять эти штуки, и я специально сделал парсинг хттп именно так.  Потому что "сначала прочитать, а потом распарсить" -- это небезопасно.
[14:28:42] ermine в печали пошла дальше делать свого верблюда-комбайна
[14:30:45] <ermine> gds: читать по два байта из сокета тоже ведь небезопасно?
[14:31:03] <Typhon> в итератах же фишка, на сколько я их понимаю, "побуферное" чтение
[14:31:34] <ermine> ну да
[14:31:47] <ermine> побуферно надо везде, а не только в итератах
[14:38:17] <gds> по два байта читать -- медленно, но смотря для чего надо.  А разве у меня "по два байта" читается в amall_http?  Никогда не замечал.
[14:39:58] <ermine> не смотрела насчет этого
[14:40:24] <ermine> но возмутила фраза о том, что сделано специально
[14:41:11] <gds> ты путаешь "парсинг итератами" и "чтение по два байта"?
[14:42:10] <ermine> gds: нет, про два байта - реакция на "небезопасно"
[14:42:22] ermine - сложная собачка павлова
[14:43:50] <gds> понял.  Но смотри, об ошибке в протоколе нужно сказать как можно раньше, я считаю.  То есть, если уже прочитана строка заголовка, допустим, "asd\n", и это явно не http, то зачем читать и обрабатывать дальше?
[14:45:33] <ermine> gds: хттп, как и хтмл, нонче реализуются обязательно с error recovery
[14:46:31] <gds> в хттп это не нужно.
[14:46:58] <ermine> gds: а что посылается юзеру? "ты - урод!"?
[14:47:19] <gds> bad request.
[14:48:06] <ermine> если ошибка не в первых двух строчках (get и host), то все остальное можно игнорить
[14:48:27] <ermine> впрочем host тоже восстанавливают
[14:49:18] <gds> 1. host не обязательно вторая строка.  2. host не обязателен в запросе.  3. в случае, когда "asd\n" вместо http, я считаю правильным закрыть соединение.
[14:50:32] <ermine> не возражаю :)
[14:51:35] <ermine> а если тебе пришел заголовок скажем Accept-language": en
[14:51:40] <ermine> то что будет?
[14:59:17] <gds> если с кавычкой -- ничего, по ":" разобьётся, будет заголовок "Accept-language\"" со значением "en".
[15:02:38] <ermine> а это имеет какое-то отношение к итератам?
[15:04:47] <ermine> впрочем, и asd\n тоже не имеет, скорее всего
[15:12:05] <gds> Accept-language" -- не имеет.  asd\n -- имеет, так как итерат, не обнаруживший "METHOD uri HTTP/maj.min\n" скажет сразу, что это не http, без чтения дальнейших данных.
[15:13:16] ygrek вышел(а) из комнаты
[15:16:17] <ermine> gds: то есть предполагаешь, что, если оно успешно продралось через процедуру определения метода, то аварийного закрытия итератора более не последует?
[15:16:43] <ermine> а если Content-length: 10000000000000000000
[15:17:06] <ermine> а в лимитах где-то есть только 64 кб :)
[15:20:16] <ermine> вообще надо что-то посередине итератом и парсером воткнуть, управляющее
[15:23:31] Digimmortal вошёл(а) в комнату
[15:26:20] <gds> ermine: итераты, обрабатывающие дальше, могут закрыть -- например, у меня там есть ограничение на размер заголовка (10кб что ли), и в случае, когда итерат не выдал ответа, а ему передали уже 10кб, его закрывают сверху (этот комбинатор называется "limit", сам кодил, у олега его не было) и тот итерат, который непосредственно кушал заголовки, можно при желании продолжить выполнять (если вдруг окажется, например, что запросы на какой-то урл или от каких-то пользователей надо читать с заголовками без ограничений), либо его можно не продолжать читать, и вместо его результата вернуть "server error -- дофига шлёте!".
Про Content-length -- опять же итераты рулят: пользователь на основании запроса (в том числе заголовков) возвращает итерат, которым будет парситься тело (кстати, chunked втыкается туда более, чем очень легко, и всё это прозрачно для пользователя), и пользователь решает, что ему делать.  Если он захочет, может в constant memory обработать хоть гегобайты.  Если же требуется чтение в память или на диск, может воткнуть туда лимитирование как захочет.  Если я в либе захочу, то могу лимитировать пользовательский итерат сам.
[15:26:23] <gds> итераты = парсинг и управление вместе.
[15:42:26] <gds> кстати вот, разгрыз аппликативные функторы.  Имея некое окружение (заданное статически пока что, в виде [("a", String "str"); ("b", Int 123); ("c", Bool True)]), код
value () = run &
  (fun f -> f <$> string "a" <*> int "b" <*> bool "c")
  (Printf.printf "a=%S b=%i c=%b");
выводит ожидаемое:
a="str" b=123 c=true
[15:44:32] <gds> это мне для обработки значений с типом sql_t = [ `Null | `String of string | `Binary of string | ... ].
[15:45:22] <gds> конечно, ошибки типизации будут в рантайме, но я сам ушёл от compile-time проверок с обращениями к БД, а остальные неудобства -- уже следствия моего решения.
[15:48:59] <Digimmortal> а почему ушёл от compile-time проверок с обращениями к БД?
[15:55:44] <gds> потому, что в моих случаях не везде будет БД при компиляции, и вообще я считаю это кривым решением.
А вот подход ygrek'а с его sqlgg -- вот это разумный компромисс.  Но sqlgg надо допиливать.  Если буду много БД-ориентированного кода на камле писать, обязательно ещё раз посмотрю sqlgg, причём уже с точки зрения "как бы его реально допилить".
[15:58:34] <ermine> macaque не проверяет при компиляции, зато в коде надо описывать типы полей, зато не оптимизирует по скорости
[15:59:09] <gds> тут ещё повлияло то, что я пересмотрел роль некоторых использований реляционных субд.  Бывает и так, что схему меняют одни люди, используют другие, причём клиентские программы пишутся разными людьми для разных целей.
[15:59:32] <gds> ermine: про оптимизацию по скорости недопонял, можешь чуть развернуть?
[16:00:07] <Typhon> либа для дбинтерфейса и не должна ничего оптимизировать, разве нет?
[16:02:20] <ermine> gds: оптимизация по скорости - читай, та же проверка при компиляции, prepare query
[16:02:41] <gds> Typhon: не должна, за исключением случаев, когда модель простая.
[16:03:15] <gds> ermine: prepare -- не всегда оптимизация по скорости, вот в чём дело.  Иногда, если prepare является обязательным, это наносит вред.
[16:04:26] ermine не сталкивалась с таким
[16:05:38] <ermine> gds: а ты вообще смотрел на macaque? там синтаксис запросов интересный
[16:07:37] <ermine> http://ocsigen.org/macaque
[16:10:05] <gds> ermine: посмотрел макаку.  На синтаксис обратил внимание.  Это хорошо, но выпадает из концепции "лепите библиотеки, а не синтаксические расширения".  Однако буду ещё смотреть макаке в одно место.
[16:11:38] <Digimmortal> а в чём кривизна?
[16:11:57] <Digimmortal> типы полей необязательно руками описывать
[16:12:52] <ermine> gds: дык sql - это язык, и если программить на sql в своем коде с помощью let sql = "select " ^ whatever ^ " from table", то это ведь не гуд?
[16:13:52] <ermine> точно так же поэтому и json-static со своим синтаксисом - тоже биг гуд
[16:14:01] <gds> Digimmortal: речь про кривизну "подключаться к БД при компиляции"?  Кривизна в том, что БД может и не быть, БД может быть с отсутствующей созданной схемой (чисто сервер), дба не обязательно даст права на просмотр схемы какой-то программе или билд-скрипту, схема может быть изменена потом, между компиляцией и запуском, и так далее.
[16:14:51] <Digimmortal> нет, я думал тебе не нравится генерция типов для артефактов базы
[16:16:16] <gds> ermine: json -- логично описывать типами, это просто другой язык описания.  Погроммист централизованно задаёт -- "этот тип будет таким-то и таким-то, и будет отображаться на json таким-то образом".  Это -- внутреннее дело погроммиста и программы.  В случае с БД -- она получается отдельной сущностью.  Вот в случае sqlgg -- схема хранится в виде ddl, по которым идёт типизация, и это логично.  А обращение к БД -- нелогично.
[16:16:49] <Digimmortal> посмотрел sqlgg
[16:17:06] <Digimmortal> ижея зравая, но мне кажется её надо развивать дальше
[16:17:16] <Digimmortal> до LINQ'а
[16:17:20] <gds> ermine: let sql = ... -- смотря какие цели.  Обычно достаточно
let stmt = dbi#prepare "select col1, col2 from table where col3 = $1 and col4 = $2" in
...
let res = stmt#execute ["col3val"; "col4val"] in
...
[16:18:23] <gds> про linq ничего не скажу, ибо слышал мало, что "это манатки" и "это обращения к бд".
[16:18:52] <Digimmortal> это манатки, но не только для БД
[16:19:31] <Digimmortal> в БД случае устраняет ряд косяков SQL
[16:19:31] <ermine> gds: ну кто у тебя $1 будет подставлять?
[16:19:58] <ermine> $1 - это калька из перла
[16:20:13] <ermine> или откуда еще
[16:20:21] ygrek вошёл(а) в комнату
[16:20:23] <ermine> а, из регэкспа
[16:21:07] <Digimmortal> для  работы с БД нужен некий аналог квазицитирования - в камле p4 позволяет такое?
[16:21:32] <ermine> gds: кста, а итераты к бд ты еще не прикручивал?
[16:22:43] <ermine> Digimmortal: зачем p4, если в бэкграунде в моску один перл с регэкспами
[16:23:21] <Digimmortal> ermine: не понял про перл
[16:23:34] <Digimmortal> я за статическую типизауию для работы с БД
[16:23:41] <Digimmortal> типизацию
[16:24:01] <Digimmortal> никаких конкатенаций строк
[16:24:10] <ermine> вот этим macaque как раз со своим dsl делает
[16:24:21] <Digimmortal> сейчас гляну
[16:24:54] <gds> ermine: $1 -- это "placeholder" ака "binding variable", их подставляет клиентская библиотека в случае нормальных БД -- например, libpq.
[16:25:38] <Typhon> строки в 21 веке никто не конкатенирует же
[16:26:42] <gds> ermine: итераты к БД -- вот сейчас как раз смазываю инструмент, но пока не знаю точно.  Аппликативные функторы там будут лёгкой упрощалкой доступа к значениям столбцов текущей записи.
[16:27:05] <gds> Digimmortal: не всегда получится без конкатенций обойтись.
[16:27:11] <Typhon> но sql (особенно, когда его много и он большой), в коде держать не круто, наверное. особенно, если пишется веб приложение. а веб программисты, как известно, про скл имеют весьма странное представление. тут надо либо хранимые процедуры делать (и все запросы сводить к вызову процедуры), либо требовать дба, или другого квалифицированного чела писать запросы, из которых sqlgg, или кто-то ещё, погенерит какой-то код
[16:27:41] <Digimmortal> а почему не круто?
[16:28:42] <Typhon> переключение контекстов + не факт, что специалист, пишущий код, будет на достаточном уровне знать sql (как в примере с вебнёй).
[16:29:14] <Digimmortal> ну, это больше организационный момент
[16:30:16] <gds> Typhon: есть здравое в твоём утверждении.  Вот как раз сейчас разрабатываем штуку с кодовым названием "dsl для языка запросов".  Смысл -- есть "источники данных" (заранее определённые -- например, вьюверы на стороне БД), есть "столбцы" и метаинфа о них.  Полезно там, где полный sql давать нельзя (например, при оформлении относительно-публичного http api для каких-то запросов), ну и в твоём примере, когда лепят вебню, где от sql мало нужно, но ошибок может быть очень много.
[16:31:13] <gds> тьфуты.  "dsl для запросов".  для простых, добавлю.
[16:31:20] <Digimmortal> macaque выглядит кошерно
[16:31:48] <Digimmortal> настораживает что
[16:31:50] <Digimmortal> Macaque queries represent SELECT, INSERT, DELETE and UPDATE queries. They can not be composed.
[16:32:07] <Digimmortal> с чего такое злое ограничение?
[16:32:14] <Typhon> а ещё что-то было у mfp (или как там его).
[16:32:35] <Digimmortal> в compositionality запросов весь цимес
[16:35:19] <Digimmortal> если запрос first class citizen, то появляется куча хороших возможностей
[16:35:30] <Typhon> https://github.com/mfp/ocaml-sqlexpr
[16:35:50] <Typhon> сопутствующих блогопостов найти не могу :-(
[16:39:21] ermine представила себе композабельные запросы в шелле постгреса
[16:39:54] <Digimmortal> в ocaml toplevel не так страшно?
[16:40:35] <ermine> да никак не представляю
[16:41:13] <ermine> если я правильно ничего не понимаю, то это типа партиал аппликешн, только в тексте запроса
[16:41:54] <Digimmortal> генирим типы для таблиц
[16:42:11] <Digimmortal> имеем набор комбинаторов бля работы с таблицами
[16:42:37] <Digimmortal> типа select, where, group_by etc
[16:43:17] <Digimmortal> которые принимают и возвращают ленивую последовательность
[16:44:04] <ermine> и они работают на стороне камла, а не в базе?
[16:44:33] <Digimmortal> мы компоизим выражение с использованием комбинаторов против сгенерённых типов
[16:45:17] <Digimmortal> делаем мы это в quasi quoting контексте
[16:45:27] <ermine> а
[16:45:35] <ermine> инферить типы в p4 ведь нельзя
[16:45:52] <Digimmortal> я в общем идею описываю
[16:46:21] <ermine> а в топлевеле - да, должно наверное работать
[16:46:24] <Digimmortal> на выходе получаем некое AST ссылающееся на генерённые типы
[16:46:46] <Digimmortal> перед испольнением это транслируется в SQL
[16:47:02] <Digimmortal> получаем type safety
[16:47:22] <Digimmortal> и возможность инкрементального построения запросов
[16:47:30] <Digimmortal> корректных
[16:47:39] <gds> а потом дба делает alter table xxx modify (yyy number) вместо бывшего yyy integer и КРОВЬ КИШКИ
[16:47:46] <Typhon> тайпсэйфети будет до тех пор, пока кто-то не поменяет схему
[16:47:50] <Typhon> :_:
[16:48:07] <Digimmortal> ага, ещё libc на серваке удалить могут
[16:48:28] <Digimmortal> или сервак потушить
[16:48:37] <gds> изменение схемы -- нормальный шаг в разработке софта, использующего БД.
[16:48:44] <ermine> gds: ну пусть делает альтер и потом объясняет начальнику, почему не договаривался с программерами
[16:48:56] <Digimmortal> ermine: именно
[16:49:20] <gds> ermine: СУБД -- штука, которая используется многими людьми одновременно.  Даже теми, кто не знает друг друга.  Какое тут "договариваться"...
[16:49:26] <Digimmortal> изменчивость схемы это не повот ктрочки конкатенировать
[16:49:51] <Digimmortal> gds: а код разве нет?
[16:49:58] <ermine> в любой структуре, особенно в бд, нет семантики, поэтому надо договариваться что делать и зачем
[16:52:38] <ermine> gds: скажи, отче, а в AST можно загнать семантику?
[16:52:43] <gds> Digimmortal: предполагаем, что за код конкретной программы (за использование программы, имеющей данный код) отвечает один человек, в противном случае это разброд и шатание, мы это уже проходили.  А с БД так не получается -- не дадут никому отдельную БД "для бухучёта", отдельную БД для "складского учёта", отдельную для "учёта производства".  Потому что эти вещи связаны определённым образом, и технические требования сведут всё к слабо-связанному решению -- например, через те же dblink'и (работа с таблицами, расположенными на другой БД, как со своими) -- но и это порнография, скажем мягко.
[16:53:47] <gds> ermine: отче -- это серьёзно ты :)  AST фактически именно семантику и хранит -- семантику кода, описываемого языком, AST которого рассматриваем.  Но, видимо, я не понял вопроса вообще.
[16:55:15] <ermine> gds: ну пусть так будет, а если чонить в ast поменять - код будет продолжать работать?
[16:55:54] ermine видимо чего-то уловить не может
[16:57:12] <Digimmortal> gds: почему бы не применить ту же логику к коду? куча народа пишет разные относительно изолированные куски взаимодействующие через оговоренные интерфейсы. иногда надо интерфейсы менять и у людей не компилиццо. давайте от статики откажемся и перейдём не петон или жабоскрипт. согласен?
[16:57:12] <gds> ermine: смотря каким образом поменять.  Если новое ast будет подтипом текущего -- можно даже ничего не переписывать для работы старого кода (хотя могу ошибиться, подтупливаю уже).  Если нет -- конечно, надо будет кодогенерилку переписывать для новой генерации "ast -> код", и надо будет парсер переписывать для генерации "исходник -> ast".  Я тоже не могу уловить чего-то.
[16:59:03] <Typhon> Digimmortal, так в твоём подходе интерфейса нету, автоматически проверяемого, разве не так? вот ежели прикрутить pgsql, какой-нибудь, который типы для таблиц выводить будет на этапе компиляции, то ещё может быть. но схема может и поменяться без перекомпеляции софта, и он тогда попадает, вне зависимости от того, есть ли интерфейсы или нет %)
[16:59:37] <ermine> а давайте уволим всехдба и будем сами генерить структуры баз прямо из кода
[17:00:12] <gds> Digimmortal: смотря о каких масштабах речь.  Кое-где нужно нетипизированное, но везде использовать нетипизированное -- геморно, практика показала.  Она же показала, что неплохо работает схема "слабо-связанные большие компоненты, состоящие из сильно-связанного и типизированного кода внутри".
[17:00:47] <gds> ermine: дба занимается многими вещами.  В пределе ты фактически перекладываешь роль дба на программистов, а как-то надо отделять две разные вещи.
[17:01:26] <Digimmortal> Typhon: т.е. у нас 2 проблемы: отсутствие интерфейса и его устаревание, я предлагаю решение первой проблемы
[17:01:42] <gds> например, в применении к хтмл как-то отделили же дизайнеров, верстальщиков, сервер-сайд-кодеров, клиент-сайд-кодеров, и всё получилось.
[17:01:58] <Digimmortal> разве получилось?
[17:02:26] <gds> каждый занимается своей работой, в чужую не лезет, всё в целом работает.
[17:02:29] <Digimmortal> почему тогда все норовят генерить javascript?
[17:02:37] <Typhon> пушо он гогно ^_^
[17:02:43] <Digimmortal> а не писать на нём
[17:02:51] <Digimmortal> вот и я о том же
[17:03:02] <ermine> gds: в хтмл оставили только ast
[17:03:11] <gds> откуда генерить?  из нормальных языков -- потому что он говно, правильно.  Но "клиентское программирование" таки отделено.
[17:03:14] <Typhon> Digimmortal, интерфейс тогда должен генерироваться на основе схемы базы, а не описываться программистом. подход ORM, когда генерируется sql из кода не особо правильный, к.м.к.
[17:03:18] <ermine> а css к хтмлю не относится
[17:03:32] <Typhon> ermine, и css тоже отделено от html'а
[17:04:30] <ermine> Typhon: у меня в бложике теперь будет только чистый html5, никаких дивов и спанов!!!
[17:04:49] <Typhon> так дивы в хтмл вроде ок?
[17:04:51] <Digimmortal> Typhon: я и не предлагаю руками всё 2 раза описывать - либо генерить из базы, либо базу и типы из какого-то другого описания
[17:04:59] <Typhon> или ты там канвас положишь и рисовать всё будешь? %)
[17:05:41] <ermine> Typhon: да они всегда ок, только с семантикой у них криво
[17:06:09] <ermine> Typhon: теперь модно юзать другие группировки header, section, article, etc
[17:07:42] <Typhon> Digimmortal, про генерацию из базы gds верно отметил недостатки. а из какого-то другого описания -- ДБА разве согласится на это? %) он сидит себе спокойной на своём оракле, получает бабло, иногда перезжает на свежию версию, зачем ему какой-то язык описания учить, ещё один, помимо, DDL ? %) опять же. может быть сторонняя база, к которой уже всё написано.
[17:09:27] <ermine> тут слишком горячие флеймы развелись
[17:09:34] <ermine> а код между тем не компилится чота
[17:09:50] Typhon вышел(а) из комнаты
[17:09:56] <ermine> gds: а про аппликативные функторы есть что почитать?
[17:11:06] <gds> ermine: самое понятное -- из вражеской книжки, где солнышко на сайте говорит "срань господня!".
[17:11:19] Typhon вошёл(а) в комнату
[17:14:13] <gds> а так, на практике, апп.функтор f 'a определяется функциями
pure : 'a -> f 'a
<*> : f ('a -> 'b) -> f 'a -> f 'b
вот и всё.
[17:14:41] <Typhon> тайпклассопедию можно
[17:14:53] <Digimmortal> Typhon: это зависит от проекта, в моём понимании ДБА должен заниматься тюнингом базы и консультированием разработчиков, а не сидеть в башне из слоновой кости
[17:15:32] <Digimmortal> gds: т.е. список у нас АФ?
[17:16:03] <Digimmortal> и option
[17:16:32] <Digimmortal> и LWT добро
[17:16:35] <Digimmortal> ?
[17:16:50] <gds> Digimmortal: список и option -- манатки, а любая манатка это АФ.  Например, можно определить
value ( <*> ) fab fa =
  fab >>= fun ab ->
  fa >>= fun a ->
  return (ab a);
[17:17:31] <gds> правильно, всё это частный случай АФ.  И вот <*>, по крайней мере для list / option, вполне интересно само по себе.
[17:18:24] <Digimmortal> а что даёт монада в дополнение к АФ?
[17:18:28] ftrvxmtrx вышел(а) из комнаты
[17:20:01] <Digimmortal> вот пользу АФ понимаю, а монаду нет
[17:20:28] <gds> монада -- bind даёт, например.  То есть, цепочки из <*> можно строить, но они будут строго определённой формы.  Вроде с рекурсией будет нездорово.
[17:31:38] Typhon вышел(а) из комнаты
[17:34:57] <gds> Digimmortal: обсудили, подумали.  Манатки -- для рекурсии, для сложной формы выражения, для гибкости, для случаев нужды в абстрактных bind или join, для удобства (в разных случаях удобен стиль АФ, через <*>, в некоторых -- бинды скорее).  Но мне надо будет по моему апп.функтору (вытаскивающему значения из окружения) попробовать построить манатку, это обещает быть интересным.
[17:48:40] <Digimmortal> попробую повтыкать на интерфейс списка и option'а и понять чего мы лишимся убрав bind
[17:49:16] <Digimmortal> у меня такое ощущение, что я им почти не пользуюсь
[17:58:50] <gds> конкретно bind в list/option -- в окамле мало нужен.  В option это удобно, но часто делает непонятным место возникновения None.  В list -- оно не ленивое, часто будет много генерить.  В LogicM, которое для логических вычислений, типа-надмножество List, более кошерное (см. у олега) -- вот там bind полезен.
[18:03:10] <ermine> к вопросу про module X(Y)(Z) с общим типом t в Y и Z, у меня щас проблема из-за того, что t стал слишком приватным для Z
[18:03:37] <ermine> и не компилицо нифига
[18:04:32] <ermine> скажем, type t =char в Y, а в Z берем str[i], компилятор говорит, что хочет видеть тут Y.t, а не char
[18:12:55] <gds> хотел набросать клёвый пример про аппфункторы и монады, но lwt отличилось тем, что вычисление выражения с типом Lwt.t _ уже вызывает сайд-эффекты, без Lwt_main.run и подобных мер.  Кина не будет, французам спасибо.
[18:20:19] <Digimmortal> а что именно оно делает?
[18:22:32] <ermine> вызывает функцию из модуля Y
[18:23:22] <zert> b
[18:23:33] ygrek вышел(а) из комнаты
[18:23:36] ygrek вошёл(а) в комнату
[18:28:08] Typhon вошёл(а) в комнату
[18:32:40] Kakadu вышел(а) из комнаты
[18:46:40] Kakadu вошёл(а) в комнату
[18:46:44] Kakadu вышел(а) из комнаты
[18:57:40] Digimmortal вышел(а) из комнаты
[19:53:59] <ygrek> ermine: как это слишком приватным?
[20:01:52] <ermine> похоже, пора начинать сомневаться в своей вменяемости
[20:02:20] <ermine> ygrek: а вот! до сих пор не компиляется!
[20:02:34] <ygrek> ну тогда всё понятно
[20:02:51] <ermine> ща попробую набросать пример
[20:12:30] ftrvxmtrx вошёл(а) в комнату
[21:20:32] <ermine> http://yo.jabber.ru/~ermine/a.ml
[21:59:46] <ermine> ygrek: скомпилил?
[22:03:42] ygrek вышел(а) из комнаты
[22:04:02] ygrek вошёл(а) в комнату
[23:09:04] ermine вышел(а) из комнаты
[23:26:20] <ygrek> ermine: ну дык elt абстрактный же
[23:28:38] <ygrek> и Z_TYPE это ж не сигнатура функтора
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!