
Nick
07.04.2016
18:38:43

Vasilij
07.04.2016
18:39:35
вот, а с эликсиром все очень просто. Его делал Хосе, тот, который в кор рейлс был
очень много общего с руби в эликсире, а в фениксе с рельсами

Nick
07.04.2016
18:40:57

Google

Vasilij
07.04.2016
18:41:26
он, кстати, в город к нам приежжал на прошлых выходных на руби-митап
крутой парень

Roman
07.04.2016
18:42:13
@Okamit окстить. С go что-то неладное происходит. Его во все дыры пихать начали. Друг в гугле работает, говорит видел go только в обработке логов и аналитике. Друг, конечно, не видел всего гугла, но все же и не только свой отдел. Еще можешь на продукты hashicorp посмотреть - системные решения на go тоже хорошо идут.
По сравнению с elixir (+ OTP) go дает меньше гарантий безопасности и отказоустойчивости из коробки.

Nick
07.04.2016
18:43:03
> ~3 часа на руби против ~15 мин на эликсире
Сталкивался с подобным, но спас celluloid :)
Вместо 3х часов на руби получилось 15 минут на руби )

Vasilij
07.04.2016
18:43:29

Nick
07.04.2016
18:44:54
Согласен, плюс это для прикладных задач ок, а в полноценном приложении -- не панацея.

NewsBot pro.ruby
07.04.2016
19:24:28
Get Your Conference Proposal Accepted https://t.co/hZzyRaAhPi
Long-term TCP socket monitoring in Ruby https://t.co/yHse59BcQl

Vlad
08.04.2016
03:22:24
может лучше на свифте беки писать?

Maksim
08.04.2016
07:12:27
Привет
Можно ли в собственных функциях в моделях использовать стандартные методы валидации?
Просто я понимаю, что писать 7 if это полный бред
Или можно ли в валидациях прописать :on контроллер#функция?
Чтобы работало только для этого контроллера и функции

Vlad
08.04.2016
07:40:38
в моделях не функции а методы

Google

Vlad
08.04.2016
07:41:17
можно
все это есть в мануле

Maksim
08.04.2016
07:42:06
Хорошо, методы
Ну дак я и спрашиваю здесь, потому что либо мануал не нашёл, либо в мануале не нашел

Dmitry
08.04.2016
08:00:13
http://dry-rb.org/gems/dry-validation
вот тебе либа для валидаци

Vasilij
08.04.2016
09:09:08

NewsBot pro.ruby
08.04.2016
11:25:12
Can anyone help me extract the apple emojis to png using Ruby? https://t.co/jMiV0kKmGa
How to exclude the modules of a class here https://t.co/iBKygfGtoI

Vlad
08.04.2016
15:54:49

Yuri
08.04.2016
17:12:33
Вчера показал пример кода техническому директору известной компании. Его разочаровало что код не в одну строку и без сахара. А то, что он оптимизирован под обработку больших данных и использует кэшированные запросы к базе данных даже не заметил. Рельсы стали слишком сладкими. И на ревью от твоего кода ждут красоты, а не производительности. Видимо пора переходить на Erlang :)

Vitaliy
08.04.2016
17:56:33
Если при первом взгляде на код (без комментариев) нельзя понять, что он делает - тогда разочарование оправдано
Если выбора не остается и приходится выбирать между производительностью и читабельностью кода - тогда вопрос сводится к тому, что выйдет экономичнее. Производительный код сэкономит на оборудовании, читабельный код - на зарплатах разработчикам.

Денис
08.04.2016
18:03:53


Yuri
08.04.2016
18:04:27
В том то и дело, что я сначало описал стоявшую передо мной задачу, как я ее решил и что можно еще сделать. Код аккуратный и читаемый. Но если использовать сахар, то он будет отрабатывать вместо 10 минут несколько часов. Например, я сделал запрос к базе с использованием include зависимых данных. Потом загнал их в массивы чтобы подсчитать и сравнить. Но на первый взгляд по rails best practice приходит на ум другое решение - использовать pluck(:id) и все записать в одну строчку. Но возникнет проблема n+1 и один запрос превратится в несколько миллионов.
https://gist.github.com/weazar/81fec7d442638c409fbc1e546be8b7ae
Этот код сравнивает несколько миллионов записей в базе.

