These are chat archives for synrc/n2o

14th
Mar 2016
Roman
@AstRonin
Mar 14 2016 07:09
@m-2k проблема была в понимании умирания процессов в ковбое, я то думал, что они всегда умирают, а это не так, по протоколу http/1.1 они вообще стараются выжить если браузер (или в response указать) не посылает connection:close... поставил этот хедер в close и все стало дохнуть без проблем
Vitaly Shutko
@sokal32
Mar 14 2016 07:16
потому что видимо keep alive
Roman
@AstRonin
Mar 14 2016 07:23
угу, поумолчанию при http/1.1
Vitaly Shutko
@sokal32
Mar 14 2016 07:24
а зачем тебе чтобы он дох? это же типа позволяет частично убрать оверхед на handshake
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 07:43
Никто не в курсе, куда девалась cowboy:start_http?
Я что-то пропустил за неделю?
Roman
@AstRonin
Mar 14 2016 07:45
эт понятно, проц для связи может и не дохнуть, мне это и не нужно, я думал, что дохнет именно пользовательский (хотя возможно это один и тот же используется, не копался еще туда), а он тоже оказывается не дохнет..., и я один стейт хранил, который не очищал и естественно все навернулось... просто надо это учитывать этот момент ковбоя (особенно когда будет использоваться http/2.0) и осторожно использовать стейты... ковбой почему-то пользовательский хранит, хотя неужели создание отдельного проца такая уж тяжелая операция...
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 07:47
А, вижу
Namdak Tonpa
@5HT
Mar 14 2016 07:49
cowboy:start_http убрали потому что этот способ не позволяет рестартовать n2o
нашел этот баг @artemeff
теперь стартуем через runch
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 07:51
Да я все еще с голым ковбоем бегаю. Неделю назад все было нормально, а сегодня получчаю undef
Oleg Zinchenko
@cystbear
Mar 14 2016 08:06

проблема была в понимании умирания процессов в ковбое, я то думал, что они всегда умирают

как в PHP

