
Buckler
22.09.2018
14:29:37
Привет, Dasie!
Пожалуйста, реши капчу:
Вычисли: 28+38=...
Осталось попыток: 3
Если не решишь - забаню навеки...
Удачи!
Привет, 0nLy!
Пожалуйста, реши капчу:
Вычисли: 26+58=...
Осталось попыток: 3
Если не решишь - забаню навеки...
Удачи!


Yaroslav
23.09.2018
19:35:57
всем привет
В нашу команду требуется Elixir-разработчик.
О проекте:
Проект по омниканальности контакт-центров: создание единого канала коммуникации между бизнесом и клиентами. Предполагается разработка высоконагруженной системы, способной обрабатывать одновременно несколько каналов коммуникаций между участниками: чат, голос, видео, соц. сети, email и т.п.
Основным языком на backend был выбран Elixir и платформа Erlang/OTP.
В качестве основной БД используется PostgreSQL. Также ещё задействуются RabbitMQ, GlusterFS.
О компании:
CTI - Communication Technology Innovations - лидер системной интеграции и производства программного обеспечения, специализирующийся в области IP-коммуникаций.
Компания CTI работает на российском рынке с 2002 года и оказывает весь спектр услуг, связанных с созданием, управлением, развитием и поддержкой ИТ и телекоммуникационной инфраструктуры заказчика.
Более 500 заказчиков компании - крупнейшие операторы связи, банки, государственные структуры. В подразделении Сервиса - более 130 активных проектов.
Основные обязанности:
* Реализация собственного продукта компании по омниканальности контактных центров;
* Участие в аналитике и оценке трудозатрат по задачам;
* Участие в формирование требований к реализуемым решениям.
Требования:
* Опыт практической разработки на Elixir от 1 года;
* Твердое понимание основных принципов функционального программирования;
* Хорошее знание Elixir и Phoenix Framework;
* Знание принципов работы Open Telecom Platform;
* Опыт разработки через тестирование и написания различных типов тестов (в том числе и приемочных);
* Знание Git, и опыт работы с Gitlab;
* Хорошее знание и опыт работы под Unix-like OS.
Будет дополнительным плюсом:
* знание Erlang;
* знание GraphQL и библиотеки Absenthe;
* глубокое знание Ecto;
* понимание механизмов аутентификации через JWT;
* опыт работы с RabbitMQ.
* опыт развертывания и сопровождения приложений Elixir/Erlang в боевой эксплуатации.
Что мы готовы предложить:
* Официальное трудоустройство и оформление полностью согласно ТК РФ;
* Наличие высокопрофессионального штата специалистов;
* Систему обучения и тренингов;
* Режим работы с 10.00 до 19.00;
* ДМС после прохождения испытательного срока (с возможностью льготного страхования родных);
* Дружный молодой коллектив, зерновой кофе, чай.
Резюме присылайте на e.egorova@cti.ru или мне


Aldar
23.09.2018
19:57:38
Хммм, вилку бы

Google

Azat
23.09.2018
20:02:43
Ещё была бы не лишней информация о том где расположен офис и возможна ли удалёнка

Yaroslav
23.09.2018
21:41:54

Alexander
23.09.2018
22:45:24
Обсуждается
Все же принято писать вилку. Иначе это трата как вашего, так и времени соискателей. Плюс ко всему достаточно интересно знать порядок дел в такой старой конторе, как cti

Alexey
23.09.2018
22:55:58
вопрос, распараллелил простой алгоритм с помощью Task.async и Task.await, вне зависимости от количества потоков время практически не меняется, вопрос, я все правильно делаю или Task не параллельно выполняется, а просто асинхронно и конкурентно?
------
Erlang/OTP 21 [erts-10.0.5] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]
Elixir 1.7.2 (compiled with Erlang/OTP 21)
еще пишет async-threads:1, хотя судя по форумам говорят обращать внимание только на smp:12:12
------

Dmitry
23.09.2018
22:57:12
Чем отличается "параллельно" от "асинхронно и конкурентно"?

Alexey
23.09.2018
23:00:41
ну конкурентность и асинхронность на одном потоке может быть реализована, верно? а параллельность только на нескольких, надеюсь правильно выразился
я запускаю алгоритм в 10 потоков и надеюсь что время уменьшится ~10 раз
а оно вообще почти не меняется

