Вышла альфа версия Rails 7. Фичи
✦ Новый подход к фронтенду (подробно освещался ранее на этом канале)
✦ Асинхронные ActiveRecord-запросы
✦ Шифруемые ActiveRecord-атрибуты
✦ Комментарии в SQL (полезно для логов)
✦ Zeitwerk включен по-умолчанию
✦ Spring выключен по-умолчанию
https://weblog.rubyonrails.org/2021/9/15/Rails-7-0-alpha-1-released/
А ниже – пара мыслей про Tailwind CSS, esbuild и путь, по которому идут рельсы во фронтенде 👇
✦ Новый подход к фронтенду (подробно освещался ранее на этом канале)
✦ Асинхронные ActiveRecord-запросы
✦ Шифруемые ActiveRecord-атрибуты
✦ Комментарии в SQL (полезно для логов)
✦ Zeitwerk включен по-умолчанию
✦ Spring выключен по-умолчанию
https://weblog.rubyonrails.org/2021/9/15/Rails-7-0-alpha-1-released/
А ниже – пара мыслей про Tailwind CSS, esbuild и путь, по которому идут рельсы во фронтенде 👇
Forwarded from Vitaliy Emeliantsev
This media is not supported in your browser
VIEW IN TELEGRAM
Хорошая новость – вышел Stimulus 3.0
Новое API для параметров, значения по-умолчанию, больше колбеков, дебаг-режим, интеграция с Tailwind CSS
Анонс: https://world.hey.com/hotwired/stimulus-3-c438d432
Доки: https://stimulus.hotwired.dev/
Плохая новость – в библиотеке все еще кошмарнейшее именование. И стало еще хуже
Ребята все еще гнут свою линию и именуют контроллеры, параметры, экшны, функции и файлы по совершенно диким принципам, не основанным ни на каких стандартах ни из мира JS, ни из мира руби
Кто-то в Basecamp, совершенно незнакомый с понятием «семантический разрыв», все еще принимает идиотские решения по API
В итоге получаем фреймворк с хорошей идеей, и с cryptic API, который придется зазубрить, чтобы нормально его использовать
Не рекомендую
Кстати, Github (которые тоже используют много руби и рельс у себя) совершенно спокойно развивают Catalyst – правильный и логичный Stimulus. За ним – будущее
https://github.github.io/catalyst/
Новое API для параметров, значения по-умолчанию, больше колбеков, дебаг-режим, интеграция с Tailwind CSS
Анонс: https://world.hey.com/hotwired/stimulus-3-c438d432
Доки: https://stimulus.hotwired.dev/
Плохая новость – в библиотеке все еще кошмарнейшее именование. И стало еще хуже
Ребята все еще гнут свою линию и именуют контроллеры, параметры, экшны, функции и файлы по совершенно диким принципам, не основанным ни на каких стандартах ни из мира JS, ни из мира руби
Кто-то в Basecamp, совершенно незнакомый с понятием «семантический разрыв», все еще принимает идиотские решения по API
В итоге получаем фреймворк с хорошей идеей, и с cryptic API, который придется зазубрить, чтобы нормально его использовать
Не рекомендую
Кстати, Github (которые тоже используют много руби и рельс у себя) совершенно спокойно развивают Catalyst – правильный и логичный Stimulus. За ним – будущее
https://github.github.io/catalyst/
По тегу #коммит на канале доступны полезные коммиты, которые можно читать и применять в своих проектах
https://github.com/gambala/rubyshow/commit/1c46aafcf2830e7d0c0b102d3b22052f4f587e27
В сегодняшнем коммите, в рамках проекта https://ruby.show
– перешел с Webpacker v5 → v6
– с PostCSS v7 → v8
– включил JIT в TailwindCSS, чем ускорил сборку стилей в 40 раз и получил все новые фичи JIT-тейлвинда (динамические классы, доп-модификаторы и т.д.)
https://github.com/gambala/rubyshow/commit/1c46aafcf2830e7d0c0b102d3b22052f4f587e27
В сегодняшнем коммите, в рамках проекта https://ruby.show
– перешел с Webpacker v5 → v6
– с PostCSS v7 → v8
– включил JIT в TailwindCSS, чем ускорил сборку стилей в 40 раз и получил все новые фичи JIT-тейлвинда (динамические классы, доп-модификаторы и т.д.)
Перешел с webpack на esbuild и postcss cli сборщики, ускорив сборку фронтенда еще в 100-120 раз 🚀
В проекте сейчас рельсы 6.1, но и с ними, и c 6.0 – можно использовать новые гемы
Чуть позже я проделаю такой же переход на другом боевом проекте побольше (вебпакер собирает там ассеты 60-130 секунд), по результатам отпишусь – прим. ред
#коммит https://github.com/gambala/rubyshow/commit/c49eec61a81661cea84a38eb0552a32ecdddfce2
В проекте сейчас рельсы 6.1, но и с ними, и c 6.0 – можно использовать новые гемы
jsbundling-rails
и cssbundling-rails
Это микрообертки (никакой магии, никаких внутренних конфигов как в вебпакере), позволяющие ненавязчиво использовать esbuild, postcss и tailwind cli, и другие современные сборщики (webpack в том числе) для сборки js и cssЧуть позже я проделаю такой же переход на другом боевом проекте побольше (вебпакер собирает там ассеты 60-130 секунд), по результатам отпишусь – прим. ред
#коммит https://github.com/gambala/rubyshow/commit/c49eec61a81661cea84a38eb0552a32ecdddfce2
Ruby/Rails expert
Перешел с webpack на esbuild и postcss cli сборщики, ускорив сборку фронтенда еще в 100-120 раз 🚀 В проекте сейчас рельсы 6.1, но и с ними, и c 6.0 – можно использовать новые гемы jsbundling-rails и cssbundling-rails Это микрообертки (никакой магии, никаких…
Перевел на esbuild один из клиентских проектов
В вебпакере сборка фронта занимала 60-90 секунд. Сейчас в esbuild занимает 2-3
И на локальном стенде в режиме --watch собирает бандл моментально. Цифры в районе 5-50 миллисекунд
Кажется пора сесть и по горячим следам написать гайд на англ языке (который завирусится, попадет к DHH в твиттер, в rubyweekly и т.д.)
На какой платформе публикнуть гайд? Что вообще сейчас модно? DEV.to?
В вебпакере сборка фронта занимала 60-90 секунд. Сейчас в esbuild занимает 2-3
И на локальном стенде в режиме --watch собирает бандл моментально. Цифры в районе 5-50 миллисекунд
Кажется пора сесть и по горячим следам написать гайд на англ языке (который завирусится, попадет к DHH в твиттер, в rubyweekly и т.д.)
На какой платформе публикнуть гайд? Что вообще сейчас модно? DEV.to?
А, да. Я же ищу себе помощника/преемника
Фулстек Ruby on Rails, 10-40 часов в неделю. Не галера – проекты устоявшиеся, многолетние, финансово-стабильные. Я работаю с клиентом 4 года
Пиши напрямую: @gambala
1. Как долго ты в Rails
2. Сколько берешь в час
3. Сколько часов свободных в неделю
Поговорим за опыт, код и практики
Давай работать вместе
Фулстек Ruby on Rails, 10-40 часов в неделю. Не галера – проекты устоявшиеся, многолетние, финансово-стабильные. Я работаю с клиентом 4 года
Пиши напрямую: @gambala
1. Как долго ты в Rails
2. Сколько берешь в час
3. Сколько часов свободных в неделю
Поговорим за опыт, код и практики
Давай работать вместе
Настроил в ESBuild аналог webpack-bundle-analyzer – для оценки размера бандла и зависимостей
Настройка простая. При сборке (и пересборке) сохраняем статы в metafile.json, и по команде отдельным пакетом строим по файлу визуализацию
#коммит https://github.com/gambala/rubyshow/commit/48734d5d7863982cb3f65b555d93674668900e87
Настройка простая. При сборке (и пересборке) сохраняем статы в metafile.json, и по команде отдельным пакетом строим по файлу визуализацию
#коммит https://github.com/gambala/rubyshow/commit/48734d5d7863982cb3f65b555d93674668900e87
Снова попробовал мигрировать с turbolinks на новый turbo в Rails
Basecamp в своем репертуаре – ломают API, плюют на совместимость, сообщество своими силами поднимает upgrading guide'ы
Но ситуацию это пока не спасает – Rails UJS и формы в Devise не работают
Сохранил тикет на будущее, буду отслеживать https://github.com/hotwired/turbo-rails/issues/122
Basecamp в своем репертуаре – ломают API, плюют на совместимость, сообщество своими силами поднимает upgrading guide'ы
Но ситуацию это пока не спасает – Rails UJS и формы в Devise не работают
Сохранил тикет на будущее, буду отслеживать https://github.com/hotwired/turbo-rails/issues/122
Вышли Ruby on Rails 7.0
Помимо фронтенда без сборки или со сборкой быстрым esbuild (уже обсуждали на этом канале) в новых рельсах есть еще пара клевых вещей, но важным я вижу не это
Важнее то, как DHH с командой изменили подачу рельс в публичном пространстве. Рельсы теперь не просто уютный фреймворк, на котором можно быстро начать пилить веб-сервисы. Теперь это мощный фреймворк с сильными примерами компаний, кода. DHH активно продает фреймворк
Даже уютную милую картинку с человечками при старте нового рельсового приложения убрали и заменили на лого фреймворка в новом фирменном стиле
Удастся ли лучше продавать такой фреймворк ребятам из Долины? Поживем – увидим
Помимо фронтенда без сборки или со сборкой быстрым esbuild (уже обсуждали на этом канале) в новых рельсах есть еще пара клевых вещей, но важным я вижу не это
Важнее то, как DHH с командой изменили подачу рельс в публичном пространстве. Рельсы теперь не просто уютный фреймворк, на котором можно быстро начать пилить веб-сервисы. Теперь это мощный фреймворк с сильными примерами компаний, кода. DHH активно продает фреймворк
Даже уютную милую картинку с человечками при старте нового рельсового приложения убрали и заменили на лого фреймворка в новом фирменном стиле
Удастся ли лучше продавать такой фреймворк ребятам из Долины? Поживем – увидим
Simple ≠ Easy
Фраза популярная, но на русском не всегда понятная. В переводе на русский оба слова кажутся синонимами:
Просто ≠ Легко
Но чтобы сохранить исходный смысл, Easy лучше переводить как «Привычно». И фраза трансформируется в:
Легко, потому что просто ≠ Легко, потому что привычно
Об этом правиле важно помнить и носить с собой, делая тот или иной выбор
Бывает непонятно, какой из вариантов выбрать. Но если смотреть на варианты сквозь правило, часто выясняется, что один из вариантов кажется легким просто потому что он привычный – хотя на самом деле внутри сложнее другого
И совет в общем виде простой:
Выбирайте Simple, не Easy
Фраза популярная, но на русском не всегда понятная. В переводе на русский оба слова кажутся синонимами:
Просто ≠ Легко
Но чтобы сохранить исходный смысл, Easy лучше переводить как «Привычно». И фраза трансформируется в:
Легко, потому что просто ≠ Легко, потому что привычно
Об этом правиле важно помнить и носить с собой, делая тот или иной выбор
Бывает непонятно, какой из вариантов выбрать. Но если смотреть на варианты сквозь правило, часто выясняется, что один из вариантов кажется легким просто потому что он привычный – хотя на самом деле внутри сложнее другого
И совет в общем виде простой:
Выбирайте Simple, не Easy
Как думаете, почему эта тема в Ruby/Rails канале? И как применима в руби/рельсах (и в разработке в целом)?
Офигенный материал по оптимизации скорости на беке
Полуторачасовой скринкаст (можно не смотреть целиком, ниже распишу как ускориться) и два примера (код на гитхабе) ДО и ПОСЛЕ оптимизаций.
Оптимизации наивкуснейшие и грамотно реализованные. Некоторые вещи могут быть слишком сложны (SQL портянка вместо ActiveRecord запросов) но даже взяв и внедрив лишь часть советов – можно получить прирост в производительности
Уверен, какие-то советы вы уже успешно применяете (асинк джобы те же), но все еще много мест и практик, которые можно почерпнуть и применить
– Статья: https://www.twnsnd.com/posts/how_i_100xd_bulk_import_speed_in_rails_with_some_gnarly_sql.html
– Скринкаст: https://www.youtube.com/watch?v=pOyvSxB9qFQ
– Пример ДО: https://github.com/ryantownsend/bulk-import-exercise
Точка входа – контроллер в API: https://github.com/ryantownsend/bulk-import-exercise/blob/main/app/controllers/movie_imports_controller.rb
От него можно (прям в гитхабе) ходить по другим классам и смотреть как выполняется запрос
– Пример ПОСЛЕ: https://github.com/ryantownsend/bulk-import-exercise-solution
Точка входа – тот же контроллер в API: https://github.com/ryantownsend/bulk-import-exercise-solution/blob/main/app/controllers/movie_imports_controller.rb
Список техник:
–
– jsonb поле в ActiveRecord автоматически сериализуется в ruby-object, для больших json-структур это долго и дорого по RAM.
– Асинк джобы, очевидно
–
–
– Гигантские json структуры (речь про batch-bulk импорт данных) выгодно обрабатывать батчами, пусть даже в одном потоке – это делает лок БД не одним длинным, а серией коротких
– Гигантская SQL-простыня
–
Полуторачасовой скринкаст (можно не смотреть целиком, ниже распишу как ускориться) и два примера (код на гитхабе) ДО и ПОСЛЕ оптимизаций.
Оптимизации наивкуснейшие и грамотно реализованные. Некоторые вещи могут быть слишком сложны (SQL портянка вместо ActiveRecord запросов) но даже взяв и внедрив лишь часть советов – можно получить прирост в производительности
Уверен, какие-то советы вы уже успешно применяете (асинк джобы те же), но все еще много мест и практик, которые можно почерпнуть и применить
– Статья: https://www.twnsnd.com/posts/how_i_100xd_bulk_import_speed_in_rails_with_some_gnarly_sql.html
– Скринкаст: https://www.youtube.com/watch?v=pOyvSxB9qFQ
– Пример ДО: https://github.com/ryantownsend/bulk-import-exercise
Точка входа – контроллер в API: https://github.com/ryantownsend/bulk-import-exercise/blob/main/app/controllers/movie_imports_controller.rb
От него можно (прям в гитхабе) ходить по другим классам и смотреть как выполняется запрос
– Пример ПОСЛЕ: https://github.com/ryantownsend/bulk-import-exercise-solution
Точка входа – тот же контроллер в API: https://github.com/ryantownsend/bulk-import-exercise-solution/blob/main/app/controllers/movie_imports_controller.rb
Список техник:
–
ActionController::Metal
– не триггерит и не тратит время на middleware, но params нужно пермиттить самостоятельно (отслеживая дыры в безопасности)– jsonb поле в ActiveRecord автоматически сериализуется в ruby-object, для больших json-структур это долго и дорого по RAM.
attribute :entries, :text
отключает авто-сериализацию– Асинк джобы, очевидно
–
MovieImport.where(id: movie_import_id).update_all("finished_at = now()")
быстрее чем–
MovieImport.find(movie_import_id).update(finished_at: Time.zone.now)
– Гигантские json структуры (речь про batch-bulk импорт данных) выгодно обрабатывать батчами, пусть даже в одном потоке – это делает лок БД не одним длинным, а серией коротких
– Гигантская SQL-простыня
UPSERT_QUERY_TEMPLATE
– спорно, т.к. усложняется поддержка, но жутко интересно. Насколько оказывается PG SQL богат возможностями и быстр–
AfterCommitEverywhere
гем позволяет объявлять коллбеки after_commit
в любом месте программы внутри транзакции. Когда выполнится транзакция ApplicationRecord.transaction
– выполнится коллбекEventStream
– офигенно используется концепт ActiveSupport::CurrentAttributes
, чтобы в рамках реквеста накопить в синглтоне какие-то данные, а потом в самом конце реквеста, что-то с этими данными сделатьTWNSND
100x'ing bulk import speed in Rails with gnarly SQL
A presentation covering how I improved bulk import performance on a large-scale Rails application to less than 1% of it's original processing time.
Доклады с RailsConf 2022 доступны для просмотра онлайн
Каждый раз жду и наслаждаюсь будто новый сезон любимого сериала, после каждой конференции – прим. ред
https://youtube.com/playlist?list=PLbHJudTY1K0f1WgIbKCc0_M-XMraWwCmk
Каждый раз жду и наслаждаюсь будто новый сезон любимого сериала, после каждой конференции – прим. ред
https://youtube.com/playlist?list=PLbHJudTY1K0f1WgIbKCc0_M-XMraWwCmk
По Ruby on Rails 2.5 года существовал клевый чат и канал по бесплатному обучению и вкатыванию в веб-разработку и руби/рельсы – @LearnRubyForPikabuChat. Я был там все эти 2.5 года как ментор и эксперт со стороны
Сейчас чат меняет владельца, и я не знаю как он будет развиваться, но хочу взять эстафетную палочку и продолжить развивать бесплатное вкатывание в IT и веб-разработку
Благо сам давно подумываю о написании Roadmap по входу в IT в 2022 (приветствую ваши вопросы и интересующие темы в комментариях)
А план обучения с того канала сохранил здесь: https://gambala.pro/roadmap
Сейчас чат меняет владельца, и я не знаю как он будет развиваться, но хочу взять эстафетную палочку и продолжить развивать бесплатное вкатывание в IT и веб-разработку
Благо сам давно подумываю о написании Roadmap по входу в IT в 2022 (приветствую ваши вопросы и интересующие темы в комментариях)
А план обучения с того канала сохранил здесь: https://gambala.pro/roadmap
Ruby on Rails получит прокси-сервис (написанный на Go)
Уже сейчас он работает в ONCE/Campfire и обеспечивает HTTP/2, public caching, X-Sendfile, gzip, SSL (Let's Encrypt). Обещают работу с любым Rails-приложением из коробки. Отличное дополнение для приложений, что деплоятся Kamal'ом в Docker. Сейчас всё это хорошо закрывает Cloudflare, но иметь hosted решение однозначно приятно.
https://github.com/rails/rails/issues/50479
Уже сейчас он работает в ONCE/Campfire и обеспечивает HTTP/2, public caching, X-Sendfile, gzip, SSL (Let's Encrypt). Обещают работу с любым Rails-приложением из коробки. Отличное дополнение для приложений, что деплоятся Kamal'ом в Docker. Сейчас всё это хорошо закрывает Cloudflare, но иметь hosted решение однозначно приятно.
https://github.com/rails/rails/issues/50479
GitHub
Add Thruster to Docker setup to get HTTP/2, X-Sendfile, Caching by default in Rails 8 · Issue #50479 · rails/rails
Puma does not support HTTP/2 out of the box, and there does not seem to be a short-term path to that changing. That means most people have to either stick nginx or a CDN in front of their app, whic...