Namdak Tonpa
@5HT
Mar 14 2016 08:06
В N2O все как в PHP!
только меньше и проще
можно кстати PHP темплейтер эрланговый
я видел есть
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 08:49
This message was deleted
Эспериментирую
> b = new Bert.Encoder({$:[':foo', '$bar']}), b.buffer
> ["131", "TUPLE(2)", "ATOM(3)", "STRING(3)"]
Namdak Tonpa
@5HT
Mar 14 2016 08:55
совместимо все должно быть с N2O
а это отсебятина пока )
Andy
@m-2k
Mar 14 2016 09:40
@AstRonin напиши код как ты пофиксал проблему с ковбоем
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 10:10
@5HT я пока разбираюсь, как кодировать. Смотрел твой bert.js и нифига не понял. На той неделе с температурой валялся, вообще ничего не делал
> b = new Bert.Encoder({$:[':client', {$:[':chat', '$Message']}]}), b.buf
> [131, 104, 2, 100, 0, 6, 99, 108, 105, 101, 110, 116, 104, 2, 100, 0, 4, 99, 104, 97, 116, 107, 0, 7, 77, 101, 115, 115, 97, 103, 101]
Andy
@m-2k
Mar 14 2016 10:12
@kagami-ryuuji спрашивай свои ответы
bert.js нынче не сериализует в авторежиме из json в bert
проставляй типы для всех значений сам
enc(tuple(atom('client'),bin('data')))
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 10:14
@m-2k я так и делал, когда n2o щупал. Только в скобках путался
Andy
@m-2k
Mar 14 2016 10:14
есть такое
но если ты так и делал, то что непонятно?
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 10:43
Я про внутренности. Я свой энкодер/декодер пишу. Декодер готов, а энкодер работает с json. Только конструкции получаются страшные
Andy
@m-2k
Mar 14 2016 10:43
там ничего и не надо понимать, оно писалось так: у кого меньше строк будет тот и выиграет
мой вариант на прототипах соснул
поэтому в репе версия Макса с адовым рефакторингом
@kagami-ryuuji можно вопрос? зачем писать свой?
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 10:45
Хотел разобраться, как это работает
1 -> 1
undefined -> []
false -> false
true -> true
[] -> []
[x, y] -> list
'$string' -> string
':atom' -> atom
{$:[]} -> tuple
{$:{}} -> map
Andy
@m-2k
Mar 14 2016 10:46
и откуда код?
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 10:47
То, что выше - это я в комментах в js файле написал
Доделаю и коммит сделаю
Andy
@m-2k
Mar 14 2016 10:48
если честно я вообще не понимаю о чем ты тут пытаешься общаться
Namdak Tonpa
@5HT
Mar 14 2016 10:48
он пишет bert.ts
BERT кодер декодер
Andy
@m-2k
Mar 14 2016 10:48
а
Namdak Tonpa
@5HT
Mar 14 2016 10:49
я ему сказал сделать его совсместимым с N2O
но пока вижу что до цели еще далеко :-)
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 10:49
Не волнуйся, сделаю )
Andy
@m-2k
Mar 14 2016 10:49
а шо, под type js низя этот юзать?
Namdak Tonpa
@5HT
Mar 14 2016 10:49
ну он не хочет
хочет чтобы было на TS написано и тайпчекалось
это впринципе ризоннно
Andy
@m-2k
Mar 14 2016 10:50
лол, ну портировать же можно вроде
Namdak Tonpa
@5HT
Mar 14 2016 10:50
ну он с нуля написал, так как не понял нашего байтойобства
поэтому сам изобрел формат JSON конвертирующего
Andy
@m-2k
Mar 14 2016 10:50
не, нужно просто по одной ф-ии брать и переписывать
разом конечно трудно понять
Namdak Tonpa
@5HT
Mar 14 2016 10:51
ну не хотят люди мало кода писать
хотят много
что я сделаю :-)
пусть будет что есть
Andy
@m-2k
Mar 14 2016 10:51
таки да
Namdak Tonpa
@5HT
Mar 14 2016 10:51
главное чтобы формат JSON еще раз не конвертировался )
Andy
@m-2k
Mar 14 2016 10:51
как у расти, лол
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 10:52
Я это для себя же начинал :D
Namdak Tonpa
@5HT
Mar 14 2016 10:52
BERT.TS -> JSON -> BERT.JS
Andy
@m-2k
Mar 14 2016 10:52
@kagami-ryuuji да и мы вроде уже как давно выяснили что arrayBuffer не особо нужен и Blob'ы всякие
Namdak Tonpa
@5HT
Mar 14 2016 10:52
всмысле не нужен?
а 25МБ/c откуда берутся?
Andy
@m-2k
Mar 14 2016 10:53
ну вроде AB предел мечтаний
так как ток у него есть конкатенация в виду функции set
это вроде как единственное что я нагуглил когда ковырялся в энкодере
DataView ток для декода юзается и это хорошо
@kagami-ryuuji лучше бы https://github.com/synrc/n2o/blob/master/priv/utf8.js#L5-L13 это переписал чем ts задрачивать впустую )
Namdak Tonpa
@5HT
Mar 14 2016 10:58
он это тоже переписал
он все правильно сделал
Andy
@m-2k
Mar 14 2016 10:58
шо там уже все красиво?
Namdak Tonpa
@5HT
Mar 14 2016 10:58
теперь надо это сделать с чем-то совместимым и написать пример
ну я посмотрел, вроде ок
посмотри на его код, шоты спрашиваешь )
Andy
@m-2k
Mar 14 2016 11:01
найс
@kagami-ryuuji ты онемешнег?
и ява-бой?
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 11:05
Анимешник, пхпшник
Andy
@m-2k
Mar 14 2016 11:05
ггг
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 11:05
А почему ява?
Andy
@m-2k
Mar 14 2016 11:05
жс-бой [быстрофикс]
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 11:06
Не, js я не люблю
Просто приходится его терпеть
Andy
@m-2k
Mar 14 2016 11:06
мне спустя год поверхностного изучения по нужде – понравился
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 11:06
я не понимаю систему прототипов
Andy
@m-2k
Mar 14 2016 11:06
ща ваще ровно к нему отношусь
даже положительно
как показывает bert.js прототипы не нужны. поэтому и понимать их не стоит
хотя я их юзаю и норм
но у меня не байтойобство, поэтому полет нормальный
Semyon Novikov
@semka
Mar 14 2016 11:32
@m-2k как ты Чезарини читал? Там же перевод просто пиздец
photo_2016-03-14_16-33-03.jpg
Вот, например, Максим
ты что используешь, апельсины или яблоки?
Just-Eugene
@Just-Eugene
Mar 14 2016 11:54
по Чезарини занимаюсь сейчас. Это разовый минус Чезарини? или стоит что-то другое читать? спасибо.
Andy
@m-2k
Mar 14 2016 11:54
Я когда её читал язык пытался изучить а не на апельсины надрачивал
Roman
@AstRonin
Mar 14 2016 11:54