Sergey
08.04.2016
18:15:18

Vitaliy
08.04.2016
18:16:08
Гист посмотрел, хорошо написан
Если разница - 10 минут против нескольких часов - такой код очень хорош однозначно

Sergey
08.04.2016
18:17:17
Согласен

Google

Артем
08.04.2016
18:17:22
почему все через each и <<, а не просто map(&:id)?

Yuri
08.04.2016
18:17:33
Sergey Zinoviev, да active record сейчас здесь слабое место. Я сначала на чистом sql написал. Но столкнулся с тем, что sidekiq вылетает с ошибкой, что соединение с базой уже используется. Пришлось вернуться к AR.

Sergey
08.04.2016
18:17:58
У меня проблема даже была не в самом запросе, а в сериализации полученных данных.
Проще сразу было получить хэш.

Yuri
08.04.2016
18:19:07
Артем Нистратов, да кстати хорошее замечание)

Sergey
08.04.2016
18:19:41
На самый худой момент можно и ActiveRecord::Base.connection заиспользовать

Артем
08.04.2016
18:19:43
все ругают сахар просто потому, что не умеют его применять
надо знать, что стоит за очередной "красивой" конструкцией

Yuri
08.04.2016
18:20:46
Сервер слабый у заказчика. Я пробовал 250, но память уходила в своп и сайт переставал отвечать. Сейчас нашел оптимальное значение 70 - 25 на sidekiq, 32 для puma и запас небольшой

Vitaliy
08.04.2016
18:20:50
тоже пара вопросов есть:
13 строка: Что, если сделать next if <условие>; и избавиться от вложенного условия?
32 строка и далее: Что, если использовать в одну строку map или inject или find_each вместо each?
44 строка и далее: Что, если использовать case when вместо if elsif?
Те же строки: Что, если вынести это в приватные методы? Например, def genres_count(genres_size) и обращаться к ним

Nick
08.04.2016
18:21:10
Мне после беглого взгляда показалось, что там большая часть нагрузки приходится на инициализацию AR объектов.
Как доберусь до дома посмотрю подробнее. )

Yuri
08.04.2016
18:23:40
Артем Нистратов, сахар хорош, но не на больших объемах. Производительность Active Record например. Один разработчик пытается увеличить ее производительность, но все на том же месте.

Nick
08.04.2016
18:23:49
Иногда такие задачи лучше решаются с минимальным использованием рельс
Хороший SQL запрос может ускорить процесс в разы :)

Dmitriy
08.04.2016
18:25:41
вроде по логике код довольно неплохой, а вот по оформлению можно во многих местах сделать короче и читаемее (хотя тут кому как). написали выше - next if, map, в некоторых местах case, и всё это без вреда для итогового sql. и еще в глаза бросились присвоения в конце методов
но это всё косметика

Yuri
08.04.2016
18:26:30
Nick Itch, а если заказчик хочет через админку этим делом управлять, то приходится выкручиваться. Конечно можно было бы это на crystal в несколько потоков запилить с чистым sql. Но задача стоит сделать на рельсах.

Nick
08.04.2016
18:27:16
Параметризировать sql тоже никто не мешает. Если задача про рельсы, вопросов нет :)

Yuri
08.04.2016
18:28:21
Dmitriy Ushkov, ну да это уже косметика, которую сейчас и ждут от разработчика. А за лесом деревьев не видят)

Google

Dmitriy
08.04.2016
18:33:33
Ну по сути эта косметика не требует лишних затрат времени, тут скорее дело в привычке. Может, ищут тех, кто пишет код, красивый как по сути, так и косметически.

