Не Rails единым

05 декабря 2022
Не 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 проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.

Подробнее

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