Формат сериализации Marshal в Ruby

В Ruby любой объект можно превратить (сериализовать) в последовательность байт, а потом без каких-либо потерь обратно восстановить в объект. Для этого нужен модуль Marshal и методы dump и load, которые идут из коробки. Это очень любопытный механизм, потому что он универсальный (может сериализовать любой объект любого класса) и совместимый (как backward так и forward) с предыдущими версиями Ruby. Кроме того одна из целей - это маленький размер дампа. Экономят буквально на байтах. Учитывая динамическую природу Ruby, богатство функционала и большую стандартную библиотеку разработать такой формат было нетривиальной задачей.

»
Author's profile picture Andrew Konchin on Ruby

Как работает constant lookup в `#instance_eval`

Недавно плотно позанимался с методом BasicObject#instance_eval (полезный для построение DSL-ей в Ruby) и сделал для себя парочку открытий.

»
Author's profile picture Andrew Konchin on Ruby

Атомарность require в Ruby

Метод Kernel#require - это стандартный способ в Ruby подключить другой файл. За простотой на самом деле стоит нетривиальная логика. Принимаешь как должное, что он адекватно и надежно работает и не думаешь, например, а потоко ли безопасен require. А атомарен ли. А как справится с циклом в зависимостях.

»
Author's profile picture Andrew Konchin on Ruby

Как мигрировать данные в Rails-приложении

Rails-миграции подходят для маленьких и коротких миграций. В идеале без downtime. Это разумный выбор для нового проекта. База данных относительно маленькая, пользователей мало. Downtime - не проблема. Бага - тоже не страшно.

»
Author's profile picture Andrew Konchin on Ruby and Rails

Проблемы с миграцией данных в Rails

Мой список проблем с миграцией данных в Rails. Стандартным механизмом миграций, который доступен из коробки. Под миграцией данных я понимаю изменение данных в базе данных приложения.

»
Author's profile picture Andrew Konchin on Ruby and Rails

Ruby AWS SDK и сетевые соединения

Вопросом переиспользует ли AWS SDK TCP-соединения я задавался уже давно. Официальная документация об этом молчит. Но это важно понимать, ведь накладные расходы на открытие соединения влияют на время отправки HTTP-запроса. И если AWS SDK это не поддерживает, тогда приложению придется переиспользовать клиентов, а не создавать каждый раз на лету.

»
Author's profile picture Andrew Konchin on Ruby and AWS

Задачка с собеседования #2

Продолжаем серию задач с собеседований. Следующую задачу мне предложили решить на одном из уже моих собеседований. Запомнилась тем, что несколько раз уточняли условие, и это сильно усложнило начальное решение. Не помню уже в точности всех деталей и вопросов, поэтому опишу более полное решение, чем то, что получилось у меня тогда.

»
Author's profile picture Andrew Konchin on Ruby and live-coding

Задачка с собеседования #1

Правильно провести техническое собеседование - это целое искусство. Говорят, что если много-много практиковаться то можно достичь просветления. У меня до сих пор не получилось. Видимо мало практиковал.

»
Author's profile picture Andrew Konchin on Ruby and live-coding

Проблема с keyword arguments в Ruby 3.0

После недавнего выхода Ruby 3.0 я решил проверить, что gem Dynamoid нормально на нем заводится. И в процессе столкнулся с любопытными проблемами. Matz зарелизил Ruby 3.0 по традиции на католическое Рождество и вместе с тем выкатил обратно несовместимые изменения в keyword arguments. Еще в предыдущей версии Ruby 2.7 начали сыпаться deprecation warning‘и, но руки не дошли это исправить. Теперь warning‘и превратились в exception‘ы и пришлось таки этим заняться.

»
Author's profile picture Andrew Konchin on Ruby

Хроника перевода gem'а на Ruby 3.0

На новогодние праздники я традиционно беру неделю отпуска и, как правило, не выдерживаю столько свободного времени сразу и нахожу что поковырять и попилить. В этот раз я уделил время своим проектам - Dynamoid и RubySpec. Всегда надо что-то доделать, дополировать или дописать в документации. Давно пора было выкатывать новую версию Dynamoid ведь последний релиз вышел еще полгода назад, а обычно версии выходят каждые 3-4 месяца.

»
Author's profile picture Andrew Konchin on Ruby

Еще один трюк с Enumerator

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

»
Author's profile picture Andrew Konchin on Ruby

Rubocop. Разбираем AST-деревья

В самом-самом начале когда я только начинал заниматься Rubocop мне очень не хватало информации и конкретных примеров. Сразу же возникли вопросы, а какие узлы AST-дерева существуют, какие иерархии они могут образовывать, какие могут быть дочерние узлы, как перемещаться по дереву, в каком порядке вызываются callback‘и и обрабатываются узлы дерева, какой жизненный цикл у объекта-cop‘а и как кешировать промежуточные результаты… Документация не сильно помогала и пришлось нырять самому.

»
Author's profile picture Andrew Konchin on Ruby and Rubocop

Rubocop. Фиксим баг

На днях у меня получилось влезть коготком в один из самых интересных проектов на Ruby - Rubocop. Если кто-то не сталкивался - это Ruby-линтер. Нет, не совсем так. Это целый фреймворк для разработки своих правил и проверок - он умеет статически анализировать исходных код на Ruby, проверяет (по умолчанию) правила из Ruby Style Guide и может даже автоматически корректировать/исправлять исходники - убирать лишние пробелы, заменять unless на if итд.

»
Author's profile picture Andrew Konchin on Ruby and Rubocop

Типичные ошибки в Rack middleware

В последнее время пришлось вплотную поработать с Rack и стандартными middleware. И хотя сама спецификация Rack весьма ясна и конкретна в ней все равно есть нюансы которые легко можно упустить и понаделать ошибок работая над своим middleware.

»
Author's profile picture Andrew Konchin on Ruby

Препарируем Rack

Давайте поговорим немного о Rack. Rack - это важная часть Ruby веб-стека и, де-факто, стандарт общения между веб-сервером и приложением. Все Ruby-сервера, например Puma, Unicorn или Thin, передают HTTP запросы приложению и получают обратно ответы именно по Rack интерфейсу. Обычно, правда, приложение ничего об этом не знает - обо всем уже позаботился какой-нибудь фреймворк вроде Rails или Sinatra.

»
Author's profile picture Andrew Konchin on Ruby