Yuri
08.04.2016
18:33:34
Sergey Zinoviev, я изначально делал через ActiveRecord::Base.connection и sql, но в sidekiq вылетала ошибка что соединение уже занято.

Dmitriy
08.04.2016
18:34:00
Но это всё грустно, если честно

Артем
08.04.2016
18:34:08
здесь хоть кто-нибудь слышал про arel?

Dmitriy
08.04.2016
18:34:18
Косметике обручиться несложно, а код правильный писать не каждый может

Nick
08.04.2016
18:34:20

Артем
08.04.2016
18:34:32
любой sql запрос можно написать в рамках rails
и быстро и читаемо
и кто-нибудь здесь проводил исследования производительности AR? что есть быстрее?
sequel? rom?

Yuri
08.04.2016
18:37:32
Да, sql раз в 10 быстрее

Артем
08.04.2016
18:38:08
ты потом hash будешь в страницу отображать?

Nick
08.04.2016
18:38:08
Быстрее возвращать json из БД :D

Артем
08.04.2016
18:39:06
тогда зачем ruby? делайте запросы прямо в теле страницы) как в php образца 2000-х

Nick
08.04.2016
18:39:16
Тут таска в бэкграунд

Артем
08.04.2016
18:40:12
ну вот, то вы о AR в общем, то снова прыгаете к конкретике

Nick
08.04.2016
18:40:59
Я вроде в контексте задачи оставался )

Yuri
08.04.2016
18:41:34
Vitaliy Emeliyantsev, find_each по моему вызовет прямой запрос к базе. А case when там надо будет городить громоздкую конструкцию, потомучто сравнения есть >= а не просто булевы значения.

Nick
08.04.2016
18:41:34
Крайности -- тоже плохо. Технологии надо использовать там, где они нужны

Google

Yuri
08.04.2016
18:44:03
Это расчет коэффициента близости между фильмами для рекомендательной системы. На странице ничего не выводится. Только в результате похожие фильмы.

Артем
08.04.2016
18:44:03

Yuri
08.04.2016
18:44:24
Active Record

Артем
08.04.2016
18:45:07
Пример можно?

Nick
08.04.2016
18:46:19
А почему бы #genres_count вот так не написать:
genres_size = @film.genres.count + comparison.genres.count ...

Артем
08.04.2016
18:46:55
нет, это вызовет запрос к бд
когда все данные уже в памяти

Yuri
08.04.2016
18:47:37
Это примерно, я сравнивал работу этого алгоритма на sql и AR. Тут разница от кода зависит, но она существенная. Вот кстати статья в тему ее производительности https://www.netguru.co/blog/back-to-thinking-sql-ruby-rails

Nick
08.04.2016
18:48:39
И if ... elsif выглядит не менее громоздким, чем case ... when

Артем
08.04.2016
18:49:50
интересно, что было бы, если все решения при создании программных продуктов принимались бы "примерно".
а не принималось ли во внимание, что код на AR был написан далеко не оптимально?
этот gist вызвал шквал комментариев
сохранилась ли версия на AR?

Nick
08.04.2016
18:50:55

Артем
08.04.2016
18:51:13
так лучше)
я например тоже скептически относился к производительности AR
но на настоящих данных сравнил rom и AR... rom к слову использует sequel
вот там разница и правда имеет место быть

Nick
08.04.2016
18:53:22
В общем рефактор каунт методов в таком ключе без потери читаемости сократит количество кода процентов на 40 )

Артем
08.04.2016
18:53:42
rom выиграл только на bulk insert

Yuri
08.04.2016
18:53:47
Примерно, потомучто факт в том, что AR слабое звено в рельсах на высоких нагрузках. И если посмотреть код оптимизированных приложений, то там sql. По крайней мере в моей практике с legacy кодом так было почти всегда.

Артем
08.04.2016
18:54:10
в остальных тестах до 3х потеря производительности

Yuri
08.04.2016
18:54:59
На миллионе запросов разница в 3 раза превращается в тысячи лет.
на миллионах*