
Eugene
30.08.2016
10:46:53
HBRegistry.add(%Sched{..}, &WhateverWorkerName.start_link/1, { :twitter, 34543 })
HBRegistry.add(%Sched{..}, some_task_lambda, { :facebook, “vasya_poupkine” })

Dmitry
30.08.2016
10:48:31
Так можно, но
HBRegistry.add(%Sched{..}, &TwitterSupervisor.start_child/1, {:twitter, 34543}) самую малость избыточно выглядит))
А вот такое
HBRegistry.add(%Sched{..}, &TwitterSupervisor.start_child/1, {:facebook, 34543}) вообще смешно)

Google

Eugene
30.08.2016
10:52:11
значит HBRegistry.add(%Sched{..}, &TwitterSupervisor.start_child/1, 34543)

Dmitry
30.08.2016
10:52:38
Да, всё норм

Eugene
30.08.2016
10:52:38
и спрашивать имя у модуля который будет работу делать

Dmitry
30.08.2016
10:52:39
Лямбда может быть ключом)))

Eugene
30.08.2016
10:52:46
а

Dmitry
30.08.2016
10:52:54
Неожиданно

Eugene
30.08.2016
10:52:56
все может быть ключем) любой терм

Dmitry
30.08.2016
10:52:56
Только что проверил, вот сука
iex(1)> lambda = &(&1+&2)
&:erlang.+/2
iex(2)> s = %{lambda => 3}
%{&:erlang.+/2 => 3}
iex(3)> s[&(&1+&2)]
3
не знаю как ты хочешь реализовать “раз в N минут”, но думаю придется хранить еще время “последнего раза”. псевдокод:
%{
{ TwitterReader, 34543 } => { pid1, “раз в 10 минут”, “2014-05-08 23:34:13” },
{ TwitterReader, 34545 } => { pid2, “раз в 20 минут”, “2014-05-08 22:15:14” },
{ FacebookReader, "vasya_pupkin" } => { pid3, “раз в час”, “2014-05-08 19:41:18” }
}
Раз в n минут через Process.send_after
А вот как расписание задавать - это надо подумать
У меня конкретно расписание недельное, но вдруг поменяется что, если либу делать то надо предусмотреть
походу интервалами с началом и концом в стиле крона - лучший варик

Google

Dmitry
30.08.2016
11:25:28
["* 8-16 * 1-5 *"] Рабочее время

Aldar
30.08.2016
12:40:22

Dmitry
30.08.2016
12:42:03
Вот к примеру каждые 7 минут с 18:00 до 20:00. В кроне так нельзя, потому что после 56 минуты сработает на 00
{["* 18-19 * * *"], 7*1000*60}
А вот к примеру с 18:10 до 22:30
{["10-59 18 * * *", "* 19-21 * * *", "0-30 22 * * *"], 7*1000*60}
Помоему норм тема

Aldar
30.08.2016
13:11:36
Время вообще штука довольно сложная)

Dmitry
30.08.2016
13:18:22
def range(start, end, divisor) do
Stream.iterate(start, &(rem(&1+1, divisor))) |> Enum.take(rem(end-start+1+divisor,divisor))
end
range(3,6,24) #[3,4,5,6]
range(22, 6, 24) #[22,23,0,1,2,3,4,5,6)
Есть идеи как улучшить функцию?

Константин
30.08.2016
13:56:08
сделать не start - end
а start - и + сколько часов
тогда получится просто Stream.to_list
или как его там
Хотя не так читабельно

Dmitry
30.08.2016
13:57:58
Да не, норм
Просто же я crontab пилю
и надо чтобы 22-5 нормально обрабатывалось

Константин
30.08.2016
13:58:56
тогда норм
def range(start, end, _div) when start < end, do: start..end

Dmitry
30.08.2016
14:04:33
Это типа ускорит пару кейсов?
Тогда вторую часть можно будет упростить)
Реально выкинуть rem
def range(lh, rh, _div) when lh < rh, do: lh..rh
def range(lh, rh, div) do
Stream.iterate(lh, &(rem(&1+1, div))) |> Enum.take(rh-lh+1+div)
end
Вот так работает спс

Google

Dmitry ?
30.08.2016
14:41:54
А это, докером можно катить Erlang/Elixir? Подводные камни, аргументы против?

Vladimir
30.08.2016
14:42:21
Один аргумент уже пробегал на днях. Звучит он так: "... но зачем?" :)
Erlang VM по сути уже виртуалка
нода
на одной ос можно запускать множество нод

Dmitry ?
30.08.2016
14:45:00
Часть инфрастуктуры в докере, хочется уметь управлять удобно всем этим хозяйством (смотрим на kubernetes)

