Подарки под ёлочкой

04 января 2023
Подарки под ёлочкой

2023 год уже здесь. Пора рассказать о самых интересных новостях Ruby-разработки. Доставайте из холодильника заботливо спрятанные салатики и закуски. Наливайте чаю или чего покрепче. Приятного чтения!

Вышел Ruby 3.2.0

Стабильность — признак мастерства. 25 декабря 2022, спустя год после релиза Ruby 3.1.0, вышла новая версия 3.2.0. Изменений много, расскажем лишь об основных. В предыдущем дайджесте мы упоминали про Opal. Идея изоморфной разработки нашла своё отражение в начале интеграции WebAssembly и системного интерфейса WASI непосредственно в язык. 

Цель в том, чтобы запускать Ruby-приложения прямо из браузера или обособленных runtime, таких как wasmtime. Интерпретатор CRuby теперь умеет компилироваться в промежуточный код WASM, а для прямого взаимодействия с ОС задействуется API WASI. Стоит учитывать, что этот функционал находится в активной разработке и часть возможностей пока отсутствует. Так что там пока нет исключений, файберов и сборщика мусора.

В рамках этих же изменений была представлена wasi-vfs обвязка, необходимая, чтобы всё Ruby-приложение можно было упаковать в единый wasm-файл.

Разработчики из Shopify, объявившие осенью 2021 года о начале работы над собственным JIT-компилятором для CRuby, наконец-то могут выдохнуть. Шалость удалась, YJIT получил статус stable. Он работает на процессорах Apple Silicon, кастомных ARM-чипах AWS Graviton и даже одноплатниках Raspberry Pi 4. Написан на Rust, так что ему нужен rustc 1.58.0+. По этой причине YJIT не включен по-умолчанию.

Тем не менее, если его всё же включить, то ускорение будет значительным — до 41% по сравнению с обычным интерпретатором, если верить данным бенчмарка yjit-bench. Бонусом будет и на треть меньший расход оперативной памяти. Также в Ruby 3.2.0 появилось два механизма защиты от DoS-атак на приложение через Regexp, так называемый ReDoS. Первый улучшает алгоритм сопоставления, а второй вводит понятие тайм-аута для регулярных выражений.

Выход новой версии Ruby стал прекрасным поводом заглянуть в будущее языка и понять чего ожидать в следующие годы. По нашему мнению, выбранный путь вполне соответствует текущему тренду на развитие смежных технологий. Так что Ruby живее всех живых.

Dockerfiles в комплекте

Древнее китайское проклятие «Чтоб ты жил в эпоху перемен» актуально, как никогда. К счастью, некоторые перемены положительные. Реагируя на современные тренды, веб-фреймворк Ruby on Rails получил интересное изменение. Оно предназначено не для разработчиков, а для DevOps-инженеров.

Сейчас все предпочитают развёртывать приложения в контейнерах, выполняя оркестрацию с помощью Kubernetes. Чтобы создать образ контейнера, требуется Dockerfile. Это простой текстовый файл, содержащий инструкции для сборки образа. Если копнуть чуть глубже, то в нём будет указано какой базовый образ использовать для контейнера. Также там дано описание всех команд, которые к этому образу будут применены.

Задача автоматического создания Dockerfile для дальнейшей сборки и развёртывания обычно решалась с помощью сторонних инструментов. Но теперь RoR научился сам генерировать Dockerfile, а также вспомогательные .dockerignore и bin/docker-entrypoint. Они будут автоматически добавляться во все новые приложения и тем самым упрощать работу DevOps.

Рецепт Ruby-однострочников

Командная строка всегда была суперсилой Unix-систем. В отличие от графического интерфейса, через командную строку можно проделывать потрясающие трюки. Комбинирование внешних команд, таких как grep, sed, awk, sort и т.д. даёт возможность получать результат, не прибегая к сторонним инструментам. Это круто, но давайте задумаемся: способен ли Ruby заменить внешние команды консоли и их сочетания? Ответ однозначен — да, способен. Предположим, что есть некий текстовый файл:

$ cat table.txt
brown bread mat hair 42
blue cake mug shirt -7
yellow banana window shoes 3.14

Чтобы отфильтровать только целые числа, мы можем использовать grep:

$ grep -oE '[0-9]+$' table.txt
42
7
14

А вот как это выглядит на Ruby:

$ ruby -ne 'puts $& if /\d+$/' table.txt
42
7
14

Теперь стоит задуматься над ещё одним интересным вопросом: а зачем тут вообще использовать Ruby? Тот же sed или awk мощные утилиты, способные свернуть горы. Но есть один нюанс — их синтаксис и идиомы нужно учить. Если вы Ruby-разработчик, то второй способ вам будет привычнее. Сами операции будут выполняться медленнее, зато написание станет быстрее и легче. Для многих ситуаций такой подход будет более продуктивным.

Из плюсов можно отметить, что применение Ruby даёт два крутых баффа — использование стандартной библиотеки и подключение сторонних библиотек. Даже в однострочнике это будет востребовано для выполнения каких-либо действий над файлами. Примечательно, что при этом вы не теряете возможность использовать системные команды, вызывая их методом system:

$ ruby -e 'system("echo Hello World")'
Hello World

Получается, что если вы хорошо знаете Ruby, то обойдётесь без знания синтаксиса внешних команд. А если они для вас привычны и знакомы, то их комбинирование с Ruby даст превосходный буст при работе в командной строке. Детали есть в отличном обучающем материале с примерами — Ruby one-liners cookbook.

Фейки во благо

Успешная разработка приложений так или иначе требует тестовых данных. Реальные базы данных хороши, но часто требуют предварительной подготовки перед использованием. Создавать эти данные вручную долго и непродуктивно. Нужен способ эффективно генерировать их таким образом, чтобы они напоминали реальные. Но прежде чем придумывать велосипед советуем присмотреться к библиотеке faker-ruby.

Эта библиотека — порт расширения Data::Faker для Perl. В оригинале было всего лишь несколько простых генераторов, способных заполнить поля вроде Name / Phone number / Company / Address и так далее, но faker-ruby пошёл дальше. Здесь более сотни различных генераторов — от простых до экзотических, вроде генератора цитат из ситкома «Теория Большого Взрыва».

У faker-ruby есть несколько полезных опций, которые можно подкрутить, исходя из поставленной задачи. Так, например, можно заставить его генерировать только уникальные значения или же повлиять на генератор псевдослучайных чисел, чтобы получить воспроизводимые результаты генерации. Для некоторых типов данных созданы дополнительные проверки. Например, международный банковский номер счета IBAN валидируется на корректность перед генерацией, а сгенерированные VIN-коды автомобилей будут иметь правильную контрольную цифру.

Вот такой простой инструмент поможет заполнить вашу тестовую базу любым количеством данных, максимально похожих на настоящие. Это будет полезно для визуального тестирования и отлова багов. При этом проект активно развивается и постоянно улучшается. Рекомендуем!

Вакансии

Удаленка / Офис

Evrone 

Мы открыты для новых Ruby-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.

Подробнее

Подписаться
на Digest →
Важные новости и мероприятия без спама
Технологии которыми вы владеете и которые вам интересны
Ваш адрес электронной почты в безопасности - вот наша политика конфиденциальности.