Dmitry
23.09.2018
23:01:42
В эрланге чем отличается
Я понимаю еще где-то там в Akka где можно подергать конфиг scedulers
На одном ядре сколько потоков не запускай - параллельно все равно не получится

Alexey
23.09.2018
23:03:13
у меня 6 ядер и 12 потоков

Google

Dmitry
23.09.2018
23:03:30
Ну тык оно и считает на 6 ядрах
Я прост не очень понимаю, как можно сделоть "конкурентно" а как "параллельно"
Все что в отдельном потоке EVM будет параллельно пока ядра не закончатся

Alexey
23.09.2018
23:05:55

Dmitry
23.09.2018
23:06:03
Но если у тебя 6 ядер и 10 потоков - сорян как бы

Fey
24.09.2018
01:38:05
если воткнёшь в начало функции thread что-то вроде IO.inspect(self()), то окажется, что таски последовательно запускаются

Shumilkin
24.09.2018
01:42:08
Это да, но почему? ("объяснение" выше вызывает у меня лишь недоумение)

Fey
24.09.2018
01:42:27
def run(max, thread_count \\ 2) do
list = List.duplicate(false, max)
divs = 2..(:math.sqrt(max) |> trunc()) |> Enum.to_list()
chunk_size = (max / thread_count) |> trunc()
list
|> Stream.chunk_every(chunk_size)
|> Stream.with_index()
|> Task.async_stream(
fn {chunk_list, index} -> thread(chunk_list, divs, chunk_size * index) end,
max_concurrency: thread_count,
timeout: 100_000
)
|> Enum.to_list()
end
вот так запускаются параллельно. у меня с 5.6 секунд ускорилось до 1.8 с thread_count 8

Shumilkin
24.09.2018
01:45:04
Кул, спасиб

Fey
24.09.2018
01:45:42

Alexey
24.09.2018
05:15:23

Dmitry
24.09.2018
08:27:16
Крутая тема, я так и не доковылял - спать лёг
Надо статью написать про Stream
Мне кажется Stream.map можно поменять на Enum.map и все заработает
Надо проверить

Igor
24.09.2018
08:33:12
кто-нибудь разрабатывает под windows? Какие впечатления?

Dmitry
24.09.2018
08:36:34
Всмысле деплой на windows server? А такое бывает кому-то нужно?
Или вы решили делать гуй на эликсире?
Последний раз когда я пробовал - не собралась половина nif

Google

Dmitry
24.09.2018
08:39:32
Wings3d на сколько я знаю сделан на эрланге

Yura
24.09.2018
08:43:46
> Я прост не очень понимаю, как можно сделоть "конкурентно" а как "параллельно"
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRmxUhej0bU5MZUbBF4jMqOjHDJEQvWJd9My7YIlRHBdDgjhs0W

Dmitry
24.09.2018
08:44:09
Ну и сейчас после конференции все сцуцца с Scenic, так что я думаю ситуация с виндой будет улучшаться

Alexey
24.09.2018
08:57:44
кто-нибудь разрабатывает под windows? Какие впечатления?
я разрабатываю под виндовс. у меня на виндовс ИДЕ. а код внутри виртуалки под wmvare. для выполнения команд открыта консоль туда через putty. в IDE плагин для синхронизации данных. ну то есть, сохраняется и в винде код, и когда сохраняешь - улетает на линуксь в виртуалку. бывает удобно, когда в гите что-то наморозил. файлы откатил, а на винде коды еще остались. точно так же работал, когда был фронтендером. внутри виртуалки была нода, а на винде - вебсторм.


Shumilkin
24.09.2018
09:54:28
благодарю! не пытался там улучшить, так как был уверен из-за этого кода https://github.com/Anonyfox/parallel/blob/master/lib/parallel.ex
с 4.2 улучшилось до 1.1 на 12 потоков
понимаю, что тут сейчас не об этом, но раз уж накидал от нечего делать, скину
решение без тредов, которое вроде как сильно быстрее
defmodule Er do
def run(max, tc \\ 2),
do: [1 | (2..max) |> Enum.to_list() |> sieve(:math.sqrt(max) |> trunc())]
defp sieve([hd | tl], limit) when hd >= limit, do: tl
defp sieve([hd | tl], limit),
do: [hd | tl |> Enum.reject(& rem(&1, hd) == 0) |> sieve(limit)]
end
а можно тебя попросить прислать табличку по времени выполнения на 1, 2, 4, 6, 10, 12, 15 и 20 тредах? Просто интересна зависимость
вот код для этого
for thread_count <- [1, 2, 4, 6, 10, 12, 15, 20] do
time_start = System.monotonic_time(:milli_seconds)
ans = Er.run(1_000_000, thread_count)
time_spent = System.monotonic_time(:milli_seconds) - time_start
# ans |> IO.inspect(label: "> ")
time_spent |> IO.inspect(label: "tc: #{thread_count} – time")
end
(сам не могу, потому что у меня уже после 4 ничего не меняется, понятно почему)


