Не Rails единым
Заключительный Ruby-дайджест этого года мы посвящаем обновлённому фреймворку Hanami, компилятору Opal и инструменту автоматизации ruby-nmap. Надеемся, что каждый наш читатель узнает для себя что-то новое.
Вышел в релиз Hanami 2.0
Увидела свет вторая версия fullstack-фреймворка Hanami. Мы уже упоминали о нём в одном из прошлых дайджестов. Его создавали, как полноценный легковесный аналог Rails, добиваясь меньшего потребления памяти и компактности. Немалую роль в этом играет модульность. Разработчик может взять лишь необходимые части фреймворка и не раздувать кодовую базу.
Новая версия принесла кардинальные изменения. Ядро приложения теперь включает иной подход к загрузке кода. Фишка в том, что можно не загружать сразу всё приложение, а выбрать подготовку отдельных компонентов к загрузке. Это гарантирует, что даже когда этих компонентов станет несколько сотен или тысяч, консоль Hanami всё равно будет запускаться мгновенно.
Полностью переписанная HTTP-маршрутизация теперь значительно превосходит по скорости Rails, Sinatra и Cuba. Также была реализована автозагрузка кода. Все ваши классы и модули будут доступны без необходимости прямого вызова через require.
Разработчики фреймворка не стали изобретать велосипед и воспользовались давно проверенным решением zeitwerk. Правда, это наложило небольшое ограничение в виде необходимости соблюдать требования Zeitwerk к файловой структуре. Ничего необычного для тех, кто знаком с Rails 7.
Наверняка вы слышали про коллекцию библиотек dry-rb. 24 гема, предназначенные решать задачи, которые не под силу стандартной библиотеке (детальнее мы рассказывали о ней в статье на Хабре). Разработка Hanami 2.0 ознаменовалась объединением усилий двух независимых команд. В октябре 2022 разработчики dry-rb закончили работу над тем, чтобы все библиотеки могли автоматически подгружаться через Zeitwerk. На наш взгляд отличная коллаборация и замечательный результат. Об остальных изменениях можно узнать из анонса на официальном сайте проекта.
Драгоценный камень Opal
Ещё одно обновление в мире Ruby-разработки. Инструмент Opal для прямой компиляции Ruby в JavaScript получил порцию изменений, призванных увеличить производительность и убрать ошибки. Новая версия 1.6 стала гораздо удобнее для разработчиков. Но для начала напомним, как это вообще работает.
Одной из попыток улучшить читаемость кода и уменьшить его размер был CoffeeScript. Тонна синтаксического сахара в стиле Ruby/Python/Haskell/Erlang действительно позволяла писать более компактно. При этом выдаваемый после трансляции код полностью проходил проверку JS Lint.
Удачным экспериментом стал и Opal, открыв новые возможности изоморфной разработки. Это же прекрасно, когда и клиент, и сервер созданы на одном языке. Забудьте про все эти страшные точки с запятой и пишите в привычном стиле. Перед тем, как пускаться «во все тяжкие» советуем попробовать Opal в действии прямо из браузера.
Если посмотреть пристальнее, то становится ясно, что Opal — серьёзная и полноценная реализация Ruby (как corelib, так и stdlib). Но вот с поддержкой нативных JS-библиотек не всё так радужно. Да, кое-какие штуки, например jQuery, заработают без дополнительных танцев с бубном. Но вот для поддержки других библиотек вероятно придётся написать собственную оболочку или же интегрировать чистый код на JS. Принцип такой же, как и у вызова внешних консольных команд из Ruby.
Авторы проекта не забрасывают своё детище и и прикладывают значительные усилия по его доработке. Новая версия стала дружелюбнее к RSpec, перестав обрезать трейсы до 15 строк, а async/await вышла из разряда экспериментальной фичи. Показательным примером стал PR, демонстрирующий, как изменение всего лишь одной строчки кода способно повлиять на производительность и компиляции, и в рантайме.
Автоматизация nmap с помощью Ruby
Даже если вы никогда не использовали nmap, то наверняка что-то о нём слышали или видели в фильмах. Этот инструмент для сканирования IP-cетей настолько полюбился киношникам, что они его пихают везде, где только можно. Об этом даже была забавная статья на Хабре. Но что если нам нужно будет использовать возможности nmap в Ruby-приложении или же мы хотим автоматизировать процесс сканирования?
В этом нам поможет пакет ruby-nmap. Он предоставляет Ruby-интерфейс для взаимодействия с nmap, а также парсер для сгенерированных nmap XML-файлов. Работает он предельно просто, вот пример из официального репозитория проекта:
require 'nmap/command'
Nmap::Command.run do |nmap|
nmap.connect_scan = true
nmap.service_scan = true
nmap.output_xml = 'scan.xml'
nmap.verbose = true
nmap.ports = [20, 21, 22, 23, 25, 80, 110, 443, 512, 522, 8080, 1080]
nmap.targets = '192.168.1.*'
end
При помощи ruby-nmap можно за короткое время создать собственное приложение или даже целый веб-сервис, обладающий всей мощью сканера. Так, например, родился небольшой проект Rmap, задействующий возможности Nmap Scripting Engine. Получившийся инструмент умеет выполнять сканирование на уязвимости, такие как SMTP-брутфорс или XSS-атака на движок WordPress. Полный перечень того, что умеет Rmap вы найдёте в статье автора проекта.
Раз речь зашла о скучном инструменте, давайте глянем нет ли в нём немного веселья. «Пасхальное яйцо» тут есть в виде вывода лога в «хакерском стиле». Делается это так, добавлением параметров -oS -
$ nmap -oS - scanme.nmap.org
STart1Ng nmAp 7.92 ( https://nmap.org ) at 2022-12-05 07:27 E3T
NmAp $can R3pOrt f0R $canm3.nmap.0rg (45.33.32.156)
H0St iz up (0.22s latency).
0th3r aDdrE$s3z F0r $caNm3.nmap.0rg (N0T Scann3d): 2600:3c01::F03C:91ff:f318:bb2f
NoT sH0Wn: 988 cl0$Ed tcP pOrtz (cONn-r3FUs3d)
P0RT STAtE $eRvIC3
22/tcp 0pen $sH
25/tcp Filter3d $mtp
80/tcp 0p3n http
726/tcP f!lt3r3d uNkn0wn
1027/tcp f|ltered !Is
2005/tcp F!ltered DEsl0g1n
2605/tcp f!lTered bgPd
9929/tcp OpEn nP1NG-3cho
12174/tcp filtErEd unkn0wN
16993/tcp fIlt3red aMt-soap-https
31337/tcp 0p3N Elit3
32772/tcp f!lter3D s0m3T1Mes-rpc7
NmAp done: 1 IP aDDresz (1 h0st up) scann3d !n 20.48 $3condz
Интересно посмотреть
Наш осенний Ruby-митап был богат на интересные доклады. Если вам не удалось принять участие, то ничего страшного. Все записи уже есть на нашем Youtube-канале.
Если монады Either или Maybe для вас не простой звук, то вам явно будет интересно узнать ещё об одной абстракции — аппликативных функторах:
Опыт можно получать разными способами. Если внимательно посмотреть на процесс разработки популярных библиотек, то можно почерпнуть немало полезной информации:
Портирование доставшегося в наследство кода иногда превращается в историю. Одну из таких мы услышали на нашем ноябрьском митапе:
Если паттернов проектирования превеликое множество, то базовых принципов написания не слишком много. Проблема лишь в их абстрактности. Так что предлагаем послушать о практическом использовании базовых принципов в реальной жизни:
Теперь следить за митапами Evrone стало удобнее. В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи после мероприятий. А ещё, у нас можно выступить, мы поможем оформить вашу экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.
Вакансии
Удаленка / Офис
Evrone
Мы открыты для новых Ruby-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.