Vladimir
30.08.2016
14:45:53
Но наверное есть варианты, когда это может иметь смысл. У меня скрипт развёртывает множество LXC-контейнеров, где куда деплоятся микросервисы на Erlang и Clojure. Потом автоматически правятся конфиги, и всё это сразу готово к работе. Но я задумывал такую автоматизацию чисто для разработки, чтобы всё развёртывать на девелоперской машине.
У докера много всего готового, но я предпочитаю что-то более низкоуровневое, чтобы можно было настроить всё, как мне нужно. LXC - отличный вариант в моём случае.

abc
30.08.2016
15:23:40
а почему вы пишете код и никак его вот так def demo(x) end не выделяете ? удобнее же читать. нет ?

Aldar
30.08.2016
15:24:01

Dmitry
30.08.2016
16:18:20
Я хз как это делать

Taras ?
30.08.2016
16:18:49
```

Dmitry
30.08.2016
16:19:05
С мобилы не удобно)

Taras ?
30.08.2016
16:19:30
77
тогда так можно еще)

Dmitry ?
30.08.2016
16:22:10
А на мобильниках вроде и не работает

Dmitry
30.08.2016
16:22:30
'Def'
Или это не то

Dmitry ?
30.08.2016
16:22:44
Не, не то

Dmitry
30.08.2016
16:22:46
Я чёт не могу найти)

Google

Dmitry
30.08.2016
16:23:03
На айфоне нету короче

Dmitry ?
30.08.2016
16:23:08
`def`
Есть там, вот, но не форматирует)
Зажми на кавычке

Taras ?
30.08.2016
16:23:50
три подряд?

Dmitry
30.08.2016
16:24:05
`def`

Dmitry ?
30.08.2016
16:24:05
Ну так и с одной должно работать

Dmitry
30.08.2016
16:24:10
Точно есть)

Admin
ERROR: S client not available

Dmitry ?
30.08.2016
16:24:31
```
Hello
```

Dmitry
30.08.2016
16:24:41
```elixir
Def
```
Херня кароч

Taras ?
30.08.2016
16:24:51
магия))

Andrey ?
30.08.2016
16:31:58
ruby
puts "test"
Не умеет в гитхабовский маркдовн :C

Can
30.08.2016
16:33:36
```хей```

Dmitry
30.08.2016
16:33:52
Я кстати на хабре тоже писал руби для эликсир кодах

abc
30.08.2016
17:24:34
чтиво на вечер https://habrahabr.ru/company/mailru/blog/308788/
очередной срач как лучше писать на ПХП :)
оказывается фреймворки это зло

Google

Dmitry
30.08.2016
17:52:00
Внезапно всё оказалось ещё ппроще
def range(lh, rh, _div) when lh < rh, do: lh..rh
def range(lh, rh, div) do
Enum.concat(lh..div-1, 0..rh)
end
Ппц... Парсинг крона на 50 строк.... Вот тебе и функциональное программирование))

Taras ?
30.08.2016
18:06:27
чтиво на вечер https://habrahabr.ru/company/mailru/blog/308788/
Проблема ОО-языков в том, что они тащат за собой всё своё неявное окружение. Вы хотели банан, но при этом получили гориллу, которая держит банан, и все джунгли в придачу.
Джо Армстронг. Coders at work. Reflections on the Craft of Programming
да, да, дааа !!! )))

Dmitry
30.08.2016
18:07:16
Ребят вопрос.
Есть [x: 1, y: 1]
Как это преобразовать в %Point{x:1, y:1}?
|>Enum.into(%Point{}) сработает?

[Anonymous]
30.08.2016
18:15:53
нужно http://elixir-lang.org/docs/stable/elixir/Collectable.html определить
для %Point{}

Dmitry
30.08.2016
18:16:06
да, уже понял
Ебалово честно говоря)
Короче вот такое работает
list|> Enum.reduce(%Point{}, fn ({key, value}, acc) -> acc |> Map.put(key, value) end)
и трахаться с протоколом в падлу

Dmitry ?
30.08.2016
18:38:57
Я что-то не понял как это работает
В %Point{} поля x и y?

Dmitry
30.08.2016
18:39:19
да

Dmitry ?
30.08.2016
18:39:34
А list это просто [x: 1, y: 1]?

Dmitry
30.08.2016
18:39:41
точно

Dmitry ?
30.08.2016
18:40:15
Почему не написать просто %Point{x: list[:x], y: list[:y]}?

Dmitry
30.08.2016
18:41:18
У меня полей много во первых, во вторых такой код работает для любой структуры, а в третих по идее если что-то добавить или убрать из листа - не развалится
хотя может и так не развалится...)

Dmitry ?
30.08.2016
18:42:11
Так вот полей много, а говоришь x и y :)
Ну понятно