Сайт-напоминание разработчикам об ошибках округления чисел с плавающей точкой.
Просто таблица с результатами вычисления
Просто таблица с результатами вычисления
0.1 + 0.2 в разных языках программирования. И да, обычно получается не 0.3В новый год с новыми годными ссылочками:
* 12factor — манифест команды Heroku о разработке SaaS. Очень приятное чтиво в стиле Мартина Фаулера.
* Чеклист от Хекслета по хорошим инженерным практикам в софтварных компаниях —
https://guides.hexlet.io/check-list-of-engineering-practices/
* Интерактивное введение в матстат и теорию вероятности (очень красивое и очень интерактивное) — https://seeing-theory.brown.edu
* Очередная подборка хороших практик в программировании на Scala. Качественная, но явно не полная — https://nrinaudo.github.io/scala-best-practices/
#ссылки
* 12factor — манифест команды Heroku о разработке SaaS. Очень приятное чтиво в стиле Мартина Фаулера.
* Чеклист от Хекслета по хорошим инженерным практикам в софтварных компаниях —
https://guides.hexlet.io/check-list-of-engineering-practices/
* Интерактивное введение в матстат и теорию вероятности (очень красивое и очень интерактивное) — https://seeing-theory.brown.edu
* Очередная подборка хороших практик в программировании на Scala. Качественная, но явно не полная — https://nrinaudo.github.io/scala-best-practices/
#ссылки
Вышло видео недавнего доклада John A De Goes о том, как правильно программировать на скале.
Из интересного:
* Светоч сравнил джавистов со змием-искусителем, соблазнившем программистов писать громоздкие иерархии наследования
* Подметил старую истину о том, что «лучшие практики» в ООП пересказывают принципы функционального программирования
* Ни одна скала-конференция не обходится без доклада о полезности чистых тотальных функций и описания сайд-эффектов, как значений. К счастью, Дегуз посвятил этому несколько минут и перешёл к другим важным вещам: блокированию потоков, прерываниям, легковесным потокам, утечкам ресурсов. Представил проблемы из реальной практики программистов и предложил решения в духе ФП. Спасибо.
* Само собой, в примерах использовалась библиотека самого Джона. Но при этом они написаны так, что легко перекладываются на другие либы. Ещё раз спасибо, Джон!
Из интересного:
* Светоч сравнил джавистов со змием-искусителем, соблазнившем программистов писать громоздкие иерархии наследования
* Подметил старую истину о том, что «лучшие практики» в ООП пересказывают принципы функционального программирования
* Ни одна скала-конференция не обходится без доклада о полезности чистых тотальных функций и описания сайд-эффектов, как значений. К счастью, Дегуз посвятил этому несколько минут и перешёл к другим важным вещам: блокированию потоков, прерываниям, легковесным потокам, утечкам ресурсов. Представил проблемы из реальной практики программистов и предложил решения в духе ФП. Спасибо.
* Само собой, в примерах использовалась библиотека самого Джона. Но при этом они написаны так, что легко перекладываются на другие либы. Ещё раз спасибо, Джон!
YouTube
John A De Goes - ZIO: Next-Generation Effects in Scala
A year ago at ScalaIO, John A. De Goes revealed the design of the Scalaz 8 IO monad in an epic standoff between Cats Effect and Scalaz 8 IO that became known as the #ClashOfIOs. Now, one year later, the ecosystem has been forever altered, as the event inspired…
Написал маленькую заметку о том, как настроить отправку писем с обновлениями RSS-каналов себе на почту. Бесплатно, без смс и сторонних сервисов.
chugunkov.website
Отправка обновлений RSS на email своими руками
Гайд по настройке собственного rss-клиента, отправляющего новые статьи на почту
Только недавно обнаружил удобный способ объединить последние коммиты в гите.
После долгой работы в локальной ветке возникает последовательность коммитов вида:
Сплющивание делается элементарной командой
После долгой работы в локальной ветке возникает последовательность коммитов вида:
f6e1600 - фикс опечаткиВесь этот мусор хорошо бы сплющить в один коммит с вменяемым названием перед тем, как отправлять в общий репозиторий.
f5e6e43 - исправление компиляции
dade538 - исправление таймаута
2465e49 - форматирование
903f37d - реализована [название большой задачи]
Сплющивание делается элементарной командой
git reset --soft HEAD~X
X — количество мусорных коммитов. После этого делаем git commit и прописываем нормальное сообщение. Этот способ гораздо более удобный и идиоматичный, чем git rebase -i, который я использовал раньше.Решил поиграться с dotty (прототип Scala 3) и выразил монадные трансформеры через
Трансформеры на них выглядит классно, но боюсь, что в рантайме создаются лишние объекты из-за
Само собой, побенчмаркал сравнение с классической на данной момент реализацией через
Говнокод тут
opaque types. Это такие алиасы для типа, которые работают как алиасы только в скоупе своего определения, а в других местах компилятор воспринимает их как полноценный самостоятельный тип. А ещё поговаривают, что их завезут уже в 2.13!Трансформеры на них выглядит классно, но боюсь, что в рантайме создаются лишние объекты из-за
implicit class, не наследующего AnyVal.Само собой, побенчмаркал сравнение с классической на данной момент реализацией через
case class. EitherT c Try работает примерно на 15% быстрее классической реализации, а OptionT — на 30. Если использовать Future, то разницы практически нет. (мои замеры кривые и им нельзя доверять)Говнокод тут
Жирное обсуждение на реддите о том, что в Haskell удобнее, чем в Scala.
В тред ворвались мастодонты обоих сообществ: Edward Kmett и Sam Halliday со стороны Haskell и Alexandru Nedelcu с Wojtek Pituła на защите скалы 🍿
В тред ворвались мастодонты обоих сообществ: Edward Kmett и Sam Halliday со стороны Haskell и Alexandru Nedelcu с Wojtek Pituła на защите скалы 🍿
reddit
Ok, I'll bite. What does Haskell do better than Scala?
This is a *serious* question. Obviously, if people "ascend" to Haskell, there must be a good reason. I'd like you to tell me these reasons. What...
Написал в бложик про создание пакетов для Arch Linux, медленный запуск программ на скале и причём тут GraalVM.
TL;DR делать пакеты для арча весело и стильно, а вовсе не сложно
TL;DR делать пакеты для арча весело и стильно, а вовсе не сложно
chugunkov.website
Создание пакета для Arch Linux
Гайд по созданию пакета для Arch Linux на примере утилиты scalafmt
Бинго для доклада на конференции по ФП:
> pure functions
> immutable data structures
> avoid impurity
> aaaaaaand... it's composable!
> monad
> side effects
> state
> *показывает hello world в репле*
> pure functions
> immutable data structures
> avoid impurity
> aaaaaaand... it's composable!
> monad
> side effects
> state
> *показывает hello world в репле*
Только сейчас наткнулся на пакет errors для голанга, который добавляет в язык почти эксепшены. Только с маааааленьким нюансом: стэктрэйс составляет не рантайм языка, а программист. Элегантное решение!
Давно подслушал и недавно осмыслил простое, но полезное правило использования тайпклассов в Scala.
Допустим, вы пишите полиморфное хранилище ключ-значение и хотите иметь возможность получить все значения в отсортированном виде:
Благодаря гранулярности требований достигается универсальность интерфейса.
Допустим, вы пишите полиморфное хранилище ключ-значение и хотите иметь возможность получить все значения в отсортированном виде:
abstract class KeyValueStorage[T: Order] {
def get(id: String): T
def put(entity: T): Unit
def delete(id: String): Unit
def sorted(): List[T]
}
Для того, чтобы значения типа T могли быть отсортированы, на него накладывается требование Order. Но фактически это требование нужно для реализации только одного метода из четырёх — sorted. Поэтому его можно локализовать:trait KeyValueStorage[T] {
def get(id: String): T
def put(entity: T): Unit
def delete(id: String): Unit
def sorted()(implicit O: Order): List[T]
}
Теперь пользователи могут использовать реализации этого хранилища для объектов, которые нельзя сравнивать. Компилятор не позволит им вызвать метод sorted, но остальные методы будут доступны.Благодаря гранулярности требований достигается универсальность интерфейса.
Градация программистов здорового человека от Basecamp:
* до 2 лет опыта — Junior Programmer
* 2-5 лет — Programmer
* 5-8 лет — Senior Programmer
* 8-12 лет — Lead Programmer
* 12+ лет — Principal Programmer
И откуда-то со дна стучит СНГ-шное айти:
«Здравствуйте))) Нам очень понравилось ваше резюме на полгода опыта, хотим предложить вам позицию сеньор биг дата архитектора 💅👨🏻💻 в перспективной компании...»
«Team Lead в 19 лет: невероятная история программ...»
«С нуля до старшего разработчика за 21 день. Надо всего лишь...»
* до 2 лет опыта — Junior Programmer
* 2-5 лет — Programmer
* 5-8 лет — Senior Programmer
* 8-12 лет — Lead Programmer
* 12+ лет — Principal Programmer
И откуда-то со дна стучит СНГ-шное айти:
«Здравствуйте))) Нам очень понравилось ваше резюме на полгода опыта, хотим предложить вам позицию сеньор биг дата архитектора 💅👨🏻💻 в перспективной компании...»
«Team Lead в 19 лет: невероятная история программ...»
«С нуля до старшего разработчика за 21 день. Надо всего лишь...»
Раньше я думал, что меня сложно удивить, но тут человеку, отправившему pull request с исправлением опечатки, предлагается распечатать и подписать лицензионное соглашение.
При этом библиотека открытая и опубликована под лицензией Apache-2.0.
Само собой PR висит уже больше года, а опечатка как была в исходниках, так и осталась.
При этом библиотека открытая и опубликована под лицензией Apache-2.0.
Само собой PR висит уже больше года, а опечатка как была в исходниках, так и осталась.
Написал небольшой пост про то, как я переписал
TL;DR это действительно так работает, но бежать переписывать прод на циклы смысла нет
foreach на while в своей скала-либе и получил прирост производительности почти в два раза.TL;DR это действительно так работает, но бежать переписывать прод на циклы смысла нет
chugunkov.website
Микрооптимизация scala-phash
Оптимизация Scala кода с помощью замены map и foreach на циклы while
В интервью Кирилла Мокевнина с Романом Павлушко (бывший CTO Avito) услышал, что у них есть слак-бот, которому можно дать описание сервиса «голанг, два редиса, постгрес», и он автоматически создаст репозиторий с шаблоном проекта, докер образ, развернёт нужную инфраструктуру и позволит задеплоить это на прод в одно нажатие кнопки.
По этому поводу могу сказать только одно слово: ХОТЕТЬ
По этому поводу могу сказать только одно слово: ХОТЕТЬ
Отличная заметка от Daniel Spiewak про использование тред-пулов в jvm.
1. Если задачи грузят преимущественно CPU (например, распараллеленные числодробилки), брать пул с фиксированным количеством тредов. Тредов столько же, сколько и ядер в процессоре:
3. Для асинхронных операций брать
От себя добавлю, что поверх этих тред-пулов должно исполняться исключительно моднейшее ZIO с тремя дырками!
1. Если задачи грузят преимущественно CPU (например, распараллеленные числодробилки), брать пул с фиксированным количеством тредов. Тредов столько же, сколько и ядер в процессоре:
newFixedThreadPool(Runtime.getRuntime.availableProcessors)
2. Для блокирующего i/o нужен пул, который умеет плодить много потоков. cachedThreadPool с этим отлично справится.3. Для асинхронных операций брать
forkJoinPool и не забивать его никакими задачами, кроме, непосредственно управления исполнением программы.От себя добавлю, что поверх этих тред-пулов должно исполняться исключительно моднейшее ZIO с тремя дырками!
Gist
thread-pools.md
GitHub Gist: instantly share code, notes, and snippets.