Как стать автором
Обновить
8.55

Scala *

Мультипарадигмальный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Умные конструкторы для case классов

Время на прочтение6 мин
Количество просмотров2K

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

Есть несколько подходов, посредством которых мы можем помочь системе типов и языку в целом дать нам еще больше уверенности в коде, который мы проектируем.

Читать далее
Всего голосов 8: ↑7 и ↓1+6
Комментарии1

Scala: Авторизация. Защита API с помошью Bearer токена

Время на прочтение3 мин
Количество просмотров3.9K

В это пример я буду рассматривать только парсинг и валидацию токенов что уже пришли в мое API в Authorization хедере. Для генерации токенов, регистрации пользователей и прочего SSO есть много готовых решений которые легко установить или даже устанавливать не надо. Например, Auth0, Keyckloak, IdentityServer4. В пример е буду работать с Tapir который может использовать в качестве бекенда http4s, Akk HTTP, Netty, Finatra, Play, ZIO Http, Armeria. Я буду использовать Tapir + Http4s.

Читать далее
Всего голосов 4: ↑3 и ↓1+2
Комментарии0

О проверке захвата

Время на прочтение9 мин
Количество просмотров3.6K

Несколько дней назад мы увидели новую экспериментальную фичу под названием “проверка захвата” (capture checking), анонсированную в твите Мартина Одерски (Martin Odersky).

Эта фича является новой главой в десятилетней борьбе за добавление какой-либо формы системы эффектов в scala 3. Она имеет некоторое сходство с предложением линейных ограничений (linear constraints) для Haskell и временами жизни (lifetimes) Rust.

Читать далее
Всего голосов 7: ↑5 и ↓2+3
Комментарии2

Как обрабатывать объекты Avro с помощью датасетов Spark 3.2 & Scala 2.12

Время на прочтение8 мин
Количество просмотров2.2K

Привет!

В этом посте разберем, как обрабатывать объекты JVM, сгенерированные из схем Avro, в датасетах Spark. Вместе с этим рассмотрим, как организовать код при помощи шаблона функционального программирования "класс типов" (type class) на языке Scala.

Читать далее
Всего голосов 11: ↑11 и ↓0+11
Комментарии0

Истории

Пулы потоков

Время на прочтение3 мин
Количество просмотров6.2K

Потоки (thread) в приложении можно разделить на три категории:

1. Нагружающие процессор (CPU bound).

2. Блокирующие ввод-вывод (Blocking IO).

3. Неблокирующие ввод-вывод (Non-blocking IO).

У каждой из этих категорий своя оптимальная конфигурация и применение.

Читать далее
Всего голосов 11: ↑6 и ↓5+1
Комментарии0

DINS SCALA EVENING

Время на прочтение1 мин
Количество просмотров629

Андрей Обухов из DINS расскажет, что такое Software Transactional Memory. Ахтям Сакаев из компании «Метр квадратный» поделится, как исключить баги на этапе моделирования с использованием ADT. Участие бесплатное, но необходимо зарегистрироваться. Подробности под катом.

Читать далее
Всего голосов 7: ↑7 и ↓0+7
Комментарии0

«Выстрелить и забыть» в Cats Effect

Время на прочтение6 мин
Количество просмотров2.7K

Последнее время меня часто спрашивают о паттерне "fire-and-forget": как его применить в Cats Effect и какие потенциальные проблемы могут возникнуть. Поэтому я решил написать небольшой пост. Надеюсь, вам понравится!

Подробнее о Cats Effect и конкурентности читайте в моей книге Essential Effects.

Читать далее
Всего голосов 4: ↑3 и ↓1+2
Комментарии0

Стриминговые микросервисы с ZIO и Kafka

Время на прочтение8 мин
Количество просмотров5.9K

В Scalac мы ежедневно разрабатываем и внедряем распределенные приложения с высокой степенью параллелизма. Распределенные системы в настоящее время активно развиваются и не собираются в этом останавливаться. В архитектуре подобных систем, помимо Kubernetes, важное место занимает Apache Kafka.

Мы используем Apache Kafka как основу для асинхронного взаимодействия микросервисов. Простота масштабирования, устойчивость к потере и повреждению данных, репликация и легко достижимый параллелизм через консьюмер-группы (consumer groups) — вот только некоторые из причин, почему Kafka является одним из основных инструментов построения распределенных систем.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии1

Lightbend Cloudflow. Разработка конвейеров потоковой обработки данных

Время на прочтение10 мин
Количество просмотров2K

Lightbend Cloudflow - open-source фреймворк для построения конвейеров потоковой обработки данных, объединивший в себе тройку популярных сред: Akka, Flink и Spark.

