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
Для того, чтобы убрать файл из индексации гита обычно используется .gitignore. Но есть ещё одна возможность скрыть файлы — .git/info/exclude. В отличие от .gitignore он не шарится вместе с остальным проектом, а хранится локально.

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

target/
project/target/

А в exclude то, что связано с моим личным окружением и не интересно никому, кроме меня:

.metals/
.bloop/
magic-script-with-benchmarks.sh
Чем прервать месячное затишье на канале? Конечно же, очередной драмой в скала-сообществе!

Позавчера без объявления войны Seth Tisue удалил из Scala Community Build несколько библиотек экосистемы scalaz (в том числе ZIO!).

Community Build — это прогон свежих версий компилятора на ключевых библиотеках для выявления наиболее критичных багов.

Официальная причина — несоответствие удалённых проектов CoC. Но на форуме контрибьюторов появилась более подробная аргументация:
1. scalaz уже не в тренде и никому не нужно
2. Мейнтейнеры этих проектов говорят слишком громко

Выглядит так, будто личная неприязнь к Дегузу покрывается CoC. Причём это делает основа разработчиков языка. К счастью, активная часть сообщества уже высказалась против.

Обилием плохо мотивированных скандалов скала больше напоминает рестлинг, чем язык программирования.
Недавняя попоболь от опенсорса заставила написать про проблематику версионирования маленьких библиотечек, которые наращиваются вокруг основной библиотеки и связывают её с другими инструментами (например, коннекторы json-либы к разным веб-фреймворкам).

Если вкратце, то, пожалуйста, никогда не пытайтесь держать версию сателлита равной версии основного проекта. Это прямая дорога к задержке релизов и праведному гневу пользователей.

Подробнее по ссылочке
Посмотреть, как смм Альфа-Банка позорится в прямом эфире, можно здесь

(Администрация канала не одобряет кибер-буллинг)
Для работы в командной строке я использую tmux — это очень удобный инструмент, который позволяет делить терминал на несколько окошек и создавать вкладки.

При взаимодействии с удалёнными серверами он бесценен, потому что сохраняет сессию при закрытии терминала. То есть я могу открыть текстовый редактор, что-то поделать, закрыть терминал, потом повторно подключиться по ssh и увидеть свой редактор в том же самом состоянии.

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

1. До этого при запуске не было сообщений, что такие-то опции deprecated
2. Релиз был минорный по семверу

Просто в один момент ИЗВИНИТЕ, ВАШ КОНФИГ БОЛЬШЕ НЕ ВАЛИДНЫЙ

Само собой на эту тему поднялся срачик, а я в полвторого ночи переписываю конфиг с лицом лягушки.

Пару лет назад, кстати, писал как заскриптовать создание терминалов в тмуксе.
Простая арифметика о том, что может пойти не так при ломающих изменениях в минорном релизе
Обнаружил библиотеку reftree, которая рисует красивые визуализации кейс-классов в скале. Кроме генерации обычных картинок с содержимым объектов, умеет делать анимации с переходами между состояниями.

Я для себя не нашёл применения, но может кому-нибудь будет полезно для презентаций/мануалов.
This media is not supported in your browser
VIEW IN TELEGRAM
На днях вышла новая версия Ammonite (это улучшенный REPL для скалы), и теперь он умеет делать автокомплит не только кода, но и подключения сторонних зависимостей!

Теперь не надо каждый раз лезть в репозиторий библиотеки, чтобы узнать, какая у неё последняя версия.

А ещё для него можно прописать файл ~/.ammonite/predef.sc с зависимостями и импортами, которые будут подключены при каждом запуске REPL.
Первый день на fpure:

«Функтор — это штука»

«Чем больше у человека PhD, тем хуже у него документация»
А я-то думал, что это просто чистые функции 😢
Forwarded from oleg_log (Oleg Kovalov)
Таки я дополз до гитхаба и собрал часть ответов. Не идеально, но есть начало. За ошибки и опечатки ответственности не несу, лол.

Надо будет немного цели интервью описать и чуть примеров докинуть (без наносекундной точноти ток).

Фил фри ту контрибют 🙌

https://github.com/cristaloleg/interview-manifesto
Тут Daniel Spiewak открыл PR с заменой основного тред-пула в котоэффектах с Fork Join на Fixed Size. В обсуждении пулл-реквеста, issue и гиттере идёт очень интересная дискуссия, из которой можно выцепить много информации о разных тред-пулах в jvm, их назначении, недостатках и краевых случаях.
Многие знают, что использование runtime reflection в jvm чревато ухудшением производительности.

Это происходит потому что, рефлексируя, виртуальная машина осмысляет весь говнокод, который засунул в неё программист. Постепенно приходит к мыслям вроде «а ведь я могла рассчитывать траектории полёта космических кораблей...». Фрустрация от обработки бесконечных CRUD-запросов приводит к депрессии и неминуемой потере трудоспособности.

Каждое использование TypeTag ставит под угрозу ментальное здоровье вашего рантайма.
Forwarded from Scala bin
Решил собрать в единый список найденные мной задачи и упражнения, непосредственно связанные со Scala (исключая совсем уж банальный HackerRank). Многие из них могут быть сформулированы и для других языков (верно и обратное), но намного удобнее, когда не нужно заниматься дополнительной интерпретацией.

