These are chat archives for synrc/n2o

8th
Nov 2015
Oleg Zinchenko
@cystbear
Nov 08 2015 01:14
@5HT Макс, как будет время, глянь одну строчку кода (реально 1 LoC) композит в эрланжике, https://gist.github.com/cystbear/b27bc5754ffa11fec634#file-compose-erl-L6 и заразом скажи оно такое в erl нужно?, или это только хаскелисты по такому угорают
Andy
@m-2k
Nov 08 2015 01:18
Ну это же инит функции, чтобы функцию без аккумулятора вызывать, типа кошерного апи
Для ленивых
Паблик функция, а остальные приватные, в переводе на ооп. Уверен хацкель тут ни при чем
Oleg Zinchenko
@cystbear
Nov 08 2015 01:26
это реализация композита как я ее в книжке вычитал
Andy
@m-2k
Nov 08 2015 01:27
Молодец
По мне так просто хренота
:smile:
Oleg Zinchenko
@cystbear
Nov 08 2015 01:28
я там одну нубскую книгу читаю, и вот думаю хрени из нее в erl нужны или нет
Andy
@m-2k
Nov 08 2015 01:30
Хрени не нужны :smile:
Oleg Zinchenko
@cystbear
Nov 08 2015 01:32
я пример сделаю что бы ты оценил мощность композита :)
Andy
@m-2k
Nov 08 2015 01:36
Ок, но я спать ща
Namdak Tonpa
@5HT
Nov 08 2015 16:37
у меня таким функциями все кишит в n2o, например fold по handlers
такое обычно ad-hoc в эрланге пишут
если попытаться все монады собрать в одном месте получится уебище типа erlando
лучше на Хаскель переходи
а потом в эрланг возвращайся
в разных местах композиция разная обычно бывает
просто композиция не нужна
нужна монада со своим return и bind
обычно
поэтому как раз однострочник в эрланге для любой стурктуры пишется на ура
Namdak Tonpa
@5HT
Nov 08 2015 16:42
вообще лучше на свободные монады переходить, а типы кодировать эрланг таплами
думай так что в эрланге тапл или рекорд — это тип
например монада IO это что-то что накапливает эффекты
эффекты это что-то что возникает в процессе вычислений
Namdak Tonpa
@5HT
Nov 08 2015 16:48
т.е. это например можно считать логом выслений
но в процессе могут быть ошибки или исключения
поэтом IO долша держать список не только вычислений но и список ошибок
ошибка в эрланге это Error = {error,_} а высиленное значение OK = {ok,_}
поэтому стало быть IO = { List Error, List OK }.
вот если в #cx например привязать к номеру сессии и писать истории вычисления всех сесиий, то внутри #cx должно быть два таких списка. Например в BPE, штуке очень напоминающей N2O в главном тапле стейте #process есть такой указатель на feed_id=history где хранятся аналоги OK.
Andy
@m-2k
Nov 08 2015 16:52
Ты в bpe ушел :smile:
Namdak Tonpa
@5HT
Nov 08 2015 16:53
я просто рассказываю как тут у нас все устроено
немного наверно пееписывать все буду :-)
сделаю персистентность для событий чтобы как в elm был хистори дебаггер
как в BPE буду писать в лог результат выполнения каждого (нагенерированные через wf:wire #actions и все что скрыто) event/1
хаскелисты слишком декомпозиорвали весь фулстек, слишком мелко нарезали
Namdak Tonpa
@5HT
Nov 08 2015 16:59
в нашем стеке не все многообразие алгебры сияет а только самые нужные и простые вещи
мы не хотим быть сложными
Namdak Tonpa
@5HT
Nov 08 2015 17:24
кстати KVS получил поддержку DETS таблиц
теперь можно держать неограниченную базу на 1 ноде любого размера
осталось написать чтобы каждые 2ГБ вызывалась 1 функция kvs:rotate(Table)
незная как это лучше реализовать
так чтоб только к памяти обращаться
Namdak Tonpa
@5HT
Nov 08 2015 20:02
включается так:
 {kvs, [{dba,store_mnesia},
        {mnesia_media,disc_only_copies},
вручную ротация производится с помощью kvs:rotate(AtomTableName)
disc_copies имеет ограничение в объем RAM, так что теперь свобода
вот как выглядит например история моих ротейтов для таблицы process:
> kvs:get(config,process).
{ok,{config,process,
            [#interval{left = 62251,right = 10000000000000000000,
                       name = process14},
             #interval{left = 32114,right = 62251,name = process13},
             #interval{left = 32114,right = 32113,name = process12},
             #interval{left = 30102,right = 32113,name = process11},
             #interval{left = 22114,right = 30102,name = process10},
             #interval{left = 20075,right = 22113,name = process9},
             #interval{left = 18152,right = 20074,name = process8},
             #interval{left = 12114,right = 18152,name = process7},
             #interval{left = 12114,right = 12113,name = process6},
             #interval{left = 12114,right = 12113,name = process5},
             #interval{left = 10181,right = 12113,name = process4},
             #interval{left = 2114,right = 10181,name = process3},
             #interval{left = 2114,right = 2113,name = process2},
             #interval{left = 2114,right = 2112,name = process1}]}}
Namdak Tonpa
@5HT
Nov 08 2015 20:08
там есть странные штуки типа left = 2114,right = 2113 но оно работает :-)
тестируется так
spawn(fun() -> [ kvs:add(#process{id=kvs:next_id("process",1)}) 
                          || _ <- lists:seq(1,100000) ] end).
kvs:rotate(process).
kvs:get(process,kvs:top(process)).
можно так обращаться:
> kvs:get(process8,18152).
{ok,{process8,18152,undefined,feed,process,18151,18153,[],
              true,undefined,undefined,[],[],[],[],[],undefined,[],[],
              undefined,undefined,undefined,undefined,undefined,undefined,
              undefined}}
можно так:
> kvs:get(process,18152).
{ok,#process{id = 18152,version = undefined,
             container = feed,feed_id = process,prev = 18151,
             next = 18153,feeds = [],guard = true,etc = undefined,
             name = undefined,roles = [],tasks = [],events = [],
             history = [],flows = [],rules = undefined,docs = [],
             options = [],task = undefined,timer = undefined,
             notifications = undefined,result = undefined,
             started = undefined,beginEvent = undefined,
             endEvent = undefined}}
во втором случае оно подменяет первый атом рекорда из базы
таким образом и версионирование работает в KVS
и версионирование и ротация (которая необходима для DETS бекенда, у которого ограничение в 2ГБ). Но так это ограничение же намного удобнее что все по 2ГБ нарезано. Можно просто старые выкинуть таблицы если к ним не обращаться.
Namdak Tonpa
@5HT
Nov 08 2015 20:13
типа автоархивация
т.е. благодаря KVS, ограничение DETS на 2ГБ не имеет никакого значения
резать на таблицы можно также по календарю
например делать ротацию раз в сутки или раз в месяц
чтобы четко было вот данные за последние месяц
одна таблица — один файл :-)
или там одна версия рекорда — одна таблица