Под катом: demo-проект и обзор фреймворка с точки зрения общей концепции и разработки.

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Higher-Kinded Data, или ещё один способ работать с сущностями базы данных (и не только)

Время на прочтение16 мин
Количество просмотров4.7K

image


Важный дисклеймер


Перед началом хочу позволить себе небольшой, но важный дисклеймер.


Я не стараюсь вам продать этот cпособ как панацею.
Я лишь хочу рассказать вам ещё один способ представлять данные и показать, как его можно использовать, на конкретном примере.
Как и все остальные подходы, этот имеет свои недостатки. И кое-где придётся приседать. С этими приседаниями мы встретимся довольно скоро.


«Не думайте, что я сейчас буду развивать эту концепцию, а затем разочаруюсь в ней. Такой драматургии не будет. Я изначально уже в ней разочарован.»
Роман Михайлов

Ещё хочется заметить, что далее все примеры кода будут приводиться на Haskell. Но в конце я покажу, как можно некоторые из них повторить на Scala.


Что такое HKD


Конечно, прежде, чем писать этот раздел, я полез в интернет, чтобы посмотреть, как этот термин определяют другие люди. Чёткого определения я не нашёл.
Грубо говоря, HKD — это то, что предоставляет возможность держать в одном типе данных сразу несколько представлений. Давайте посмотрим на примеры.

Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии3

Как нанять трех разработчиков Scala в штат за три месяца

Время на прочтение5 мин
Количество просмотров4.8K
Безработица, замена человека роботами, сокращения, невозможность найти стабильную и регулярно и хорошо оплачиваемую работу – о чем это они? Что за фантастика? Или эта статья родом из советского прошлого – о том, как тяжело жить при капитализме?

Сегодня ИТ-компании страдают от нехватки ИТ-специалистов, HR-ы придумывают все новые «плюшки» и организуют максимально дружелюбную и комфортную среду для работы ИТ-специалистов, разработчиков, DevOps-ов, аналитиков, которые диктуют правила рынку труда. Во всех соцсетях слышны стенания рекрутеров и HR-ов – где искать ИТ-специалистов, как их заманить на вакансию, а потом удержать и не повышать зарплату каждый квартал? Каждый ищет свои пути выполнения плана по найму. Расскажу про наш опыт – как мы решили вопрос с наймом Scala-разработчиков в 2020 году.

Началось все, когда мы поняли, что нанять трех Scala-разработчиков с рынка быстрее, чем за полгода, а в реальности и за все три квартала, мы не сможем. Поэтому решили пойти по пути «сделай сам» и задумались о внутреннем бесплатном курсе для студентов, а также для желающих переквалифицироваться в Scаla-разработчиков. Вы ведь тоже мечтаете стать Scаla-разработчиком? Нет??? Странно…


Читать дальше →
Всего голосов 13: ↑11 и ↓2+10
Комментарии5

Что может предложить Neovim разработчику на Scala?

Время на прочтение23 мин
Количество просмотров8.3K

image


В сообществе фанатов текстового редактора Neovim произошло знаменательное событие — вышла версия 0.5, в которой появилось большое количество нововведений:


  • встроенная поддержка языка Lua;
  • экспериментальная поддержка treesitter;
  • и, наконец, встроенный LSP клиент, позволяющий сделать из простого текстового редактора достойного соперника IDE!

Neovim — это модальный редактор, форк редактора Vim, который ставит своей целью улучшение пользовательского опыта при работе с Vim: «Neovim is built for users who want the good parts of Vim, and more».


Мне нравится Neovim своей гибкостью, благодаря которой его можно превратить в очень мощный инструмент редактирования не только текста, но и кода. Как scala-разработчику мне интересно испытать новый встроенный LSP клиент в применении к любимому языку программирования. В отличие от VSCode и даже Vim + CoC настройка LSP клиента в Neovim несколько более сложная, но при этом крайне гибкая. Данная статья — краткое руководство по настройке Neovim для работы со Scala и краткий обзор возможностей, которые дает связка Neovim + Metals.

Читать дальше →
Всего голосов 16: ↑15 и ↓1+18
Комментарии6

Refined типы в Scala

Время на прочтение4 мин
Количество просмотров5K

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

Читать далее
Всего голосов 16: ↑16 и ↓0+16
Комментарии33

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн

IntelliJ IDEA 2021.2

Время на прочтение9 мин
Количество просмотров15K

Привет, Хабр!

Вышел наш летний релиз — IntelliJ IDEA 2021.2! Обновление можно скачать с нашего сайта или в Toolbox App. Кроме того, можно обновиться из самой IDE или с помощью snap-пакета, если вы являетесь пользователем Ubuntu.

Читать далее
Всего голосов 16: ↑16 и ↓0+16
Комментарии36

