Lil Functor
795 subscribers
57 photos
1 file
183 links
Pure functional and composable channel

Чат: https://t.iss.one/+L-xb_m_4lnY3Y2Fi
Download Telegram
Бесконечно можно делать три вещи:

1. Смотреть, как горит огонь
2. Смотреть, как течёт вода
3. Обновлять проект на скалу 2.13
Я, конечно, всё понимаю, но это календарь в виме

Устанавливается как обычный плагин, и через него можно смотреть и создавать задачи в гугл-календаре🙃

https://github.com/itchyny/calendar.vim
В блоге Фигмы (это гугл-документы от мира графического дизайна) вышла отличная статья (https://clck.ru/JsUmz) о том, как они делали многопользовательский редактор макетов.

Там почти нет программистских подробностей, интересно скорее то, как они максимально упрощали решение очень сложной на первой взгляд задачи. Заявленный принцип «no more complex than necessary to get the job done» применялся и к технической реализации, и к продуктовым требованиям.

Ещё в статье есть про то, почему они не стали применять Operational Transformation и честный CRDT, как они реализовали многопользовательский undo-redo и совместное редактирование древовидных документов. Всё написано простым языком и с наглядной анимацией.

А вот ещё одна статья (https://clck.ru/JsUnC) из их блога про то, как они решали проблему совместного редактирования упорядоченных последовательностей.
This media is not supported in your browser
VIEW IN TELEGRAM
Тут один хороший человек сделал плагин для IDEA с набором инспекций кода на ZIO: github.com/hmemcpy/zio-intellij/

Настоятельно рекомендую установить его, если уже используете bleeding-edge технологии от Дегуза. Один подбор лучшего тайпалиаса для всех ваших дырок чего стоит!
Вручную писать тесты для сериализации наших моделек во всякие джсоны — долго, неприятно, и всем лень это делать. При этом баги из-за поломанной сериализации тяжело отлавливать, и обычно они всплывают очень поздно, уже на этапе интеграции с внешними апи.

Например, переименовали поле в классе, не зафиксировали старое название в коде с сериализацией, и отправили такой документ в сторонний сервис. В лучшем случае он вернёт ошибку, в худшем — будет молча проставлять дефолтное значение в старое поле. Или добавили в модель поле с конфиденциальной информацией, забыли подчистить его в кодеках, и слили наружу что-то лишнее.

А тут умные люди придумали golden testing — простенький паттерн, с которым тестировать сериализацию сильно проще.

Для каждой модельки, которую хотим протестировать, в ресурсах создаётся файл с эталонным выводом сериализации. При запуске тестов просто сверяется текущий вывод с эталонным. Создание и обновление эталонных файлов легко автоматизируется:

1. Перед запуском теста проверяем, есть ли файл. Если нет, создаём новый с текущим выхлопом сериализации. Ответственность программиста — проверить этот выхлоп глазами.
2. При незапланированном изменении выхлопа тест покраснеет.
3. При осознанном изменении удаляем из ресурсов старый эталонный файлик. При запуске тестов автоматически будет создан новый, а мы провалидируем корректность изменений при помощи git diff

Оригинальная статья про golden testing: https://ro-che.info/articles/2017-12-04-golden-tests
Либа для скалы: https://github.com/circe/circe-golden
И для хаскеля: https://github.com/feuerbach/tasty-golden
Подъехал очередной билд-тул для скалы: https://github.com/tindzk/seed

Вдохновлялись cargo, внутри используют ZIO. Для сборки проектов подключаются к bloop (это инструмент для инкрементальной компиляции скала-проектов с кешированием компиляции и прочими плюшками), зависимости выгружают с помощью coursier.

В итоге получилась очень тонкая надстройка для управления зависимостями и разбиением проекта на модули: остальную работу делают уже готовые кирпичики. Этот проект показателен тем, насколько просто сейчас сделать свой собственный билд-тул на скале (но зачем?).

Пожно поглазеть и продолжить сидеть на sbt
This media is not supported in your browser
VIEW IN TELEGRAM
Ещё одна мега-полезная функция в IDEA — это возможность в два клика поменять местами аргументы

1. Ставим курсор на запятую
2. Нажимаем alt+enter, чтобы вызвать меню с доступными действиями
3. Выбираем Flip ‘,’ (обычно выбрано по дефолту)
4. Нажимаем enter
Какое-то время назад я начал билдилить консольный клиент scalafmt в native-image Грааля. Всё было очень круто, бинарник стартовал мгновенно (как будто не на скале написан). Потом в скалафмт обновили версию языка, пару зависимостей, чуть-чуть поменяли код, и билды под Грааль сломались.

По его ошибкам было мало что понятно, как чинить, никто не знал. Ничего полезного на этот счёт, кроме таких же поломанных билдов в других проектах, найти не удалось. Так как билд нативного бинарника не является обязательным требованием ко всем версиям скалафмт, на него подзабили. А на днях вышел новый релиз Грааля, и проект опять начал билдиться. Но чувство, что шаг влево, шаг вправо, и твой кот перестанет собираться Граалем, никуда не делось.

1. Круто, что в Граале чинят баги
2. Круто, что у меня нет ни одного проекта, где билд под Грааль является обязательным условием
По твиттеру гуляет хештэг #ScalaThankYou, с которым разработчики благодарят друг друга за вклад в сообщество.

А Chris Birchall напарсил граф упоминаний, по которому можно отследить, кто получает больше респектов: https://raw.githubusercontent.com/cb372/scala-thank-you/master/scala-thank-you.svg?sanitize=true
Илья Бирман рассказал, как правильно произносить английские слова, часто использующиеся программистами. После просмотра стал ещё чаще ловить себя на колхозном произношении :с

https://youtu.be/jXJFuqHnF2Q
Одерски вмёрджил в дотти PR c явным указанием null на уровне типов

Теперь в третьей скале появится флаг компилятора -Yexplicit-nulls, который заставит все null описывать через объединение типов. Звучит сложновато, но на практике всё очень просто:

val x: String = null // no longer compiles

val x: String | Null = null // ok


При этом явная проверка на null «убирает» Null из типа переменной:

val x: String|Null = ???
if (x != null) {
// x has type String here
}


Это сделано не для описания опциональных значений: для них по-прежнему удобен Option. Мотивация к явным нуллам — повышение безопасности при взаимодействии с апи, уже отдающими нуллы.

PR: https://github.com/lampepfl/dotty/pull/7546
Описание: https://github.com/abeln/dotty/wiki/scala-with-explicit-nulls
Дизайн-док: https://gist.github.com/abeln/9f79774bac111d99b3ae2cb9016a33e6
Почти полгода пользуюсь макбуком, но до сих пор не смог привыкнуть к его родной раскладке. Наконец-то нашёл простой способ починить — https://github.com/epsimatic/mefodica-birmana. Близкая к PC русскоязычная раскладка, типографские символы с раскладки Бирмана и переключение по капс-локу из коробки (причём светодиод на капс-локе теперь означает, что активен русский язык)
Начинаем понедельник с определений терминов из ФП от Дегуза. Определения максимально понятные и без зауми.

Очень крутой фрагмент определения монадки:
«Monads represent the essence of imperative programming: do a first thing, and then do this second thing, which depends on the value computed by the first thing.»

https://degoes.net/articles/fp-glossary
Forwarded from Scala bin
Похоже, что новый год начинается с очередных синтаксических предложений [1, 2] от доктора Одерски, на этот раз в отношении extension методов в Dotty. Первое позволяет именам методов начинаться с точки, в то время как второе вводит новое ключевое слово extension (of) для определения таких методов взамен имеющемуся синтаксису с given.

До:
given listOps: [T](xs: List[T]) extended with {...}

После:
extension listOps of [T](xs: List[T]) with {...}


После значимой табуляции и изменений в синтаксисе присваивания (последние добавлены не были), данные изменения видятся гораздо менее спорными и, возможно, имеют реальные шансы в конечном итоге оказаться в Dotty.
Отличный монадный туториал:

https://www.chrisstucchio.com/blog/2013/write_some_fucking_code.html

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

А уже потом при желании и необходимости осознаёшь математический смысл монадок. И для большинства разработчиков нет необходимости в понимании не только теорката, но даже и того, как ZIO и фьючи реализованы в коде.
В ZIO очень круто сделаны ретраи

Из коробки есть стратегии повторений, покрывающие большинство потребностей, при этом комбинаторы отлично композируются и позволяют легко выстраивать стратегии на все случаи жизни.

Чтобы сказать ZIO «у меня есть функция, которая может зафейлиться, мне нужно в случае ошибки повторить её 5 раз с экспоненциально растущей задержкой, начиная с 1 секунды», достаточно написать

myComplicatedAction.retry(Schedule.recurs(5) && Schedule.exponential(1.second))


Очень удобно обрабатывать сетевые ошибки при взаимодействии со сторонними сервисами в случаях, когда circuit breaker излишен.

Вот только документации маловато, надеюсь, к 1.0 завезут
Ólafur Páll Geirsson из scalameta сделал новую библиотеку для юнит-тестов на скале. Называется MUnit, представляет из себя минималистичное апи поверх JUnit. Всё сделано на ассертах, с простейшими фикстурами и поддержкой асинхронных вычислений в тестах.

Проект неспроста делается под эгидой скаламеты: сообщения об ошибках выглядят гораздо лучше, чем в других библиотеках, благодаря красивым диффам и подсветке нужных строчек в стектрейсах.

Прямо сейчас тащить в зависимости рановато: мало комбинаторов, не идеальная интеграция с IDEA, ещё не завезли параллельное исполнение тестов. Но все проекты scalameta потихоньку переводятся на MUnit, так что шероховатости скоро допилят.

Очень понравилось, что с этой библиотекой в принципе не нужно разбираться. Просто берёшь и без задней мысли пишешь тесты. ScalaTest в этом плане проигрывает, потому что требует изучения DSL и подглядывания в документацию. Надеюсь, что MUnit через пару релизов сможет составить ему конкуренцию.

https://scalameta.org/munit/
Подумал, что serverless — плохой термин для интуитивного понимания технологии. Понятнее было бы слово serviceless, потому что сервер там вполне себе есть, а вот (микро)сервис как раз упраздняется.
Forwarded from Scala Nishtyaki Channel
Скала опросник от скала центра, велком заполнять для поддержания статистики https://airtable.com/shrDCOpnMP8iA6kOn
В джаву завезли нормальный http клиент! Только недавно узнал, что с 11 версии JDK можно наконец-то по человечески писать http запросы. В предыдущих версиях для простейшего запроса надо осуществить ряд совершенно нелицеприятных действий с максимально низкоуровневым апи.

Вроде и круто, но хороший клиент в стандартной либе полезен в первую очередь для написания библиотек без зависимостей. Только вот их не получится подключить к проектам на Java 8 😠

В итоге в приложениях этот клиент использовать резона особо нет, потому что под JVM уже написана куча сторонних клиентов на любой вкус, а в библиотеках всё равно придётся писать на старом апи ради совместимости со старой JDK.

https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html