
Can
10.11.2016
11:47:17
Это же как объект со стейтом
Допустим я хочу сделать тазовый генсервер а потом его расширять
Как вот такую кодобазу тянуть за собой?

Eugene
10.11.2016
11:47:54
use use use

Google

Eugene
10.11.2016
11:47:59
делаешь что-то базовое
в нем описываешь макрос __using__
__using__ = когда меня юзают, выполнить в контексте модуля который меня юзает вот что: _внутренность_макроса_

Andrey
10.11.2016
11:49:16
Он не про то же

Can
10.11.2016
11:49:29
Про то

Eugene
10.11.2016
11:50:24
по сути когда ты пишешь use GenServer, ты «наследуешься» (если так угодно…) от модуля GenServer из эликсира

Dmitry
10.11.2016
11:50:39
Надо запихивать в __using__

Eugene
10.11.2016
11:50:55
только я бы называл это своими словами, т.е. «композиция»
цепочку таких композиций (один модуль use другой) – можно навкладывать друг в друга бесконечно
и получится свое homegrown наследование)

Can
10.11.2016
11:52:30
Просто в целом такая вещь, есть зависимость, в которой на каждого пользователя создаётся генсервер и хочется что то построить на этом всем доп функционал
И не хочется ещё по генсерверу своему добавлять
И не хочется в дебри библиотеки лезть чтобы новые обработчики вкрутить

Google

Alex
10.11.2016
12:43:37
нубский вопрос
Создал модуль(MyApp.Plug.MyPlug), потом когда в контроллере добавляю plug MyApp.Plug.MyPlug - получаю module MyApp.Plug.MyPlug is not available
что я делаю не так?

Dmitry
10.11.2016
12:44:21
Например создал модуль exs...
Или забыл после defmodule написать do

Alex
10.11.2016
12:45:20
в роутере, не в котроллере
ошибок синтаксиса нет

Dmitry ?
10.11.2016
15:02:39
Попробуй MyApp опустить

Alex
10.11.2016
17:12:49
не помогло

Dmitry
10.11.2016
17:13:19
У тебя где то синтаксическая ошибка стопудово

Alex
10.11.2016
17:14:07
нужно ли в роутере делать импорт модуля с плагом?

Dmitry ?
10.11.2016
17:14:19
Покажи код в роутере
И объявление модуля

Dmitry
10.11.2016
17:15:39
У меня такое было когда я сделал файл с расширением exs
И ещё - когда букву перепутал

Alex
10.11.2016
17:16:08
http://pastie.org/private/kqjek5jbewwqjipte9ftzg
файл - *.ex

Dmitry
10.11.2016
17:17:31
import точно не нужен

Dmitry ?
10.11.2016
17:17:33
Всё ок выглядит

Alex
10.11.2016
17:18:02
а есть разница где положить файл?

Dmitry ?
10.11.2016
17:18:12
А где положил?)

Google

Alex
10.11.2016
17:18:18
у меня лежит в lib/blog/authentication.ex

Dmitry ?
10.11.2016
17:18:35
Норм по идее. Другие же модули подхватываются?

Dmitry
10.11.2016
17:18:42

Alex
10.11.2016
17:18:47
там endpoint.ex, repo.ex

Dmitry ?
10.11.2016
17:19:00
Как запускаешь?
iex -S mix phoenix.server

Alex
10.11.2016
17:19:51
mix phoenix.server

Dmitry ?
10.11.2016
17:20:56
Ну не знаю, попробуй
rm -rf _build
rm -rf deps
mix deps.get
mix deps.compile
mix compile
mix phoenix.server
Еще, покажи mix.exs
Есть ли там defp elixirc_paths(_), do: ["lib", "web"]

Alex
10.11.2016
17:22:50
>mix compile
упало с той же ошибкой
>Есть ли там defp elixirc_paths(_), do: ["lib", "web"]
есть

Alex
10.11.2016
17:36:39
кстати если убрать из роутера упоминание этого модуля, и потом сделать iex -S
и там дернуть функции модуля - то все норм, и модуль видно и функции работают
глючит Phoenix.Controller.redirect()
если убрать его - то все работает как нужно
>use Blog.Web, :controller
это вызвало проблему

Dmitry ?
10.11.2016
18:43:29
?

