@proelixir

Страница 899 из 1045
Максим
06.03.2018
08:58:03
для того, чтобы ловить события не попадающие в текущую стадию

делаю вызов TaskFsm.sendInfo(id, [task: "reset", msg: nil])

но в handle_event процесс не попадает

а пытается найти соответсвующую вызову finish

Google
Максим
06.03.2018
08:59:19
которой нет

и падает

Alex
06.03.2018
09:01:42
потому что у тебя должен быть определен catch-all finish/3, который вызывает handle_event

Максим
06.03.2018
09:02:03
о_О

Alex
06.03.2018
09:02:10
http://erlang.org/doc/design_principles/statem.html#id73802

Максим
06.03.2018
09:02:35
а если у меня там 10 шагов? мне 10 таких определять?

Alex
06.03.2018
09:02:54
ну, да

Dmitry
06.03.2018
09:02:56
Со state_functions - так, поэтому handle_event_function появился.

Alex
06.03.2018
09:03:00
можешь макрос запилить

Максим
06.03.2018
09:03:44
шляпа...



Alex
06.03.2018
09:04:45
типа, catch_all_states [:finish, :start, :pause], который генерит тебе форварды в handle_event/3

хотя проще, конечно, их руками написать

Google
Alex
06.03.2018
09:05:41
и если у тебя fsm на 10 стейтов, я тебе искренне сочувствую

Dmitry
06.03.2018
09:05:51
Такую фичу лучше сразу на уровне контрибьюта в библиотеку делать.

Максим
06.03.2018
09:06:50
с макросами у меня не очень, но придётся видать освоить, так как переписывать все на handle_event долго и как-то не очень

Dmitry
06.03.2018
09:07:13
Хотя event_function удобнее уже тем, что можно на разные состояния мэтчить, если одно и тоже действие для нескольких стейтов нужно сделать.

Максим
06.03.2018
09:07:53
угу, следующие на нём запилю, останется что-то придумать с текущими...

Dmitry
06.03.2018
09:21:45
Я домой вернусь, попробую кое-что.

Сделать с макросами.

Alexander
06.03.2018
12:08:29
Ребят, вопрос: Кто-нибудь прикручивал в Elixir справочник адресов ФИАС или КЛАДР? есть готовое решение?

Alex
06.03.2018
12:10:25
@midster хотелось бы уточнить, что вставить в else: def check_exchanges_connections() do current_time = :os.system_time(:milli_seconds) :ets.tab2list(:trade_timestamps) |> Enum.each(fn trade_timestamp -> {stream_name, last_data_timestamp} = trade_timestamp if current_time - last_data_timestamp > 60_000 do Nadia.send_message(Application.get_env(:nadia, :chat_id), "Stream #{stream_name} - last data recieved #{current_time - last_data_timestamp} ms ago") end end) {:ok} end
def check_exchanges_connections() do current_timestamp = :os.system_time(:milli_seconds) :ets.tab2list(:trade_timestamps) |> Enum.each(fn {stream_name, last_timestamp} -> case (current_timestamp - last_timestamp) do diff when diff > 60_000 -> Nadia.send_message(Application.get_env(:nadia, :chat_id), "Stream #{stream_name} - last data recieved #{diff} ms ago") _ -> {:error, {:too_early, stream_name}} end end) {:ok} end

Alex
06.03.2018
12:25:05
да и вообще это не важно

сохраняются они или нет

и {:ok} тоже надо убрать

Evgeny
06.03.2018
12:33:59
Что за бред? Supervisor.start_link( [ worker(Cachex, [ :my_cache, [] ]) ] ) Насколько я понимаю, это устаревший вариант запуска дочернего воркера. А как по-современному это переписать?

Dmitry
06.03.2018
12:34:47
{Cachex, [ :my_cache, []]} - это если Cachex имплементирует child_spec-callback.

В мастере не поддерживает, так что пока не получится.

Evgeny
06.03.2018
12:36:46
{Cachex, [ :my_cache, []]} - это если Cachex имплементирует child_spec-callback.
нихрена он не имплементирует, в итоге юзается некий дефолтный и в start_link так прямо и пихается [ :my_cache, []]. а start_link ожидает два аргумента: имя кеша и список опций.

и как эту жопу обойти?

вручную, короче сделать чайлд спек и пихнуть супервизору

Google
Evgeny
06.03.2018
12:37:56
идиотизм

Артем
06.03.2018
12:38:18
да и вообще это не важно
Как не важно, важно. В данном случае обработка отлично от интересующего результата высосана из пальца

То есть ты дописал код в котором нет ценности

Он не делает ничего полезного

Наоборот он заставляет думать что что-то в случае элс произойдет

А это не так

То есть помимо своей бесполезности он еще и вводит в заблуждение

Alex
06.03.2018
12:40:50
То есть помимо своей бесполезности он еще и вводит в заблуждение
да какие вопросы не пиши так и все! никто же не заставляет ?

че пристали с этим else

Alex
06.03.2018
13:00:06
идиотизм
Вы слишком много кушали!

Evgeny
06.03.2018
13:04:02
типа культурное "зажрались"?

