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

GMT+3
[00:01:00] <ermine> похапэ тоже не очень убогое поделие, если вдуматься
[00:01:38] <Kakadu> не, меня оно не радует
[00:01:56] <Kakadu> я как-то на РНР хотел проверить что  строка не длинее 30 символов
[00:02:17] <Kakadu> получилось if(strlen($s<30)) { ...
[00:02:22] <zert> да если хорошо подумать, то и камло почти живое
[00:02:26] <Kakadu> долго не понимал в чем проблема
[00:03:00] <ermine> ты еще на руби проверь
[00:03:08] <Kakadu> а там что?
[00:03:26] <Kakadu> совсем всё компилится?)
[00:04:02] <ermine> про руби не помню уже
[00:05:02] <zert> это в перле всё компилится
[00:05:09] <zert> даже небо, даже аллах
[00:08:08] <ermine> а пчу pugs не получили распространения?
[00:08:44] <zert> автор себе яйца отрезал
[00:09:04] <zert> и не только
[00:09:58] <ermine> вечно у вас, у мужиков, есть что отрезать
[00:12:11] <zert> такие дела
[00:13:39] <Kakadu> Если честно, то поле для ввода коммента к багу и кнопка запостить расположены несколько необычно на камлокузне
[00:13:49] <ermine> блин, опять сломале хренцузы свой ocsigen
[00:15:22] <zert> не сломали, а альтернативно починили
[00:15:27] <zert> хранцузе же
[00:17:22] <ermine> и язык у них хренцузский
[00:17:36] <ermine> пора значит спать
[00:20:42] <ermine> хотя создается впечатление, что ocsigen опережает lwt и посему другой хренцуз не успел закоммитить еще
[00:22:24] ermine вышел(а) из комнаты
[00:33:13] Kakadu вышел(а) из комнаты
[01:00:56] arhibot вошёл(а) в комнату
[01:31:59] komar вышел(а) из комнаты
[01:47:20] arhibot вышел(а) из комнаты
[03:19:15] zert вышел(а) из комнаты
[03:41:22] Typhon вышел(а) из комнаты
[05:23:07] iNode вошёл(а) в комнату
[07:43:53] iNode вышел(а) из комнаты
[08:31:58] iNode вошёл(а) в комнату
[08:56:46] ermine вошёл(а) в комнату
[08:58:30] gds вошёл(а) в комнату
[09:25:38] Typhon вошёл(а) в комнату
[10:34:46] <f[x]> gds: camlp4 mutable это всё та же бага имхо
[10:35:25] <gds> которая с рабочим обходом или без обхода вообще?
[10:36:24] <f[x]> в той что пофиксили вчера было упоминание про mutable
[10:36:44] <f[x]> но патч там конечно нифига не очевидный
[10:38:48] <gds> я побоялся смотреть на патч, просто взял сразу нужную версию из version/3.12.
[10:40:01] <gds> так чего делать будем -- переоткрывать багу?  какую, если да?
[10:42:59] <f[x]> http://caml.inria.fr/mantis/view.php?id=5080#c5606
[10:43:03] <f[x]> это не оно?
[10:43:10] <f[x]> а остальные примеры пофиксились?
[10:43:45] f[x] не знает чего с этим deriving'ом делать
[10:52:50] <gds> я не особо смотрел остальные примеры, разве что type t = A пробовал, когда xclerc дал первый кривой патч.
А твой патч куда / к чему применять?
[10:53:08] <gds> поискать по исходным строкам, если чо?
[10:53:39] <f[x]> если я правильно понял то мой workaround из комментов должен быть не нужен
[10:53:51] f[x] посмотрит deriving на выходных
[10:59:00] <gds> кстати, может я просто древний deriving пробую?  где-нибудь свежий надо взять, или там это не исправляли?
[11:00:53] <f[x]> я у себя не исправлял ещё под 3.12 ничего
[11:07:44] <gds> +1.  Мне-то куда исправлять, если оверблд древний.
А падлинупсом пользую 3.12, но тоже без его фишек.
[11:08:24] <f[x]> .0 версии юзать себе дороже :)
[11:08:59] <gds> кстати да.  Играться, фишки новые смотреть -- ещё можно.
[11:10:34] ftrvxmtrx вошёл(а) в комнату
[11:29:07] <gds> "MinGW does not implement the POSIX mmap() function, so this test should probably be rewritten/deleted on MinGW."
нипаняяятна.
[11:38:48] <f[x]> so what?
[11:39:30] <Typhon> mmap в тесте используется или в модуле самом?
[11:41:55] <Typhon> посмотрел, походу чувак как бы намекает gds'у починить тест :)
[11:43:56] <gds> дык вроде были memory-mapped files падвендой где-то.
[11:44:08] <gds> не помню, в окамле есть или нет, но вроде тоже видел.
[11:44:24] <f[x]> ясно что есть
[11:44:27] <f[x]> Bigarray
[11:44:47] <gds> в нём нет?
[11:47:41] <Typhon> бр, так у них свой "mmap" насколько я понимаю, они ж не юниксовый mmap зовут — вон там array, так что либо я не понимаю, либо чувак в ответе гонит!
[11:48:15] <f[x]> в батарейках нету биндингов
[11:48:33] <f[x]> Bigarray.Array1.map_file
[11:48:34] <gds> я вижу otherlibs/bigarray/mmap_win32.c, вижу там caml_ba_map_file().
[11:49:56] ftrvxmtrx вышел(а) из комнаты
[11:57:54] zert вошёл(а) в комнату
[12:10:15] <gds> а какую lwt сейчас надо брать, чтобы она падвендой завелась?  то есть, без libev/libevent, предполагаю.
[12:10:40] <gds> точнее, такую, которая умеет Unix.select.
[12:14:31] <Typhon> libev, _по идее_, должна собираться падвендой же? или тебе не охота тащить зависимости?
[12:16:06] <Typhon> а так, судя по http://ocsigen.org/lwt/sources/CHANGES?view=content до версии 2.2.0
[12:16:28] <gds> не знал про libev падвендой.  Сейчас посмотрю, много ли там тащить.
[12:17:05] <gds> а проблема с bigarray + mmap таки есть, даже не в батарейках.  может мои изменения повлияли, посмотрим.
[12:24:52] <Typhon> http://doc.dvgu.ru/devel/ev.html#win32_platform_limitations_and_workarounds не уверен, правда, что всё получится c lwt :-)
[12:27:49] <gds> срань господня.
[12:29:29] ftrvxmtrx вошёл(а) в комнату
[13:22:19] Kakadu вошёл(а) в комнату
[13:53:29] <Kakadu> кто хорошо осознает как работает chroot в линуксах? а то я думаю хранить камло 12е на виртуалке это было неверное решение
[13:54:15] <f[x]> а зачем chroot?
[13:54:27] <Kakadu> ибо debian
[13:54:29] <gds> имхо проще накомпилять в своей директории и просто выставлять правильные OCAMLLIB и PATH.
[13:54:39] <f[x]> и что debian? ;)
[13:54:47] <f[x]> поставь в /opt
[13:54:48] <gds> я так даже падвендой делаю :)
[13:55:08] <Kakadu> ну винда есть винда, не удивительно
[13:55:21] <gds> а дебиан -- это как винда, только ещё гибче.
[13:55:28] <Kakadu> сарказм?
[13:55:46] <gds> в формулировке -- слегка, а по факту -- реально сильно гибче и лучше.
[13:55:51] <gds> для разработки на окамле.
[13:55:54] <f[x]> Kakadu: отбрось предубеждения и молви свою проблему, отрок!
[13:56:40] <Kakadu> Проблема: хочу последний оксиген, но чтобы пакеты не посыпались. chroot вызывает ужас и страх
[13:57:04] <f[x]> Решение: ставишь 3.12 в /opt/ocaml-3.12
[13:57:21] <f[x]> и собираешь в отдельном шелле с PATH=/opt/ocaml-3.12/bin:$PATH
[13:57:32] <f[x]> собираешь руками все нужные пакеты
[13:57:51] <Kakadu> и встанут они в /usr/local/lib/ocaml/3.12.0?
[13:58:01] <f[x]> либо если ты смелый пробуешь godi
[13:58:19] <Kakadu> а зачем смелость нужна?
[13:58:33] <f[x]> они встанут туда куда ты ocamlfind настроишь (собранный под 3.12) - по умолчанию в /opt/ocaml-3.12/lib/site-lib
[13:58:47] <gds> про отдельный шелл -- я обычно добавляю OCAMLLIB и CAMLLIB тоже, указывающие на /opt/ocaml-3.12/lib
[13:58:52] <f[x]> потому что я хз насколько оно поломано :)
[13:59:04] <f[x]> OCAMLLIB только на винде нужен
[13:59:31] <f[x]> точнее OCAMLLIB нужен если установка была не в каталог заданный при configure
[13:59:49] <Kakadu> что-то у меня в PATH ничего про камло нет вообще
[14:00:03] <f[x]> что почти всегда верно при инсталляции prebuilt виндовых бинарников
[14:00:07] <gds> а ещё какая-то хрень падвендой хочет CAMLP4LIB, иначе бы я его не ставил :)
[14:01:16] <f[x]> надо в вики всё это накидать - про multiple ocaml versions
[14:02:35] <gds> по идее, надо, но что там писать кроме как "выставьте path" -- не знаю.
[14:03:19] <gds> кстати, а как в случае message passing енфорсится синхронность а-ля "вызов функции"?  Например, функция принимает сообщения, и ей шлют сообщения, сначала первое, просто так, не ожидая ответа (типа-асинхронно), а затем второе, но хотят получить ответ на него.  Если функция в ответ будет слать сообщения сплошным потоком, то получит не свой ответ, а ответ на первое сообщение.
Вообще, если рассматривать просто сообщения, должны быть как "отправить сообщение", так и "отправить сообщение в ответ на принятое сообщение" с правильным учётом пар запрос-ответ в функции, которая хочет "синхронный" ответ.
Но что-то мне в этом не нравится.
Как это у белых людей сделано?
[14:03:49] <f[x]> gds: вот Kakadu видишь с chroot'ом наперевес?
[14:04:27] <gds> вижу!  Но конструктивного материала мало, только "установите path".
[14:04:42] <f[x]> ну будет хотя бы понятно что так можно и нужно делать
[14:04:51] <zert> chroot работает в достаточной мере изолированно ;)
[14:05:20] <f[x]> chroot для такого не нужен, нужен если например хочешь собирать под x86 на amd64
[14:05:32] <f[x]> в линуксах кстати ещё есть lxc
[14:05:41] <f[x]> chroot на стероидах
[14:06:46] <f[x]> точнее не то что не нужен, а слишком неудобен
[14:13:04] <Typhon> gds:     у теля, в "введении в распределенные алгоритмы" был, кажется пример реализации синхронного на асинхронном ( http://www.amazon.com/Introduction-Distributed-Algorithms-Gerard-Tel/dp/0521794838 ). на русском книга тоже есть, в интернете не видел, моя бумажная — дома :(
[14:15:32] <gds> ну, если под рукой нет, то забьём.  В принципе, штука наверное очевидная тем, кто message passing в деле использовал по-взрослому, без трусов.
А из очевидных решений -- можно добавить какой-нибудь "номер сообщения" в запрос и обязать отправлять его в ответах, например.  Но кривенько как-то.
[14:16:37] <zert> gds: ща расскажу
[14:16:50] <zert> в ерланге для этого есть вызов gen_server:call, например
[14:16:56] <zert> что он делает:
[14:18:23] <zert> 1. делает уникальный референс, такая шняжка, которая уникальна в определённый, достаточно большой промежуток времени
[14:18:48] <zert> 2. с этим референсом посылает нужному процессу сообщение, в которое вкладывает так же свой идентификатор
[14:18:59] <zert> 3. ждёт от того процесса ответа с этим же референсом
[14:19:27] <zert> если ему идут сообщения, не попадающие под этот паттерн, то он их не вычитывает, ждёт нужного
[14:20:45] <zert> использовать простой номер тоже можно, если у тебя набор типов сообщений небольшой и случайно такой номер прийти не может
[14:20:51] <gds> то есть, отвечающий процесс обязан включить референс в ответ?
[14:21:01] <zert> да
[14:21:49] komar вошёл(а) в комнату
[14:22:41] <gds> а это делается явно или неявно?  то есть, отвечающий процесс читает сообщение, ищет в нём референс, далее что-то своё считает, и формирует новое сообщение определённого формата, явно включающая туда референс.  так?
[14:23:38] <zert> есть формат:
{'$gen_call',{<0.37.0>,#Ref<0.0.0.41>},message}
[14:23:58] <zert> здесь атом '$gen_call' означает, что это синхронный вызов
[14:24:19] <zert> {<0.37.0>,#Ref<0.0.0.41>} — идентификатор вызывающего процесса и уникальный референс
[14:25:22] <zert> и в ответ он посылает такое:
{#Ref<0.0.0.54>,some_reply}
[14:25:48] <zert> а вызывающий процесс, соответственно, ожидает подобный паттерн:
{#Ref<0.0.0.54>, Msg}
[14:26:07] <zert> и Msg — это будет результат синхронного вызова
[14:28:23] <gds> агааа!  Всё понял.  Благодарю за объяснение.
Однако получается так, что функции, которые хотят быть вызванными и синхронно, и асинхронно, обязаны ловить два паттерна -- как {'$gen_call', ..., message}, так и какой-нибудь ещё другой паттерн с message унутре.  Так?
[14:28:54] <zert> нет, это не так
[14:29:20] <zert> каждый процесс, который создан с помощью бихейвора gen_server, реализует коллбэки handle_call и handle_cast
[14:29:42] <zert> в handle_call делается обработка синхронных вызовов, а в handle_cast — асинхронных
[14:29:53] <zert> в этих коллбэках уже дёргаются функции
[14:30:41] <zert> и кроме того, ответ можно дать несколько позже, не сразу, лишь бы он за таймаут не вылез
[14:31:14] <zert> для этого есть вызов gen_server:reply(From, Reply), где From — тот самый кортеж с идентификатором и референсом {<0.37.0>,#Ref<0.0.0.41>}
[14:42:55] <Kakadu> странно. я набрал checkinstall без sudo, а камло установилось
[14:43:13] <zert> проверь права
[14:43:56] <Kakadu> я обычный юзер. супербита на checkinstall вроде нет
[14:45:14] <zert> а на те директориях, куда поставилось, права нормальные?
[14:45:43] <zert> или может ты уже туда ставил от sudo, там файлы с твоими правами остались, а сейчас ты их просто переписал
[14:45:44] <Kakadu> 755
[14:46:06] <zert> компилил от юзера, ставил через sudo
[14:46:25] <ermine> жрут ли верблюды кактусы?
[14:46:46] <zert> нет, в среде обитания ерблюдов нет кактусов
[14:46:51] <Kakadu> мне говорили что кактусы вкусные
[14:46:56] <zert> не все
[14:46:57] <Kakadu> они внутри красненькие
[14:47:01] <zert> тоже не все
[14:47:13] <zert> я в детстве у бабушки кактус съел
[14:47:23] <zert> она его выбрасывать хотела, я почистил и поел
[14:47:32] <zert> вкус очень слабый был
[14:47:39] <zert> и немного горчил
[14:48:16] <zert> кошка ещё ела нечищеный, запрыгивала на подоконник и аккуратно откусывала от него кусочки
[14:48:31] <gds> во даёте.
[14:49:24] <zert> они ещё ядовитые бывают
[14:49:27] <zert> и галлюциногенные
[14:49:42] <zert> так что все подряд жрать не надо
[14:49:54] <Kakadu> во франции кактусы, а в России - мухобморами это завется
[14:50:14] <Kakadu> ох уж эти французы
[14:53:52] <Kakadu> такое ощущение, что checkinstall не всегда работает
[14:54:22] <Kakadu>   install library /opt/ocaml3.12.0/lib/ocaml/camlp4/camlp4lib.a
ranlib: could not create temporary file whilst writing archive: No more archived files
make: *** [install] Error 1
[14:54:40] <Kakadu> может всё-таки превратить debian  в slackware?)
[14:56:04] <gds> более-менее асилил handle_{call,cast,info}.  Подумалось, что тот уникальный идентификатор, в теории, можно было бы реализовать просто порождением нового процесса (вот оно, обеспечение уникальности) и передачей запроса-ответа через него.  На практике -- не знаю вот, как по производительности было бы, но отдельный референс не нужно было бы учитывать, было бы просто "ответить на данное сообщение".
[14:57:17] <zert> ну породишь ты процесс, у него будет такой же почти уникальный идентификатор
[14:57:28] <zert> а за ним ещё надо следить, дабы не упал
[14:57:36] <zert> а то кто-нибудь его возьмёт и прибьёт
[14:58:09] <zert> а так тут ещё и мониторинг между двумя процессами создаётся, если один процесс упал, второй сразу об этом узнаёт и не ждёт ответа
[14:58:15] <zert> ибо таймаут может быть бесконечный
[14:58:24] <zert> и за бесконечное время может много чего произойти
[14:58:41] <zert> так что процесс — лишняя сущность, достаточно и референса
[15:08:37] <gds> а как именно тут создаётся мониторинг?  Вызывающий код получает ответ "таймаут!"?
[15:11:23] <ermine> ырланк - это сплошной шедулер
[15:14:09] <zert> виртуальная машина предоставляет такой инструмент
[15:14:38] <zert> процесс, который мониторит другой, получает сообщение 'DOWN', когда процесс падает
[15:14:51] <zert> в этом сообщении его идентификатор, референс монитора
[15:15:06] <gds> понял, интересно.  Полезная функциональность, когда дофига процессов.
[15:16:33] <gds> вот начал набрасывать тупенький проект про message passing: https://docs.google.com/document/d/1IYeADH--HjFCEtvyuIv21pDVozow1TzPf3WyZoe6qGA/edit?hl=en&authkey=CNj-hHA .  Кто хочет, комментируйте хоть прям там (только каким-нибудь другим цветом для ясности).  (говорят, гуглодоки роняют оперу, осторожно!)
[15:18:43] <zert> там ещё есть супервайзоры, которые перезапускают процессы в случае их падения, а если падения происходят сильно часто, то сами завершаются. и так выше по дереву
[15:20:01] <gds> удобно, однако.  /me тщательно записывает
[15:20:14] <zert> почитай getting started :)
[15:20:22] <zert> там ещё много чего интересного
[15:21:17] <gds> буду читать.
[15:22:17] <Typhon> а ещё есть красивое http://learnyousomeerlang.com/ !
[15:23:21] <gds> очень красивое!  тоже буду смотреть.
[15:24:04] <zert> и ещё есть конфа erlang@
[15:24:14] <zert> и рассылка erlang-russian на гугле
[15:24:23] <gds> ZOGманивают!
[15:26:13] <Typhon> в конфе эрланг@ обычно молчат же, вроде?
[15:28:41] <f[x]> adduser user staff и в /usr/local можно ставить без рута
[15:28:45] <f[x]> ^^ боян
[15:29:11] <zert> Typhon: как попадёшь
[15:29:19] <zert> иногда и флуды бывают
[15:56:29] <Kakadu> мдя, configure от ounit не хочет подцеплять то камло, которое which показывает
[16:06:17] <Kakadu> а нет, сумасшествие прошло
[17:30:20] gds вышел(а) из комнаты
[18:00:19] iNode вышел(а) из комнаты
[18:09:41] komar вышел(а) из комнаты
[18:35:25] gds вошёл(а) в комнату
[18:37:58] komar вошёл(а) в комнату
[19:27:43] Typhon вышел(а) из комнаты
[19:35:05] ftrvxmtrx вышел(а) из комнаты
[19:55:42] <Kakadu> кажется я сейчас зафейлю собрать нормально lwt
[19:56:15] <Kakadu> есть куча зависимостей, которые вроде как не особо нужны, но их много
[19:56:42] <Kakadu> всё-таки компиляция из исходников требует большего интеллекта, чем aptitude
[19:58:22] <ermine> не, интеллект не нужен для механического запуска make
[19:58:47] ermine довела французиков до компилябельности ocsigen
[19:59:14] ermine впрочем нашла еще пару поводов попинать их, чтобы не расслаблялись
[20:02:40] <Kakadu> ermine: надо ещё читать, сообщения почему он не компиляется, удалять ненужные цели для билда и смотреть, вдруг оно компиляется но отсутствует, что-то полезное, что не ломает компиляцию.
[20:06:01] <ermine> Kakadu: ты уже который день собираешь оазис?
[20:06:58] <Kakadu> оазис собрался
[20:07:03] <gds> Kakadu: меня в своё время это задолбало, оверблд тому следствие.  Понял, что нужно всегда брать исходную директорию, копировать в рабочую, и там компилять (а после -- удалять).  Потом понадобилось вносить постоянные, но одинаковые изменения, разные для разных платформ, так появились патчи.  Потом зависимости появились, чтобы при возможном изменении оно перекомпилировалось.  Ну вот и весь оверблд, если не брать бинарные дистрибутивы и кое-какие мелочи.
[20:07:05] <Kakadu> вообще второй
[20:07:37] <Kakadu> gds: а почему ln -s не работает?
[20:07:53] <gds> где / для чего не работает?
[20:09:36] <Kakadu> мммм. я даже не могу сказать почему не работает и где. React говорит что надо копипастить исходники в папку lwt. ну я налинковал. не работает. Включил ./configure --enable-all - оказалось что он react ищет через ocamlfind. а он не установлен. почему - ХЗ
[20:11:23] <gds> если lwt ищет reach через ocamlfind, значит, скорее всего, react ошибается про копипасту.  Советую поставить react по-пацански.
[20:16:41] <ermine> каво ищет? react?
[20:17:22] <ermine> lwt не заинтересуется реактом, пока не укажешь --enable-react
[20:17:33] <Kakadu> а он нужен?
[20:17:47] <ermine> для ocsigen - да
[20:17:52] <Kakadu> просто оно многим не интересуется, но непонятно понадобится ли это позже
[20:18:16] <ermine> lwt надо собирать с --enable-react --enable-ssl
[20:19:24] <Kakadu> react 0.9.2 - ok?
[20:19:51] <ermine> хз, я из даркса ставлю
[20:28:50] <Kakadu> я не понимаю зачем они имею билд скрипт на шелле
[20:39:53] <Kakadu> ermine: у тебя ocamlfind знает про react?
[20:44:23] <ermine> Kakadu: ага, я подправила мету после инсталляции
[20:44:36] <ermine> у меня камлофинд поганный знает всё
[20:54:16] ftrvxmtrx вошёл(а) в комнату
[21:10:30] Typhon вошёл(а) в комнату
[21:58:24] ermine вышел(а) из комнаты
[22:22:14] <Kakadu> в чем фишка ocamlduce? почему он хочет исходники камла чтобы компиляться?
[22:22:31] <Kakadu> будет ли без него норм компиляться ocsigen?
[22:26:19] <Typhon> enable_ocamlduce в configure должно быть
[22:27:11] <Typhon> он для "статической проверки xhtml'а" нужен, емнип -- фишки, которая, по-моему, не особо полезна, но ей периодически тыкают как достоинство ocsigen'а
[22:30:31] <Kakadu> я просто не понимаю как дусю компилять
[22:31:39] <Typhon> с какими-то сложностями ставилась у меня, да, не фрибсде. олсо, смотри на вике
[22:31:50] <Typhon> ermine там писала, как ставить свежий оксиген
[22:32:00] <Typhon> давно, но может ещё актуально
[23:02:25] <Kakadu> короче ну эту кмлодусю
[23:02:33] <Kakadu> с её ошибками компиляции
[23:02:58] <Typhon> http://ocaml-tutorial.org/ лежит, есть ли зеркало?
[23:03:19] <Typhon> http://mirror.ocamlcore.org/ocaml-tutorial.org/index.html
[23:15:59] <gds> "(* полиморфность по ‘o2 достигается тем, что он не используется *)"  -- поразительные формулировки.  Сам от себя не ожидал такого в проектной документации.
[23:20:57] <Kakadu> бугагашенька)
[23:24:01] <zert> охрененная полиморфность тащемта
[23:27:56] <gds> ну а чо, типовый параметр не используется, так как функция принципиально не может содержать никаких отсылок к нему.  Нормальная полиморфность.
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!