@m-2k (на счет ковбоя) там кода как такого нет, есть рекомендации, в локальном коде любой wf:state (он же put/get) надо очищать (или приводить к какому-то состоянию) в main/0, типа

wf:state(some_state, []),

хотя, если по коду... и привести к рекомендациям ковбоя, то во вреймворке в n2o_cowboy:terminate/3 заменить на

terminate(_Reason, Req, _State) -> n2o_document:terminate(Req), ok.

и нафигачить n2o_document:terminate/1

terminate(_Req) -> (?CTX#cx.module):terminate().

тогда в index:terminate() можно будет пихать всякие очищалки wf:state(some_state, []) и не захломлять main/0

еще, как вариант, использовать хедер как тут wf:header(<<"connection">>, <<"close">>), но это хреновый вариант, т.к. теряем во многом.
вообще можно написать Люку и спросить, почему он не разделил процессы на connection-а и пользовательские (может быть в целях экономии количества общих создаваемых процессов), а если разделил, то почему пользовательские не умирают, ведь в этом мало смысла, т.к. на живучесть данных в этом процессе пологаться нельзя...
как-то так...

Andy
@m-2k
Mar 14 2016 11:57
Думаю это один и тот же процесс
Надо просто n2o переписать чтобы он в стейт рандомно не срал
Но тут конечно палка о двух концах
А низя в terminate разве erase() пихнуть?
Roman
@AstRonin
Mar 14 2016 12:04
ну можно наверное, этож частный случай, смысл в том, чтоб подчищать за собой, что используешь... может какой другой проц вызываешь и надо его закрывать потом... сам он не закроется...
или ты про фреймворковский n2o_cowboy:terminate? не, тут надо довести до конца (module):terminate(), фиг его знает, что там программер будет использовать, какие еще ресурсы
Just-Eugene
@Just-Eugene
Mar 14 2016 12:22
Подскажите, пож-та, KVS годится для хранения наименований товара (строк будет порядка 12 000, других их характеристик (производитель, владелец лицензии), вид упаковки, и т.п. В принципе это для джойнов SQL... Но прайсы будут динамично меняться, будут прикрепляться сертификаты качества, схема будет развиваться. На сколько это верный путь? Выбор еще из-за erlang. Я начал изучение разработки с него (кидайте помидоры и яйца), да и джаббер уже на предприятии я развернул именно ejabber. Будет интеграция системы товара с пуш-оповещениями.
П.С. Имею опыт администрирования. В программировании начинаю, желание сильное. Спасибо.
Andy
@m-2k
Mar 14 2016 12:30
Тебе к doxtop )
Just-Eugene
@Just-Eugene
Mar 14 2016 12:35
m-2k, чес говоря, не врубился. Естественно, загуглил предварительно )
Доктор? )
Andy
@m-2k
Mar 14 2016 12:36
Так в чем вопрос
Юзай kvs+mnesia backend
Just-Eugene
@Just-Eugene
Mar 14 2016 12:37
Вопрос в том, будет ли быстро отвечать такая база при,допустим, правильных запросах?
Andy
@m-2k
Mar 14 2016 12:37
Юзай либо мнезийные индексы либо сохраняй свои связи между таблиц в отдельные цепочки
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 12:37
Я postgresql собираюсь использовать для перзистентных данных (базовые статы скилов и предметов) и голую mnesia для временных (использованные за время жизни сервера скилы, сохраненные состояния персонажей и т.п.). В kvs я пока не умею
Andy
@m-2k
Mar 14 2016 12:37
Чтобы индексы мнезия не генерила каждый раз при старте
Just-Eugene
@Just-Eugene
Mar 14 2016 12:38
сохраню ответы, в процессе обучения выучу, спасибо
Andy
@m-2k
Mar 14 2016 12:38
При правильном проектировании мнезия будет отвечать на порядок блядь быстрее чем ваш редис не говоря уже о Sql, вы шо там ебанулись?
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 12:39
sql я дергать буду только когда нужно
Just-Eugene
@Just-Eugene
Mar 14 2016 12:39
я, кстати, о SQL речь вел только в сравнении. Наоборот хотелось избрать модель ключ-значение, с графовым языком
Andy
@m-2k
Mar 14 2016 12:39
Мнезия это БД внутри виртуалки эрланга оперирующая нативными типами данных этой ВМ, куда еще быстрее
Кагами, kvs проще чем mnesia в сто раз
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 12:41
Просто вы его как-то изначально заточили под ленты соцсетей, как мне показалось. Это с толку сбивает
Andy
@m-2k
Mar 14 2016 12:42
Так и есть
Но это все что тебе нужно
Что может быть быстрее чем формировать данные во время сохранения а не во время выборки?
Just-Eugene
@Just-Eugene
Mar 14 2016 12:44
быстрее, только если на одной ноде? )
Andy
@m-2k
Mar 14 2016 12:44
Где связь
Just-Eugene
@Just-Eugene
Mar 14 2016 12:45
мы др друга не поняли
не имеет знач-я
Andy
@m-2k
Mar 14 2016 12:45
Да, тут чат без телепатов
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 12:46
Он имеет в виду, что будет, если запустят несколько нод на разных машинах
Andy
@m-2k
Mar 14 2016 12:46
Чтобы воспользоваться услугами телепатов вернитесь пожалуйста обратно в жаббер-мирок
Just-Eugene
@Just-Eugene
Mar 14 2016 12:46
о KVS что посоветуете прочитать? там бук на рсинк не готов, написано
Andy
@m-2k
Mar 14 2016 12:47
Ну ему для его cms сайтика с уведомлениями врятли нужно будет более одной ноды, а когда нужно будет тогда сам поймет
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 12:47
А больше нечего, вроде, читать
Andy
@m-2k
Mar 14 2016 12:47
У меня в тумблре есть заметка старая
Для понимания
Вопросы можно тут задавать. Но только после вдумчивого изучения
:-)
Just-Eugene
@Just-Eugene
Mar 14 2016 12:49
это не совсем сайтик, система задумывается распределенная, т.к. уже есть 1С не свзанные хранилища, кстати, библиотеки под эрланг для работы с файлми 1С есть? т.к. руководство не уходит с этой СУБД
Andy
@m-2k
Mar 14 2016 12:50
А не, там ток как свою базу сделать по философии ниче нет
Just-Eugene
@Just-Eugene
Mar 14 2016 12:50
стараюсь вдумываться, просто мой опыт и Ваш - разный и уровень тоже
Andy
@m-2k
Mar 14 2016 12:50
Надо бы конечно написать но времени нет
А, все так плохо?
Just-Eugene
@Just-Eugene
Mar 14 2016 12:51
Оч плохо. Это без преувеличения.
Резко поменять тут все пока никто не в силах
Just-Eugene
@Just-Eugene
Mar 14 2016 12:54
засейвил.спс
Andy
@m-2k
Mar 14 2016 13:03
:-)
Ты чего такой серьезный?
Знаю что 1С ломает мозг, береги себя
Just-Eugene
@Just-Eugene
Mar 14 2016 13:04
В смысле? )
не, 1 С не конструирую. Я читал, что и как. Возможно для перехода опять за Радченко прийдется сесть, но мне не нравится - 1С- сплошное ограничение. Коим эрланг-продукты совсем не кажутся )
Namdak Tonpa
@5HT
Mar 14 2016 13:34
читай документацию по mnesia
вся бухгалтерия — это сплошные join
QLC запросы читай
Just-Eugene
@Just-Eugene
Mar 14 2016 13:36
спасибо, друзья
важно понимать, куда двигаться. спс
Namdak Tonpa
@5HT
Mar 14 2016 13:37
KVS — это не для бухгалтерии
это для транзакций
мы аналитику можем делать и поверх KVS таблиц
но новичкам лучше выучить то с чем эрланг идет
Just-Eugene
@Just-Eugene
Mar 14 2016 13:38
embeded Mnesia?
Namdak Tonpa
@5HT
Mar 14 2016 13:38
да, так как KVS все равно поверх мнезии работает
Just-Eugene
@Just-Eugene
Mar 14 2016 13:39
а, т.е. KVS - метафора над реальной Mnesia?
Namdak Tonpa
@5HT
Mar 14 2016 13:39
да
Just-Eugene
@Just-Eugene
Mar 14 2016 13:39
блин, глаза раскрылись )
Namdak Tonpa
@5HT
Mar 14 2016 13:40
на мнезии можно легко повторить всю бухгалтерию 1C
Just-Eugene
@Just-Eugene
Mar 14 2016 13:40
кстати, Чезарини ок для обучения? мне как бы нормально вроде, хотя, кажется Дейтел (читал его о С++) яснее пишет.
Namdak Tonpa
@5HT
Mar 14 2016 13:41
откуда я знаю
я ни одной книги по эрлангу не прочитал
написал две
Just-Eugene
@Just-Eugene
Mar 14 2016 13:41
класс )
Ваши для новичков?
или уже узко тематичные?
Namdak Tonpa
@5HT
Mar 14 2016 13:41
скорее как настольные книги
даже три!
ну как книги, брошюры по нашим продуктам
Just-Eugene
@Just-Eugene
Mar 14 2016 13:43
Максим, спасибо за инфу
Andy
@m-2k
Mar 14 2016 13:43
Рекламная пауза
Namdak Tonpa
@5HT
Mar 14 2016 13:43
это все ссылки с сайта http://synrc.com
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 13:54
This message was deleted
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 14:17
Я правильно понял идею feeds.png ?
Namdak Tonpa
@5HT
Mar 14 2016 14:18
а почему у тебя feeds ведет только на голову одной цепочки
feeds — это proplists с мгогими головами
feeds — это то что потенциально может сделать KVS графовой базой
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 14:20
А, feeds=[] же, точно. А в целом правильно я понял?
Namdak Tonpa
@5HT
Mar 14 2016 14:20
да в feeds линкуются цепочки если нада
но семантика на это KVS не налагется
это ты сам в своем приложении решаешь как это будет использоваться
Semyon Novikov
@semka
Mar 14 2016 14:22
@Just-Eugene Чезарини ок, только русский перевод плохой совсем. Очень ходульно. Вдобавок куча опечаток.
Namdak Tonpa
@5HT
Mar 14 2016 14:22
например так
Andy
@m-2k
Mar 14 2016 14:38
semka вместо того чтобы подбодрить человека и увеличить его заинтересованность, дабы ему легче было проникнуться темой; ты сеяшь сомнение и неуверенность в его выборе. Нинада так
Just-Eugene
@Just-Eugene
Mar 14 2016 14:48
semka, там и в коде в листинге ошибки есть, но как-то привыкаешь критично читать.
m-2k, все ок )
а рус.язык пришлось выбрать. Честно говоря, хочется на легке прочитать, немного устал от чтения чисто англ манов к моему дистрибутиву, различая контекст одного и того же слова (англ) в разных применениях. Чисто для релакса в действии.
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 15:06
Я, может, уже спрашивал. Зачем нужно поле container в итераторе?
Namdak Tonpa
@5HT
Mar 14 2016 15:06
чтобы знать в какой таблице хранится ссылка на голову
по умолчанию это таблица feed
kvs:all(feed) покажет тебе все головы всех цепочек
точнее все контейнеры
которые содержат id голов в своем поле top
Andy
@m-2k
Mar 14 2016 15:08
А id_seq все счетчики
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 15:26
То есть, в моем случае, это может выглядеть так characters ?
Namdak Tonpa
@5HT
Mar 14 2016 15:29
может, но не должно
чебы просто в отдельном фиде не держать скилы
ты не должен использовать feeds пока не поймешь для чего KVS
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 15:30
Мне нужно как-то хранить информацию о том, у какого персонажа какие скилы
Namdak Tonpa
@5HT
Mar 14 2016 15:30
мы не используем feeds
можно но нахуя
че бы их просто как список полем не хранить []
это что информацию нужная тебе для индексирования ?
или это информация которая нуждается в транзакционности
KVS — это цепочки транзакций
не надо использовать сразу все фичи KVS
используй только одну
kvs:add
больше ничего не используй
мы на kvs:add написали карточную игру с турнирами
не думаю что твои комиксы сложнее
кроме kvs:fold и kvs:add ничего больше не надо
ну еще kvs:get чтобы головы выбирать
все
про все остальное забудь
Ryuuji Kagami
@kagami-ryuuji
Mar 14 2016 15:33
Комиксы я пока не делаю. Решил скилл программирования повысить сначала. Рисование в данный момент просто хобби
Namdak Tonpa
@5HT
Mar 14 2016 15:33
больше тебе нихуя не нада
у меня есть в документации что-то про feeds
НЕТ
вот и не надо спрашивать про это
спрашивайте только про то на что есть документация
-export([start/0,stop/0]).                                        % service
-export([destroy/0,join/0,join/1,init/2]).                        % schema change
-export([modules/0,containers/0,tables/0,table/1,version/0]).     % meta info
-export([create/1,add/1,link/1,remove/2]).                        % chain ops
-export([put/1,delete/2,next_id/2]).                              % raw ops
-export([get/2,get/3,index/3]).                                   % read ops
-export([load_db/1,save_db/1]).                                   % import/export


