Вышли записи докладов с f(by), в том числе рассказ Jamie Thompson из Scala Center про TASTy: формат описания синтаксического дерева скалы с информацией о типах. Особенно радует обещанная благодаря нему совместимость 2.13.2 и грядущей 3.0. Это значит, что библиотеки, написанные под 2.13.2 смогут использоваться из третьей скалы и наоборот.
https://youtu.be/YQmVrUdx8TU
Остальные видео с конференции в плейлисте: https://www.youtube.com/playlist?list=PLpVeA1tdgfCBwyzQBKz52ZDnrZTHeuTLc
https://youtu.be/YQmVrUdx8TU
Остальные видео с конференции в плейлисте: https://www.youtube.com/playlist?list=PLpVeA1tdgfCBwyzQBKz52ZDnrZTHeuTLc
Наткнулся на достаточно странную библиотеку baker — это надстройка над Akka для высокоуровневого описания стриминговых операций.
Вместо того, чтобы руками работать со стримами или акторами, поднимаемся на следующий уровень абстракции, где описываем типы данных, событий и трансформаций. Потом конструируем граф, который можно запустить, а можно отрисовать в графвизе.
Апи получается в разы более простое (и ограниченное), чем у голой акки. А ещё библиотека вроде как умеет персистить состояние графа.
Мне непонятно, в какой ситуации я захочу такой фреймворк: для сложной стриминговой обработки обычно нужно больше контроля над происходящим, а для простых графов не нужны стримы.
А ещё там реализация трансформаций сопоставляется с их интерфейсами в рантайме по строковым айдишкам.
Вместо того, чтобы руками работать со стримами или акторами, поднимаемся на следующий уровень абстракции, где описываем типы данных, событий и трансформаций. Потом конструируем граф, который можно запустить, а можно отрисовать в графвизе.
Апи получается в разы более простое (и ограниченное), чем у голой акки. А ещё библиотека вроде как умеет персистить состояние графа.
Мне непонятно, в какой ситуации я захочу такой фреймворк: для сложной стриминговой обработки обычно нужно больше контроля над происходящим, а для простых графов не нужны стримы.
А ещё там реализация трансформаций сопоставляется с их интерфейсами в рантайме по строковым айдишкам.
Закинул свой первый PR в scalameta — библиотеку для парсинга и анализа Scala кода. Починил занимательный баг четырёхлетней давности.
В скале есть тип
и добавить в конец этого списка ещё один Unit
В этом коде круглые скобки будут означать вызов метода
Ещё один способ сконструировать список через инфиксную конкатенацию и Nil в конце. Тут круглые скобки — это значения типа
🤯🤯🤯
Тут круглые скобки — это значение типа
PR с фиксом: https://github.com/scalameta/scalameta/pull/1995/files
Потыкаться в AST: https://astexplorer.net/#/gist/c271ab0e59bdfa39fcb00b493ce517a5/2e367460bdad51d2879ad1336287fa1b89564816
Как компилятор парсит инфиксные применения с юнитами: https://github.com/scala/scala/pull/7684/files
В скале есть тип
Unit, использующийся как аналог void из Java или C. Но, в отличие от них, Unit — это полноценный тип, имеющий единственно возможное значение (). Соответственно, любознательный программист может спокойно сделать список юнитов:
@ val xs = List((), (), ())
xs: List[Unit] = List((), (), ())
и добавить в конец этого списка ещё один Unit
@ xs :+ ()
res1: List[Unit] = List((), (), (), ())
В этом коде круглые скобки будут означать вызов метода
:+ на списке xs. Потом компилятор «дорисует» уже Unit внутрь этих скобок. То есть если убрать синтаксический сахар, мы имеем xs.:+(()). А с точки зрения синтаксиса те скобки, которые написал программист — это никакой не Unit, а скобки списка аргументов. Пока всё ок — scalameta парсит код правильно, и в её AST имеется Term.ApplyInfix с пустым списком аргументов. Но давайте продолжим извращения:
@ () :: () :: Nil
res2: List[Unit] = List((), ())
Ещё один способ сконструировать список через инфиксную конкатенацию и Nil в конце. Тут круглые скобки — это значения типа
Unit, и scalameta всё ещё парсит их корректно. А теперь воспользуемся возможностями компилятора по полной:
@ xs == () :: Nil
res3: Boolean = false
🤯🤯🤯
Тут круглые скобки — это значение типа
Unit, которое склеивается в список, а потом сравнивается со списком юнитов в переменной xs. И на этом scalameta обламывалась: она пыталась распарсить скобки как список аргументов, но из-за этого ломался обход цепочки инфиксных операторов и вылетал эксепшн.PR с фиксом: https://github.com/scalameta/scalameta/pull/1995/files
Потыкаться в AST: https://astexplorer.net/#/gist/c271ab0e59bdfa39fcb00b493ce517a5/2e367460bdad51d2879ad1336287fa1b89564816
Как компилятор парсит инфиксные применения с юнитами: https://github.com/scala/scala/pull/7684/files
В диссертации Роя Филдинга про архитектуру сетевых приложений увидел забавное обозначение кешей символом $. А всё потому что cache созвучно с cash.
Сама диссертация интересна не только классификацией сетевых архитектур, но и первым описанием REST. А Рой Филдинг один их тех людей, которые спроектировали современный интернет.
https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
Сама диссертация интересна не только классификацией сетевых архитектур, но и первым описанием REST. А Рой Филдинг один их тех людей, которые спроектировали современный интернет.
https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
Forwarded from Scala bin
После порядком затянувшегося перерыва решил попробовать написать что-то и на английском языке.
Итогом стала статья на Medium про использование
Искренне надеюсь, что дебют получился успешным. Буду очень рад вашим комментариям.
Итогом стала статья на Medium про использование
Ordering в Scala. Примером стало, конечно же, любимое сообществом семейство кошачьих.Искренне надеюсь, что дебют получился успешным. Буду очень рад вашим комментариям.
Medium
Sorting in Scala — a cat shop example
While Java and Scala both inhabit the same JVM grounds, the latter has become known as a far more concise and expressive language due to…
В следующей версии cats не надо будет импортировать инстансы тайпклассов для типов из стандартной библиотеки!
Это изменение — огромный шаг для cats в направлении от библиотеки для ФП к «батарейкам» для стандартный библиотеки.
Сейчас, чтобы написать
А ещё нововведения Scala 3 в целом располагают к такому дизайну библиотек.
Лайкнуть PR Трэвиса Брауна можно здесь: https://github.com/typelevel/cats/pull/3043
Это изменение — огромный шаг для cats в направлении от библиотеки для ФП к «батарейкам» для стандартный библиотеки.
Сейчас, чтобы написать
@ List(Some(1), None, Some(3)).combineAll
res4: Option[Int] = Some(4)
надо либо импортировать вообще всю библиотеку в своё пространство имён через import cats.implicits._, либо написать 4 (!) совершенно неудобных импортаimport cats.syntax.foldable._что напрочь убивает выгоду от использования котов в этом месте. В следующей версии будет достаточно подтянуть только
import cats.instances.list._
import cats.instances.option._
import cats.instances.int._
import cats.syntax.foldable._ или просто import cats.syntax.all._, и это прекрасно.А ещё нововведения Scala 3 в целом располагают к такому дизайну библиотек.
Лайкнуть PR Трэвиса Брауна можно здесь: https://github.com/typelevel/cats/pull/3043
Ребята из Profunctor Optics запустили сервис публикации вакансий: profunctor.io / @profunctor_jobs
Надеюсь, он сможет постепенно заместить айтишные чаты с вакансиями в телеге, которые непременно скатываются в срачи и травлю рекрутеров
Надеюсь, он сможет постепенно заместить айтишные чаты с вакансиями в телеге, которые непременно скатываются в срачи и травлю рекрутеров
Есть в тайпскрипте библиотека, которая генерирует типизированную модельку конфига по самой конфигурации в JSON — https://github.com/tusharmath/node-config-ts
А скалисты с лицами лягушек описывают классы с моделью конфигов руками. Вот бы кто-нибудь сделал кодогенератор, который парсит HOCON и выдаёт кейсклассы с его моделью…🙄
Понятно, что на развесистых конфигурациях захочется самостоятельно описывать модели, но для простых сервисов с небольшой конфигурацией можно и нагенерить.
А скалисты с лицами лягушек описывают классы с моделью конфигов руками. Вот бы кто-нибудь сделал кодогенератор, который парсит HOCON и выдаёт кейсклассы с его моделью…🙄
Понятно, что на развесистых конфигурациях захочется самостоятельно описывать модели, но для простых сервисов с небольшой конфигурацией можно и нагенерить.
Олаф из скаламеты написал отличный пост про этикет в опенсорсе — https://geirsson.com/open-source.html
Особенно хочется отметить пункт про коллабораторов — Олаф не жадничает на мейнтейнерские права, поэтому в скаламетовских проектах автобусный фактор сведён к минимуму, и даже в небольших репозиториях всегда есть кому посмотреть пулл-реквест.
Пункт про вредность good first contribution тоже справедливый: обычно проектам нужны люди, решающие собственные проблемы, либо заинтересованные в долгосрочном вкладе. Такие люди привлекаются не лейблами на задачах. Ещё вспомнилась сиутация, когда я поставил «good first contribution» на задачу, человек отправил пулл-реквест с её решением (первый для него), а потом в ходе дискуссии с другими мейнтейнерами было решено его отклонить. В итоге у человека обломался его первый вклад, и больше от него ничего не было видно. Очень неприятный момент :с
А если кто-то всё-таки хочет поконтрибутить в самый популярный форматировщик кода на скале и не знает, с чего начать, пишите -> @poslegm. Есть много задач разной степени сложности :^)
Особенно хочется отметить пункт про коллабораторов — Олаф не жадничает на мейнтейнерские права, поэтому в скаламетовских проектах автобусный фактор сведён к минимуму, и даже в небольших репозиториях всегда есть кому посмотреть пулл-реквест.
Пункт про вредность good first contribution тоже справедливый: обычно проектам нужны люди, решающие собственные проблемы, либо заинтересованные в долгосрочном вкладе. Такие люди привлекаются не лейблами на задачах. Ещё вспомнилась сиутация, когда я поставил «good first contribution» на задачу, человек отправил пулл-реквест с её решением (первый для него), а потом в ходе дискуссии с другими мейнтейнерами было решено его отклонить. В итоге у человека обломался его первый вклад, и больше от него ничего не было видно. Очень неприятный момент :с
А если кто-то всё-таки хочет поконтрибутить в самый популярный форматировщик кода на скале и не знает, с чего начать, пишите -> @poslegm. Есть много задач разной степени сложности :^)
Geirsson
Dos and don'ts in open source
I remember how careful I was the first time I opened a GitHub pull request. I read, re-read and triple-checked every one my comments before posting. It felt scary publishing my thoughts online because I was afraid people would judge me or misinterpret me.
Forwarded from PONV Daily (λoλcat)
Очень удобный дебаггер для макросов, печатающий во время компиляции код, отформатированный scalafmt. Печатает только те раскрытия макросов, которые обернуты в
macrolizer.show {...}. Поддержка только скалы 2.13. ⬇️Совсем упустил из виду шикарное нововведение скалы 2.13.1: автоматическая конвертация обычных функций в частичные.
Пусть есть метод, принимающий частичную функцию:
Пример взят из презентации Dale про проблемы частичных функций в скале: https://dwijnand.github.io/talk-fix-partialfunction/, которую я выцепил сегодня в скалачате
Пусть есть метод, принимающий частичную функцию:
Try(42).recover {
case e: IllegalArgumentException => 1
case e: DatabaseError => 2
}
В прошлых версиях языка, даже если мы передаём в такой метод тотальную функцию, всё равно приходилось писать единственный case, который не несёт никакой смысловой нагрузки:Try(42).recover { case e => e.getMessage }
А после PR от Dale Wijnand можно писать гораздо проще:Try(42).recover(_.getMessage)Компилятор сам преобразует обычную лямбду
_.getMessage в частичную функцию с одним case.Пример взят из презентации Dale про проблемы частичных функций в скале: https://dwijnand.github.io/talk-fix-partialfunction/, которую я выцепил сегодня в скалачате
Forwarded from Scala bin
Из-за многочисленных перестановок долго не знал, сложится или нет, но буквально несколько дней назад всё окончательно утвердилось. В эту субботу буду выступать на онлайн-митапе с обзорной презентацией про Scala, ФП и почему это важно.
Презентация рассчитана в основном на незнакомую с вышеозначенными понятиями публику и ставит своей целью обозначить основные направления для самостоятельного знакомства и заинтересовать попробовать новый язык программирования.
Мероприятие будет проходить на английском языке в эту субботу, в 13:30 по Московскому времени. Принять участие можно, зарегистрировавшись по ссылке. (Меня клятвенно заверили, что, несмотря на надпись на сайте, "вместимость" мероприятия - 100 человек)
Презентация рассчитана в основном на незнакомую с вышеозначенными понятиями публику и ставит своей целью обозначить основные направления для самостоятельного знакомства и заинтересовать попробовать новый язык программирования.
Мероприятие будет проходить на английском языке в эту субботу, в 13:30 по Московскому времени. Принять участие можно, зарегистрировавшись по ссылке. (Меня клятвенно заверили, что, несмотря на надпись на сайте, "вместимость" мероприятия - 100 человек)
connpass
WebHack#32 A Gentle Introduction to Scala and FP (2020/04/25 19:30〜)
# WebHack Follow us on @WebHackMeetup for more valuable contents & earlier updates 👨🎓 In light of the uncertainty we all face in our daily lives as the situation with COVID-19 unfolds, the safety of all WebHack friends and our community is the top priority.…
В блоге разработчиков скалы вышел пост о сообщениях компилятора Scala 3 при не найденных имплиситах.
Компилятор будет не просто отображать понятное сообщение об ошибке с полной цепочкой поиска (наконец-то!), но и подсказывать импорт, который надо скопипастить, чтобы нужный имплисит появился в скоупе.
Будет круто, если у этой фичи появится поддержка на уровне IDE, которая будет сама дописывать все импорты.
https://www.scala-lang.org/blog/2020/05/05/scala-3-import-suggestions.html
Компилятор будет не просто отображать понятное сообщение об ошибке с полной цепочкой поиска (наконец-то!), но и подсказывать импорт, который надо скопипастить, чтобы нужный имплисит появился в скоупе.
Будет круто, если у этой фичи появится поддержка на уровне IDE, которая будет сама дописывать все импорты.
https://www.scala-lang.org/blog/2020/05/05/scala-3-import-suggestions.html
У компании Lunatech есть WIP курс на гитхабе по изучению возможностей Scala 3 путём пошагового обновления небольшого проекта на Scala 2. Одна фича — одно упражнение.
https://github.com/lunatech-labs/lunatech-scala-2-to-scala3-course
А ScalaCenter готовит подробный migration guide — https://github.com/scalacenter/scala-3-migration-guide
https://github.com/lunatech-labs/lunatech-scala-2-to-scala3-course
А ScalaCenter готовит подробный migration guide — https://github.com/scalacenter/scala-3-migration-guide
Forwarded from dd if=/dev/stuff of=/dev/tg
Интервью с Олегом Нижниковым о Scala, Haskell и многих других ФП-языках: https://www.youtube.com/watch?v=nII0ralSlRo
YouTube
СИЛА Функционального Программирования / Всё о Scala / Интервью со Scala Developer Олегом Нижниковым
Первый выпуск про функциональное программирование на канале! И не на примере забытого или редкого языка, а на примере Scala. В гостях разработчик из "Тинькофф Банк" и Scala Developer - Олег Нижников. Поговорили про команду разработки из 100 скалистов, про…
Забавный блогпост от SoftwareMill о том, как дефолтные настройки кафки ломают её гарантию сохранения порядка сообщений в одной партиции.
Вроде как все знают, что если нужен порядок, то надо ставить
https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2
Вроде как все знают, что если нужен порядок, то надо ставить
max.in.flight.requests.per.connection=1(или отключать ретраи продюсера). Но дефолтный конфиг, нарушающий одну из гарантий системы — это странно.
https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2
Forwarded from @yarosh_log
Список побочки у разных уровней изоляции транзакций MySQL InnoDB и PostgreSQL (oracle, mssql тоже есть)
https://github.com/ept/hermitage
https://github.com/ept/hermitage
GitHub
GitHub - ept/hermitage: What are the differences between the transaction isolation levels in databases? This is a suite of test…
What are the differences between the transaction isolation levels in databases? This is a suite of test cases which differentiate isolation levels. - ept/hermitage
Собрал материалы по инъекции зависимостей в скале c ZIO. ZLayer пока совсем свежая технология, поэтому систематических обучающих материалов по ней пока нет. Но уже набралось приличное количество руководств от разных авторов.
Документация
⚡ZLayer
⚡Use modules and layers
⚡Macros
Блогпосты
🛠Adam Warski — Managing dependencies using ZIO
🛠Pavels Sisojevs — From idea to product with ZLayer
🛠aappddeevv — zio layers and framework integration
🛠Tim Pigden — Example of ZLayers being used in combination
🛠Juliano Alves — ZIO + Http4s: a simple API client
Слайды к докладам
👨🎓Adam Fraser — Solving The Dependency Injection Problem With ZIO
👨🎓Pierangelo Cecchetto — Ray tracing with ZIO-ZLayer
Документация
⚡ZLayer
⚡Use modules and layers
⚡Macros
Блогпосты
🛠Adam Warski — Managing dependencies using ZIO
🛠Pavels Sisojevs — From idea to product with ZLayer
🛠aappddeevv — zio layers and framework integration
🛠Tim Pigden — Example of ZLayers being used in combination
🛠Juliano Alves — ZIO + Http4s: a simple API client
Слайды к докладам
👨🎓Adam Fraser — Solving The Dependency Injection Problem With ZIO
👨🎓Pierangelo Cecchetto — Ray tracing with ZIO-ZLayer