Привет, Хабр! Мы — Рома, Настя и Карина — бэкенд-разработчики Тинькофф, пишем код на Scala и стараемся его популяризировать.
Мы собрали свежий выпуск новостей из разных источников, включая Scala Times, блог Petr Zapletal и канал Scala Nishtyaki, добавили дополнительные новости и свои комментарии. Наша мотивация — в желании развиваться и делиться полученными знаниями. Приветствуем любую обратную связь! (づ ◕‿◕ )づ
Релизы
Последние обновления популярных и полезных библиотек за пару месяцев:
From Tinkoff with ?
Рубрика для митапов и релизов библиотек и фреймворков, рожденных в недрах scala-комьюнити Тинькофф:
Mockingbird 3.6.0, 3.7.0, 3.7.1 — добавили поддержку вложенных protobuf-структур и другие небольшие изменения.
Иван Лягаев — О дивный контекстный мир Scala. Наш коллега презентовал доклад на Joker о работе с контекстом в Scala. От простой хеш-мапы и MDC до навороченных функциональных подходов с ReaderT-монадой и тайп-классами из tofu.
Статьи
Раздел со свежими статьями, репозиториями и исследованиями, которые нам показались интересными. В отдельный блок вынесли ресурсы, где авторы используют Scala 3. Enjoy:
Cancelling HTTP requests on the JVM — что будет при отмене http-вызова? Этим вопросом задается Adam Warski и проводит эксперимент с разными http-клиентами. Спойлер: сервер все равно закончит вычисления и отправит первый фрейм, но клиент не будет лишний раз сохранять и парсить ответ. А некоторые клиенты вовсе не умеют отменять вызов, например akka-http или встроенный java-client версии меньше JDK16.
Functional messaging in Scala with pass4s — небольшой, но емкий туториал по работе с pass4s, библиотекой-клиентом к AWS SQS/SNS и ActiveMQ. В этой части показаны базовые принципы использования: пару десятков строчек, как создать консьюмер/продюсер для простых строковых сообщений в AWS SQS/SNS. Из интересностей: используется scala-cli для работы с проектом.
JSON and XML messaging with pass4s — на одних неструктурированных строках далеко не уедешь! Добавляем в гайд выше интеграции с circe/phobos для кодирования и декодирования наших сообщений в структурированный формат в виде JSON/XML.
Proxy large messages via S3 with pass4s — продолжаем неловкие шаги в постижении pass4s. «Сообщения больше 256 КБ? Не беда!» — демонстрация встроенной схемы работы с прокси-S3 хранилищем для отправки сообщений любого размера.
fs2-kafka introduction: lib for ADT-events, idempotent writes and batches of offsets — продолжение туториала по fs2-kafka от Anton Kovalevsky. Работаем с несколькими типами сообщений в топике, десереализуя в разные case-классы, и добиваемся идемпотентности при at-least-once семантике.
Comparing case class instances using DiffX — вы никогда не слышали о библиотеке diffx, которая помогает гибко настроить сравнение экземпляров нетривиальных case-классов? Эта статья для вас! Простые и наглядные примеры прилагаются.
Web Scraping With Scala — первые шаги по information retrieval в туториале по веб-скрейпингу. Работаем с парсингом статических страниц при помощи Jsoup и Scala Scraper и динамических через Selenium.
Functional Programming anti-patterns in Scala — напоминание о том, что не стоит забывать использовать IO.pure и IO.blocking, а также что в Scala мы умеем больше, чем просто проставлять примитивные типы.
Когда придет час Белого Хлада и Волчьей Пурги, не ешьте желтый снег.
Functional Data Modeling in Scala — выражение доменной области через алгебраические типы данных, попутно затрагивается тема smart constructors.
Demystifying Variance magic in Scala — озадачивают странные плюсики и минусики и знаки сравнения в квадратных скобках? Просто, наглядно и понятно про (in/co/contra)-вариантность.
Typeclassery — A sure way of making generic programs context aware — о видах полиморфизма и о том, как достичь ad-hoc полиморфизма с помощью паттерна тайп-классов. Тут же небольшое обсуждение понятия алгебр и их связи с этим подходом.
Experimenting with actors in ZIO — большая статья с рефлексией о написании игрушечной акторной модели на базе zio. Не стоит воспринимать как hands-on туториал по проектированию собственной библиотеки: автор честно сознается, что до этой статьи с акторами не работал и Scala в энтерпрайзе не использовал. Но стоит отдать должное кропотливой работе и анализу результатов.
Pragmatic DDD in Scala with ZIO — «Я учил DDD на протяжении 10 лет и понял, что делал это неправильно». Denis Mikhailov — о правильном подходе к DDD в контексте функционального программирования и экосистемы zio. Пока написаны только первые главы, но анонсированные темы внушают оптимизм.
Useful Automation Tools for Scala Development — мастхэв-набор автоматизации рутины в проекте для новичка.
Revisiting Scala Native performance — бенчмарки сравнения Scala Native, Open JDK и Graal Native Image. Понравилось подробное описание подготовки среды запуска и наличие конфигурации локальной машины, на которой совершались прогоны. Интересно читать про подводные камни, с которыми столкнулись при разворачивании среды тестирования для Graal Native Image.
Why use Scala for building backend applications? — продаем Scala с его экосистемой бизнесу.
Статьи по Scala 3
Enum serialization in Scala — женим enum’ы из Scala 3 с circe, руководство к действию. Смотри сюда вместо stackoverflow (>ᴗ•)
Видео и доклады
Свежая подборка как известных, так и на ноунейм-каналов и видео про Scala:
Compile-Time Time! — Data Transmogrification Macro From Scratch. Kit Langton радует livecoding-сессиями по созданию своего аналога chimney и ducktape. Scala 3 и куча макросов, все как мы любим! К слову, множество выпусков о метапрограммировании не прошли даром — Кит анонсировал гримуар-руководство по этой черной магии. Первые главы доступны на macros.scala.school.
Rock the JVM. Type-Level Programming in Scala: A Hardcore Tic-Tac-Toe — адепты TypeScript бросили вызов системе типов в Scala, на что Daniel Ciocîrlan не устоял и ответил крестиками-ноликами, вычисляемыми в compile-time без макросов. Концептуально подход к реализации схож с серией Type-Level Programming in Scala. Кодируем конфигурацию поля на уровне типов и валидируем ее: если код компилируется — один из игроков выиграл, иначе нет. Вся магия работает с помощью механизма подстановки имплиситов.
10+ Scala Concepts you Need to Know — когда объясняешь
маме значения слов краш, флекс, кринжвесь technobabble функционального языка, или 16 минут комплиментов Scala.Ziverge — заключительные записи докладов с конференции Functional Scala. Один из последних рассказов — битва могучего ZIO против нового JDK, в качестве судьи — сам John A De Goes. Фабрика Zymposium все так же поставляет любопытные выпуски о Scala-инжиниринге: работаем с OpenAI и ChatGPT, клепаем свою magnolia с mirror’ами и compile-time операциями.
Lagom Framework in Scala Series — многосерийный туториал по разработке с нуля проекта на lagom, фреймворке для построения реактивной архитектуры сервисов. Сам фреймворк — хитрое переплетение play framework, akka и guice. Советуем заглянуть, так как помимо документации материалов по lagom не так уж и много.
Highlights
В этом блоке не всегда свежие, но зацепившие нас ресурсы под флагом «очумелые ручки». Авторы творят что-то интересное, необычное, но не обязательно полезное:
airframe — огромная, но тем не менее не самая известная экосистема.
Содержит модули на все случаи жизни:
airframe-di — dependency-injection библиотека, схожая с distage;
airframe-rpc — абстрагированный от REST фреймворк для клиент-серверной связи с поддержкой Scala.js для frontend кода. Из фичей: поддержка HTTP/1 (finagle), HTTP/2 с имплементацией GRPC и генерация OpenAPI документации;
airframe-http — если все-таки без REST никуда, то здесь же доступен finagle-based веб-сервер;
airframe-rx — модуль для реактивного программирования. Примеры сценариев использования: рендер DOM-объектов и стриминг с помощью GRPC;
airspec — куда же без своего фреймворка для тестирования! Мотивацию создания можно глянуть здесь. Работа с ресурсами, nested тесткейсы, поддержка асинхронности с Future и мокирование зависимостей.
Помимо библиотек в этой экосистеме есть решения для работы с метриками, логами, файлами конфигурации и мониторингом. А еще утилиты всех сортов и расцветок: своя рефлексия, мокирование и рекординг http-запросов, менеджер Off-Heap и так далее.
Tasty-query SQL — утилита для анализа TASTy-файлов через базу H2 и язык запросов SQL. Смотреть код в редакторе? — No. Смотреть код через запросы в базу данных? — Yeah ▓▒░(°◡°)░▒▓
quotidian — в Scala 3 нет автоматической генерации typeclass ToExpr и FromExpr, но Kit Langton спешит на помощь со своей hand-made библиотекой.
Lightning Memory Database (LMDB) for ZIO — клиент embedded key-value базы данных LMDB для zio и Scala 3.
uPickle 3.0.0 и FastParse 3.0.0 — широкоизвестный lihaoyi зарелизил мажорные версии библиотек для сереализации/десереализации json и парсинга текста с поддержкой Scala 3.
sbt-nosbt — sbt files as a Scala code ヾ(  ̄O ̄)ツ
scautable — генерилка html-страниц с таблицами из кода.
Tooling
Кусочек дайджеста, где мы рассказываем о новых и улучшении уже существующих инструментов для разработки:
sbt 2.0 ideas — make sbt simple again или Eugene Yokota продолжает совершенствовать инструмент sbt. Основанная на его работах о sudori, в Maven Central уже доступна тестовая версия 2.0.0-alpha7. Разработка и брейншторминг идей все еще в процессе как на уровне обсуждений в Tooling Summit, так и на уровне комьюнити. Присоединяйтесь („• ֊ •„)
Кстати, по ссылкам RFC-1, RFC-2 и RFC-3 отдельные мысли на тему кешей, организации процесса обсуждения RFC и удаления кастомных осей конфигурации.
Kubernetes and the JVM — рассказ от команды Xebia о том, как подружить k8s и JVM так, чтобы не словить java.lang.OutOfMemoryError на тернистом пути в облако. Немного теории о requests/limits в kubernetes, а также как с ними связаны регионы памяти и флаги их настройки в JVM.
Exploring Scala CLI – the new scala runner — о том, что такое scala-cli, какая невиданная мощь кроется в этом инструменте и почему заменяет scala-repl, берет на себя часть функций sbt, scalafmt и так далее.
A solid checklist for configuring new Scala projects — вы написали HelloWorld.scala, а что дальше? Ловите полезный starter-pack конфигураций вашего проекта для первого коммита.
Nix Home Manager Tutorial — DevInsideYou продолжает рассказывать об экосистеме Nix. В этой части пошаговая иллюстрация установки Nix Home Manager с указанием возможных проблем и подводных камней.
Комьюнити-движ
Раздел курьезных и любопытных событий в мире scala-общества, и мы хотели бы видеть его объемным и живым. Если что-то пропустили или у вас есть предложения — ждем в комментариях:
Contribution Equals Impact — Towards a Responsible, Sustainable, and Resilient Open Source Ecosystem for Scala. Небольшой анонс серии интервью с активными держателями разных секторов Scala open-source. В конце — призыв поделиться своими историями успеха.
Lately 02 — Chris Kipp продолжает делиться личными переживаниями и ощущениями от прошедшего месяца. Пост больше личный и к Scala относится только часть о работе в Scala Center. Но написано душевно и почитать приятно.
Scala Center’s five-year impact report — воды много, но красиво.
До встречи через месяц! ♡\( ̄▽ ̄)/♡
Над дайджестом работали @Melkaya_150cm, @Ivoya, @tcarina. Ваши идеи, предложения, обратную связь с удовольствием ждем в комментариях! <( ̄︶ ̄)>