% service

-spec start() -> ok | {error,any()}.
-spec stop() -> stopped.

% schema change

-spec destroy() -> ok.
-spec join() -> ok | {error,any()}.
-spec join(Node :: string()) -> [{atom(),any()}].
-spec init(Backend :: atom(), Module :: atom()) -> list(#table{}).

% meta info

-spec modules() -> list(atom()).
-spec containers() -> list({atom(),list(atom())}).
-spec tables() -> list(#table{}).
-spec table(Tab :: atom()) -> #table{}.
-spec version() -> {version,string()}.

% chain ops

-spec create(Container :: atom()) -> integer().
-spec add(Record :: tuple()) -> {ok,tuple()} | {error,exist} | {error,no_container}.
-spec remove(Tab :: atom(), Key :: any()) -> ok | {error,any()}.

% raw ops

-spec put(Record :: tuple()) -> ok | {error,any()}.
-spec delete(Tab :: atom(), Key :: any()) -> ok | {error,any()}.

% read ops

-spec get(Tab :: atom(), Key :: any()) -> {ok,any()} | {error,duplicated} | {error,not_found}.
-spec get(Tab :: atom(), Key :: any(), Value :: any()) -> {ok,any()}.
-spec index(Tab :: atom(), Key :: any(), Value :: any()) -> list(tuple()).

% import/export

-spec load_db(Path :: string()) -> list(ok | {error,any()}).
-spec save_db(Path :: string()) -> ok | {error,any()}.
больше нихуя вам не надо
Andy
@m-2k
Mar 14 2016 21:07
нет мне