ну на самом деле устарело это хз когда, но никто так и не удосужился сделать нормальный child_spec

я бы сам сделал, но недостаточно компетентен

Dmitry
06.03.2018
13:36:32
ГенСерверу при инициализации можно задать значение, которое будет константным между вызовами?

Andrey
06.03.2018
13:41:51
можно пример, а то не очень понятен вопрос в принципе?

Yuri
06.03.2018
13:44:35
ребят подскажите нормальный HTTP client, чет httpoison со своим hackney прям боль

Sergey
06.03.2018
14:03:35
ГенСерверу при инициализации можно задать значение, которое будет константным между вызовами?
в супервизор же в чилдспеке принимает MFA, почему бы там не передать константу, а потом положить её в стейт?

Dmitry
06.03.2018
14:04:31
во, стейт кажется то что нужно

Google
Dmitry
06.03.2018
14:04:46
только я понимаю как он задается при старте, а как его потом доставать?

Sergey
06.03.2018
14:05:35
только я понимаю как он задается при старте, а как его потом доставать?
прочитай про genserver в принципе, там всё довольно просто

Andrey
06.03.2018
14:05:49
https://hexdocs.pm/elixir/GenServer.html#module-example

принципиально доку не читаем, да? вроде этот пример же про то что надо

при старте инициализируем, в хендлере вынимаем

Dmitry
06.03.2018
14:11:48
спасибо

Yuri
06.03.2018
14:25:08
а чем плох то?
отказываеться работать собака )

отказываеться работать собака )
может сталкивался 14:22:31.973 [error] Task #PID<6862.2283.0> started from #PID<6862.2282.0> terminating ** (FunctionClauseError) no function clause matching in :hackney_url.transport_scheme/1 /var/www/app/edeliver_builds/deps/hackney/src/hackney_url.erl:109: :hackney_url.transport_scheme(:hackney_http_connect) /var/www/app/edeliver_builds/deps/hackney/src/hackney.erl:859: :hackney.absolute_url/2 /var/www/app/edeliver_builds/deps/hackney/src/hackney.erl:712: :hackney.maybe_redirect/2 /var/www/app/edeliver_builds/deps/hackney/src/hackney.erl:362: :hackney.send_request/2 lib/httpoison/base.ex:439: HTTPoison.Base.request/9 lib/movie_web/release_tasks.ex:703: MovieWeb.ReleaseTasks.request/2 lib/movie_web/release_tasks.ex:142: anonymous fn/2 in MovieWeb.ReleaseTasks.import_movies/0 lib/ecto/adapters/sql.ex:576: anonymous fn/3 in Ecto.Adapters.SQL.do_transaction/3

Sergey
06.03.2018
14:32:26
отказываеться работать собака )
а как испульзуешь то его?

Yuri
06.03.2018
14:33:22
а как испульзуешь то его?
дергаю html страницу через прокси

Sergey
06.03.2018
14:35:20
дергаю html страницу через прокси
не сочти меня грубым, но ты код пишешь то?

гист скинь

чтобы было понятно, как ты его используешь

я использовал hackney и он работал

Yuri
06.03.2018
14:37:37
я использовал hackney и он работал
да походу вот моя трабла https://github.com/benoitc/hackney/issues/376

Marsel
06.03.2018
14:40:34
я у себя follow_redirect: false ставил, и руками смотрел есть ли редирект в ответе

Yuri
06.03.2018
14:42:38
урлов просто много) руками смотреть каждый не вариант

Marsel
06.03.2018
14:44:01
а как-то поймать можно если ест ьредирект?
case HTTPoison.request(:get, String.to_charlist(url), "", header, options) do {:ok, %HTTPoison.Response{headers: resp_header, status_code: status_code}} when status_code > 300 and status_code < 400 -> тут вытаскивает из хидеров location и идем по нему

как то так у меня

Google
Yuri
06.03.2018
14:45:56
как то так у меня
у меня значит чет не то case HTTPoison.get(url, ["User-Agent": Enum.random(@user_agents)], [proxy: proxy, follow_redirect: true, ssl: [{:versions, [:'tlsv1.2']}] ])

Marsel
06.03.2018
14:46:27
follow_redirect: true же у тебя

Yuri
06.03.2018
14:47:05
попробую переписать, чтобы ловить редиректы, как в твоем примере

спасибо

Azat
06.03.2018
15:21:37
Я раньше тоже httpoison использовал, потом понял что юнит-тестить его сложновато и перешёл на tesla

Azat
06.03.2018
15:36:42
есть какбы отдельные клиент и сервер, общающиеся по джсон-апи, нужно было юнит-тестить клиент, я сделал сервер-заглушку на плаге, но такое решение было забраковано тим-лидом, потому что слушает tcp-порт, а на тесле получилось просто и без головной боли

Dmitry
06.03.2018
15:39:30
В любом случае ты что-то мокаешь

В httpoison есть exvcr

Которым все пользуются и не имеют проблем

Самое крутое, что можно раз в неделю подкинуть реальный ключ и обновить кассеты

Даже если api связано с бабками

Страница 899 из 1045