Alexey
24.09.2018
11:34:56

Shumilkin
24.09.2018
11:35:48
чет не то
это мое решение что ли?

Admin
ERROR: S client not available

Alexey
24.09.2018
11:36:00
выполняю на 10М чисел

Shumilkin
24.09.2018
11:36:12
не, я про то, что вот до этого было. В моем-то тредов нет)

Alexey
24.09.2018
11:36:18
да, все что ты написал, я запустил несколько раз
а, запустить мой код при разном количестве тредов?

Shumilkin
24.09.2018
11:37:31
да да да, если не сложно

Alexey
24.09.2018
11:38:16
сейчас прогоню свой на всех вариантах..

Google

Alexey
24.09.2018
11:46:06
это для 10M чисел

Shumilkin
24.09.2018
11:46:50
о отлично, спасибо!)

Buckler
24.09.2018
18:33:21
Привет, Devon!
Пожалуйста, реши капчу:
Вычисли: 100+39=...
Осталось попыток: 3
Если не решишь - забаню навеки...
Удачи!

Vyacheslav
24.09.2018
19:43:08
Доброго вечера! Подскажите пожалуйста, как лучше в тестах писать:
setup all Чищу тествую БД
test Пишу в БД что то и проверяю что записалось(на уровне бд)
test Проверяю функцию, которая должна считать из БД то что было записано в прошлом тесте
Или:
setup all Чищу тествую БД
test Пишу в БД что то и проверяю что записалось(на уровне бд)
test Пишу в БД что то, Проверяю функцию, которая должна считать из БД результат
При этом первый вариант почему то отваливается при использовании setup_all. Такое ощущение что он вызывается на каждый test
И веб сервер как лучше тестировать? Plug.Test или поискать либу которая просто запросы на сервер делает?

Dmitry
24.09.2018
19:52:49
второй вариант конечно. тесты не должны зависеть друг от друга. а если общие части (что-то пишешь в бд), выноси в setup

john
24.09.2018
19:53:26
https://kapeli.com/dash

Vyacheslav
24.09.2018
19:53:37

Егор
24.09.2018
20:30:09
Кто-то разбирался с :naive_datetime и :utc_datetime в timestamps? У меня куча вопросов..)

Vyacheslav
25.09.2018
05:29:29
Доброе утро! Подскажите по супервизору для ковбоя пожалуйста. Его можно как то определить так, что бы можно было в основной супервизор приложения передать как элемент в массив children основного супервизора?
А то везде вижу такой код:
:cowboy.start()
App.supervisor.start_link()
А это как я понял не совсем то)

Buckler
25.09.2018
05:39:10
Привет, Rustem!
Пожалуйста, реши капчу:
Вычисли: 87+30=...
Осталось попыток: 3
Если не решишь - забаню навеки...
Удачи!

Alexander
25.09.2018
06:01:46
Не думаю, что из одного приложения надзирать за другим супервизорами канонично, мне кажется приложение обычно само заботится о своём error core
Но может и нет. Я не знаю как устроен ковбой.


Vyacheslav
25.09.2018
06:11:52
Не думаю, что из одного приложения надзирать за другим супервизорами канонично, мне кажется приложение обычно само заботится о своём error core
Вот у меня так:
def start(_type, _args) do
db_url = Application.get_env(:link, :db_url)
children = [
Plug.Adapters.Cowboy.child_spec(:http, Link.Router, [], port: 8080),
worker(Mongo, [[name: :mongo, pool: DBConnection.Poolboy, url: db_url]])
]
Supervisor.start_link(children, strategy: :one_for_one)
И вот вместо плага я хочу заиспользовать чистый ковбой.) Кажется понял как:
Определить внутри ковбой сервера start_link и в нем стартануть через start_link кастомный супервизор. По идее должно сработать
Да, вот так сработало. )