1. https://www.scala-exercises.org - базовые упражнения в часто используемых Scala-библиотеках. Сравнительно простые, но помогут разобраться с их основными функциями и структурами данных.

2. https://olegpy.com/cats-effect-exercises - 2 задачи на параллельные и конкурентные эффекты от Олега Пыжкова. При необходимости можно воспользоваться подсказками, а "базу" задачи можно сразу запустить в scastie.

3. https://degoes.net/articles/zio-challenge - достаточно интересная задача от Джона Дегоуза на создание балансировщика нагрузки относительно процента наблюдаемых ошибок. В комментариях набралось немало решений, к которым можно обратиться за помощью.

4. https://scalapuzzlers.com - сайт, аналогичный оному для языка Java, с задачами вида "что будет, если написать вот так?". Естественно, разбираются сугубо краевые случаи, к каждому из которых прилагается подробное объяснение.

5. https://www.riddles.io - сайт с соревнованиями на написание ботов, принимающий решения на Scala. Примечательно, что в большинстве соревнований присутствуют непосредственные партии между ботами, для которых даже сделали приятную визуализацию.

6. https://aperiodic.net/phil/scala/s-99 - Scala-адаптация 99 алгоритмических задач для языка Prolog. Не для всех задач есть решение, а их сложность варьируется от нахождения последнего элемента в списке до создания кроссворда заданной формы.

7. https://exercism.io/tracks/scala - раздел, посвященный Scala, на сайте по изучению ЯП. Предлагается более 90 задач возрастающей сложности, причем каждое решение комментируется ментором-человеком. И, да, это бесплатно.

8. https://www.codewars.com - соревновательный сайт с задачами по программированию разной степени тяжести. Scala пока находится в стадии бета-тестирования, зато на Haskell можно решать задачи уже сейчас ;)

9. https://www.codetriage.com - по сути список issue в крупных репозиториях, среди которых присутствуют представители из Scala-экосистемы. Сами "проблемы" предполагается либо смотреть вручную, либо получать случайные в почтовой рассылке.
Сегодня вспомнил лучшее issue на гитхабе. Запоминаем боевые фразочки для код-ревью на работе!

(мы не одобряем кибербуллинг)
В работе с форками на гитхабе меня всегда раздражало вливание свежего мастера с оригинального проекта в свой форк.

В первый раз надо сделать

git remote add upstream git://github.com/USERNAME/REPONAME.git
git fetch upstream

Потом каждый раз вспоминать, что вместо git pull надо выполнить git pull upstream master... Который обязательно не сработает, потому что для вот именно этого проекта, с которым я сейчас работаю, пока ещё не указан upstream, так что goto 1

Иногда казалось, что проще снести старый форк и сделать новый вместо того, чтобы вспоминать команды.

А сегодня я обновил проект одной командой hub sync консольный утилиты hub от команды гитхаба, и всё просто заработало как надо 🙏
ВЫШЕЛ ВЫШЕЛ ВЫШЕЛ

Релиз Scala 2.13

Улучшенные коллекции, улучшенные Future, partial unification по дефолту, literal types и ещё куча вкусностей

Дружно тащим в прод!
Начал перетаскивать свои проектики на Scala 2.13 и сразу же обнаружил не самое приятное нововведение. Теперь в стандартной библиотеке есть по два инстанса Ordering для Double и Float, отличающихся отношением к NaN.

IeeeOrdering работает в соответствии со спецификацией IEEE, а TotalOrdering считает, что NaN больше всех остальных чисел (даже Double.PositiveInfinity).

При этом ни один из них не выбран по умолчанию. Поэтому больше нельзя написать просто List(1.0, 3.0, 2.0).sorted, надо обязательно указать, как именно будут сравниваться числа:

List(1.0, 3.0, 2.0).sorted(Ordering.Double.TotalOrdering)
// или
import Ordering.Double.TotalOrdering
List(1.0, 3.0, 2.0).sorted

Вот issue, с которого всё началось, а тут накодякана разница между ними. Как это объяснять тем, кто только начинает программировать на скале, я вообще без понятия 😔
Stephen Samuel, автор scrimage, elastic4s и ещё многих классных библиотек, сделал публичным свой список вопросов для собеседований скалистов. Он пока не завершён, но выглядит очень даже неплохо, можно растаскивать для своих собесов.

А ещё там есть файлик с заданием на system design.
Нашёл ещё один статический анализатор кода на скале — scapegoat.

Более популярный wartremover скорее ограничивает возможности языка (запрещает null, имплиситные преобразования и аргументы, и прочее). При этом он не даёт скомпилировать проект с нарушениями правил.

А scapegoat имеет больше встроенных инспекций, например:
- сравнение чисел с плавающей точкой через ==
- не идиоматичное или не эффективное использование методов коллекций
- использование contains с потенциально неверным типом аргумента и сравнение заведомо разных типов

При этом он автоматически не подвязывается к компиляции, а генерирует отчёт в html по команде.

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

Вот Илья Бирман написал заметку о том, как проверить строку на пустоту в php. Ему в комментариях накидали ещё семь (!) вариантов кода, из которых работает правильно только один. А всё потому что мы не знаем, какой тип на самом деле лежит в переменной и как он приведётся к строке. Например, любой массив превратится в строку "Array".