Taras ?
11.11.2016
05:43:57
всем привет!
у меня вопрос насчет эрланга -
https://github.com/yzh44yzh/practical_erlang/blob/master/05_kv/solution/short_link.erl
функция init() сдесь —-
init() ->
%% init randomizer
<<A:32, B:32, C:32>> = crypto:rand_bytes(12),
random:seed({A,B,C}),
{#{}, #{}}.
зачем там эти строчки с рандом байтами?
почему просто не вернуть
init() ->
{#{}, #{}}.
? что я не понимаю с этого примера?

Vladimir
11.11.2016
06:02:28

Google

Taras ?
11.11.2016
06:05:43
но ведь там возвращается только {#{}, #{}} ?
ведь будет работать и без этих рандом байтов?

Aldar
11.11.2016
06:06:25
там же запятая вроде

Taras ?
11.11.2016
06:07:54
и что?
90> S1 = short_link:init().
{#{},#{}}

Aldar
11.11.2016
06:08:26
на предпоследней строчке

Vladimir
11.11.2016
06:09:10
дело не в том, что возвращает, а в том что подаётся в random:seed.
http://erlang.org/doc/man/random.html#seed-0

Taras ?
11.11.2016
06:09:47
а это уже читал, не понял - поэтому решил тут спросить

Admin
ERROR: S client not available

Vladimir
11.11.2016
06:10:26
генератор потому и называется псевдослучайным генератором, потмоу как там не по-настоящему случайны числа, а просто длинная последовательность их.
seed делает "посев", чтобы начать последовательность с другого числа, грубо говоря
The following is an easy way of obtaining a unique value to seed with:
random:seed(erlang:phash2([node()]),
erlang:monotonic_time(),
erlang:unique_integer())
Тут чуваки совсем заморочились, но принцип тот же

Taras ?
11.11.2016
06:18:41
тоесть, грубо говоря, crypto в init есть для прогрева стандартного рандома, чтобы в следующий вызов - значение рандома было менее прогнозированным, и все?

[Anonymous]
11.11.2016
06:24:43
привет! мы ищем спикеров на http://elixir-lang.moscow, желающие - пишите мне в личку.

Aldar
11.11.2016
06:36:11
Обычно сид делают зависящим от времени

ⰿⰰⰾⱏ
11.11.2016
06:56:16

Eugene
11.11.2016
12:12:58
@OSamorai ?

Oleh
11.11.2016
12:14:50
@pirogov ??

Roman
11.11.2016
13:26:13
@pirogov @OSamorai ?

Dmitry ?
11.11.2016
13:51:45
А как в ecto нормально писать where уловия, если подставляемое значение может быть nil?
val = (может быть nil)
where: p.col != ^val

Google

Dmitry ?
11.11.2016
13:52:44
В рантайме это упадет с
comparison with nil is forbidden as it is unsafe. If you want to check if a value is nil, use is_nil/1 instead
Приходится писать в expressions стиле и городить такое
query = if val == nil do
where(query, [p], not(is_nil(p.col)))
else
where(query, [p], p.col != ^val)
end

Oleh
11.11.2016
13:55:31
Почему бы не привести val к нужному формату?
Через
def get_val(val) is_nil(val), do: ""
def get_val(val), do: val

Dmitry ?
11.11.2016
13:55:52
Но в базе то null
Я не могу просто так заменить на пустую строку, тогда находиться не будет

Nikita
11.11.2016
13:58:20
не знаю как прям правильно, но я вот так делаю например
device_type = params["device_type"]
query = from u in User, offset: ^offset, limit: ^limit
query = case device_type do
nil -> query
_ -> from q in query, where: q.device_type == ^device_type
end

Dmitry ?
11.11.2016
13:58:47
Ну вот хрень какая-то
Какая вообще причина comparison with nil is forbidden as it is unsafe?

Oleh
11.11.2016
13:59:54
Ну по полю с NULL в базе даже индекс хороший не построишь

Nikita
11.11.2016
14:00:25
в SQL же вроде нельзя делать сравнение с NULL
можно только IS NOT NULL например

Dmitry ?
11.11.2016
14:00:43
Хм, а точно

Nikita
11.11.2016
14:00:48
поэтому и ругается

Dmitry ?
11.11.2016
14:02:17
Спасибо, теперь я понял

Aldar
11.11.2016
18:02:52
NULL != NULL вроде

Alex
11.11.2016
20:50:10
Не понять как заставить brunch генерить digest для ассетов внутри цсс файлов. Судя по всему phoenix.digest делает это, но в итоге у меня остаются пути без md5 внонце

Aldar
11.11.2016
21:07:41
https://www.youtube.com/playlist?list=PLR812eVbehlwEArT3Bv3UfcM9wR3AEZb5
Немного ФП на эрланге в хату
https://www.cs.kent.ac.uk/ErlangMasterClasses/#class1