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
Вроде и круто, но хороший клиент в стандартной либе полезен в первую очередь для написания библиотек без зависимостей. Только вот их не получится подключить к проектам на Java 8 😠
В итоге в приложениях этот клиент использовать резона особо нет, потому что под JVM уже написана куча сторонних клиентов на любой вкус, а в библиотеках всё равно придётся писать на старом апи ради совместимости со старой JDK.
https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html
Блогпост про самые значимые улучшения Scala-тулинга в 2019 https://geirsson.com/2019.html
Прошлый год вообще был очень продуктивным в части развития инструментов вокруг скалы: IDEA, coursier, sbt, metals, Scala Steward стали работать гораздо лучше. Из поста примечателен Polynote — аналог Jupyter Notebook для скалы от Нетфликса.
Прошлый год вообще был очень продуктивным в части развития инструментов вокруг скалы: IDEA, coursier, sbt, metals, Scala Steward стали работать гораздо лучше. Из поста примечателен Polynote — аналог Jupyter Notebook для скалы от Нетфликса.
Приятно видеть, что в Котлине исправлены старые ошибки Скалы. Например, тайпалиасы:
Ещё из-за того, что слово
И да, есть ещё type members, но это другое. И то, что для них используется то же ключевое слово, что и для тайпалиасов, точно не делает язык проще.
// kotlinВроде бы просто именование ключевого слова, но благодаря нему сразу понятно, что создаётся не новый полноценный тип, который будет проверяться компилятором, а просто альтернативное название для уже существующего.
typealias UserId = String
// Scala
type UserId = String
Ещё из-за того, что слово
type в Скале уже занято, полноценные ньютайпы пришлось назвать opaque type. В результате у более полезной сущности будет сложное название из двух слов.И да, есть ещё type members, но это другое. И то, что для них используется то же ключевое слово, что и для тайпалиасов, точно не делает язык проще.
Forwarded from dd if=/dev/stuff of=/dev/tg
https://scalacenter.github.io/scala-developer-survey-2019 — результаты опроса от Scala Center за 2019 год подъехали.
Интересно, что Metals показал достаточно высокий процент использования! Это только укрепляет мою точку зрения, что за LSP будущее.
Интересно, что Metals показал достаточно высокий процент использования! Это только укрепляет мою точку зрения, что за LSP будущее.
Вышли записи докладов с 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