Построение потоковой stateful обработки данных на Akka

Время на прочтение16 мин
Количество просмотров4K

В одном из исследовательских проектов нам с коллегами пришла идея совместить Akka Stream, Akka event sourcing (typed persistence) и Akka cluster sharding для реализации stateful stream processing. На мой взгляд, получилось достаточно интересное и лаконично решение, которым я бы и хотел с вами поделиться.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии2

Spark Structured Streaming graceful shutdown — Что в этом сложного и как это правильно делать?

Время на прочтение7 мин
Количество просмотров2.8K

И почему shutdown требует отдельной статьи, а не вызова метода stop

Ну начну с того, что за метод stop такой.

Из документации, существует 2 метода которые собственно отвечают за остановку Structured stream.
query.stop() // Остановить запрос(stream)query.awaitTermination() // заблокировать пока запрос(stream) не прекратиться по причине вызова stop() или ошибки

Уже только по наличие 2ух методов мы может догадаться что метод stop() асинхронный. Что лично меня навело на мысль, что ни какой проблемы нет и graceful shutdown иметься из коробки.

Но я притворюсь что я умный и читал документацию, а не выгребал ошибки в production. Из документация

Останавливает выполнение этого запроса если он активен. Вызов блокируется до того как прекратиться выполнение query execution threads или по timeout(время не не выйдет, время задается в конфигурации).

И вот тут опытный Java/Scala разработчик по идее должен был напрячься.

Какой то Thread, уж больно напоминающий java thread по названию, прекратиться по сигналу. Да и в добавок к этому еще один, дополнительный, метод который ждет завершения. Это же thread.interupt() скажите вы, и будете правы - так что ни про какой graceful вообще речь идти не может.

Что же делать?
Рейтинг0
Комментарии0

Java/Scala: самая лаконичная трехзвенная архитектура в моем моднейшем To-Do List

Время на прочтение6 мин
Количество просмотров7K

Когда-то давно, в 2015 году, я опубликовал на Хабре статью, если вкратце "Как я на коленке сделал свое 1С:Предприятие, с блек-джеком и шлюхами".

Но это была, во-первых, двухзвенка, а во-вторых, потребовала от меня столько лапшекода, что после кодирования я надолго погрузился в депрессию. Теперь е я готов представить вам вариант производственного процесса, который не отпугнет перебежчика с 1С на Java.

Читать далее
Всего голосов 2: ↑0 и ↓2-2
Комментарии3

Java/Scala программа, имитирующая анимацию капель дождя

Время на прочтение2 мин
Количество просмотров2.9K

Пригодна ли Java (Scala) и ее библиотеки для задач вывода 3D и анимации? Я попробовал это выяснить на примере библиотеки org.fxyz3d и хотел бы поделиться самой программой и выводам по итогам ее запуска.

Читать далее
Всего голосов 5: ↑2 и ↓3-1
Комментарии0

Инвариантный функтор в Scala Cats

Время на прочтение3 мин
Количество просмотров2.2K

Сегодня поговорим о еще одном функторе — инвариантном (Invariant Functor). Уже было несколько постов о ковариантных функторах (называемых просто "функторами") и контравариантных функторах. Если концепция ковариантных и контравариантных функторов вам понятна, то с инвариантным все будет просто — он сочетает в себе функциональность обоих вышеупомянутых функторов.

Как вы помните, с помощью функторов мы можем отображать один тип в другой с помощью функции f:

Читать далее
Всего голосов 8: ↑8 и ↓0+8
Комментарии1

Контравариантный функтор в Scala Cats

Время на прочтение4 мин
Количество просмотров2.3K

В этой статье мы поговорим о функторах. О функторах из библиотеки Cats, а не о классических функторах, которые мы все знаем и любим. Рассмотрим контравариантные функторы (Contravariant Functors), представленные в Cats в виде тайпкласса Contravariant.

Некоторые из вас, возможно, не знают, что классический функтор (Functor) с операцией map, который мы ежедневно используем в наших Scala Cats-проектах, на самом деле является ковариантным функтором (Covariant Functor). Также хочу отметить, что термин "Вариантность" (Variance) применительно к функторам не имеет ничего общего с различными видами вариативности, которые мы знаем, когда речь идет о типах и параметрическом полиморфизме.

Типичный функтор в терминах функционального программирования Scala представляет собой тайпкласс, оперирующий типами высших порядков (higher-kinded type), что оказывается весьма полезным, когда мы хотим абстрагироваться и обобщить наши API.

Для полноты картины, поскольку мы не будем говорить классических функторах, давайте посмотрим на простой пример:

Читать далее
Всего голосов 8: ↑8 и ↓0+8
Комментарии0