anton0xf
Java math dev fp tl:dr: Монада — это враппер с возможностью оперировать над завёрнутым значением. Если вы пишете на Java то уже наверняка знаете, что это. Никакой магии или скрытых смыслов.

Со мной щас случилось неожиданное. Т.к. я на Хаскелях и Скалах так никогда и не писал ничего длиннее пятка строк, то меня, как и большинство остальных людей несколько смущало понятие "монада". Хотя и знал уже, что по сути это всего лишь умное название для некоего враппера. Но всегда оставалось ощущение, что там есть какой-то более сложный нюанс, т.к. про всякие джавовые Optional и пр. обычно говорят "это близко, но не совсем оно", и добавляют с придыханием, что там есть ещё "монадические законы" и начинают разговор про Теорию Категорий, с которой у меня тоже как-то всё не складывается.
А тут на конфе в который раз зашла об этом речь, и я решил прикола для заглянуть в вику. Долистал до определения и всё понял!

java.util.Optional — это натурально монада. Как стримы и любой другой враппер, если к нему прицепить метод flatMap() с поведением, как у соответствующих методов Optional или Stream.

Раскрою на примере того самого Optional. Как пишут в вики монада `M` над типом `T` (пишут `M T`) — это тройка, состоящая из
1. конструктора типа (`M T`), т.е. например `Optional<T>`
2. конвертера `unit: T -> M T`. Напомню, что в стандартной математической нотации `f: X -> Y` — это функция из `X` в `Y`. Для моего примера это будет создание Optional из значения, т.е. в той же нотации: `Optional::<T>of : T -> Optional<T>`
3. и комбинатора `(>>=): (M T, T → M U) → M U`, т.е. функа, который употребляет монаду и другой функ, который из значения, в неё завернутого, делает другое значение, завёрнутое в эту же монаду, и применяет второе к содержимому первой. Т.е. в точности то, что делает Optional::flatMap, если понимать объект, у которого этот метод вызывается, как неявный первый аргумент. Точнее если у нас есть `x : Optional<T>` (переменная `x` типа `Optional<T>`), то `x::<U>flatMap : (T -> Optional<U>) -> Optional<U>` (или как пишут в javadoc: `Optional<U> flatMap​(Function<? super T,​? extends Optional<? extends U>> mapper)`), что отличается от сигнатуры в определении только тем, что `x` — это неявный параметр, поэтому его тип e у меня написан отдельно, но это исключительно синтаксическая особенность — в том же Python этот аргумент пишется в сигнатуре методов явно.

Ну а "законы" — это абсолютно тривиальные ожидаемые от врапера свойства:
+ `unit(x) >>= f <-> f(x)` — означает что flatMap() применяет свой аргумент с завёрнутому значению, а не делает что-то более хитрое: `Optional.of(x).flatMap(f) == f(x)`
+ `ma >>= unit <-> ma` — если есть переменная `x : Optional<T>`, то примерение `flatMap()` к `Optional::of` ничего не поменяет: `x.flatMap(Optional::of) == x`
+ `ma >>= λx → (f(x) >>= g) <-> (ma >>= f) >>= g` — некое правило ассоциативности применения `flatMap()`, т.е. если `x : Optional<T>`, и `f: T -> Optional<U>`, а `g: U -> Optional<V>`, то `x.flatMap(x -> f(x).flatMap(g)) == x.flatMap(f).flatMap(g)`
anton0xf
· Edited
Сейчас попалась (в твиторе) классная статья, всем рекомендую.
tl;dr: есть только один способ узнать, понятный ли код ты написал (или даже вы написали в паре или группе) — дать его кому-нибудь почитать.
Но из статьи можно узнать несколько больше полезного. Например про прикольное исследование на тему ментального искажения, присущего всем ораторам, писателям и пр.

Далее уже частично моё мнение, но кмк полностью в контексте статьи. Весьма желательно при этом не давать читателю никаких комментариев, кроме тех, которые написаны в коде и сообщениях к коммитам. Это нужно, чтобы у будущих читателей этого кода было столько же шансов разобраться, как и у читателя PR.
anton0xf
dev Prolog LOL ml Решил тут немного про Пролог почитать.
Чувак пишет:
It is unlikely that shorter formalisms that are equally clear and expressive exist.
И приводит пример вычисления длины списка (см. скриншот)

Моя реакция: "А-ха-ха! Кто-то паттернматчинга не видел"
let rec length = function [] -> 0 | _::l -> 1 + length l
(пример на OCaml)

anton0xf
идиоты butthurt IT Бесят регулярные вскукареки в айтишных обсуждениях в тему, что надо "концентрировать усилия" и "останавливаться на чём-то одном". Типа: "надо прекратить пилить много разных дистрибутивов Linux и довести до ума какой-то один" или "зачем они делают очередное экспериментальное ядро ОС/язык программирования/etc.? пусть лучше улучшают существующие!".
Мне кажется, что подобное предлагают люди, которые вообще не понимают, как работает open source (и социум в целом), какая у людей бывает мотивация и пр. На сколько же это тупо думать, что если есть две чем-то похожих разработки и одну из них как-то насильственно свернуть, то все её разработчики тут же бросятся работать над второй. А подобные ребята обычно предполагают в своих фантазиях что-то такое.
anton0xf
· Edited
markdown HTML blog Написал пост и опубликовал его в бложек — значит надо написать ещё один пост про то, как опубликовать пост в бложек!

Т.е. про то, как собрать из Markdown файла с постом HTML с подсветкой синтаксиса и пр.

TL;DR:
# install using pip
pip install -U markdown Pygments
# or (on Debian based)
sudo apt install python3-markdown python3-pygments

edit post.md
(echo '<style>';
pygmentize -S native -f html -a .codehilite;
echo '</style>';
markdown_py post.md -x codehilite -x fenced_code
) > post.html
anton0xf
math Coq Читаю Coq'Art. Доказал только что очередной (достаточно очевидный) факт, и внезапно захотелось поделиться и успехом (это было не очень просто), и мыслями на тему. А за одно решил обновить бложек на blogger. А чтобы не править по 10 раз для разных мест то тут просто оставлю ссылку. Поэтому под кат — это сюда
anton0xf
PDF Ubuntu Linux shell В который раз сталкиваюсь с тем, что в книжке (в pdf) нет встроенного оглавления, а оно нужно. Каждый раз в итоге я его собираю в закладках evince, а потом не знаю, как его перенести вместе с файлом или, ещё лучше, сделать из него настоящее оглавление. В этот раз я таки погуглил и узнал две вещи:
1. evince хранит закладки в метадате GVFS, откуда их можно сдампить в файл и принести куда надо (источник)
2. можно довольно легко добавить к pdf оглавление, если уже есть страницы и заголовки, с помощью pdftk

В итоге, за час-полтора ковыряния в гугле и шеле, собрал с помощью седа, awk, pdftk и такой то матери себе из кучи закладок няшное оглавление к книжке.

Как делал: gist.github.com

Не думаю, что это реюзабельно непосредственно, т.к. тут половина кода — это преобразование формата, в котором я называл букмарки. Типа было "145 — 11.5 Chapter", а надо было отрезать страницу и сделать из этого подзаголовок второго уровня.

Натолкнулся по дороге на два нюанса:
1. pdftk нет в репках Убунты, но есть snap
2. страницы в pdftk на 1 больше, чем во внутреннем представлении закладок evince

Ещё я так и не нашёл (хотя искал не долго), в каком конкретно формате хранится мета в GVFS (вроде похоже на YAML, но хз), и распарсил седом, как пришлось.

anton0xf
Linux Gentoo VPS ? Насоветуйте не слишком дорогую vps для личного пользования в свободной стране (где не банят интернеты), и, весьма желательно, с возможностью поставить кастомный дистр или выбрать генту. Конечно, ставить vpn должно быть можно.
anton0xf
math ? Хочу "mathematical logic done right", так сказать.
Посоветуйте, что бы такого почитать по математической логике с максимально последовательным изложением (не было зависимостей от того, что будет дальше) и минимальным бутстрапом от интуиции к формальным или формализуемым доказательствам и строгим определениям. Лучше по-русски, но по-английски тоже можно.
А то порекомендовали почитать для начала это, а там изложение начинается с наивного (канторовского) определения множества (которое, и не определение вовсе), и на его основе определяются бинарные отношения, функции и их свойств, а второе же упражнение в книге (после описанных выше 3х страниц текста): "образуют ли бинарные отношения на множестве А группу относительно операций композиции и взятия обратного?", что, имхо, не дело. Мало того, что понятие "группа" не определено (ну да и чёрт бы с ним), так не описано ни как правильно строить рассуждения, ни что такое множество и пр..
У меня пока нагуглились только монографии Клини, Чёрча и Гильберта + книга Хаскелла Карри (того самого, да) 1969го года издания (в ужасном качестве и без возможности купить бумажную).
anton0xf
code Linux nya shell less
СЯУ, что так можно и что я всегда такое хотел: [подсветка синтаксиса всякой фигни при просмотре в less][https://www.gnu.org/software/src-highlite/source-highlight.html#Using-source_002dhighlight-with-less]. 

Правда оно как-то не очень хочет работать совместно с lesspipe, так что я пока так сделал (вместо рекомендованного способа):
> alias hi='src-hilite-lesspipe.sh'
> lesshi() {
>    src-hilite-lesspipe.sh "$@" | less
> }

Там ещё есть вариант его в ~/.lessfilter прописать (его вызывает lesspipe), но что-то оно сходу не завелось.
anton0xf
web music WAT?! Роися shit Решил в кои-то веки заглянут на last.fm, а там какая-то бета, всё тормозит и нифига не работает.
Стал разбираться, что именно не работает — оказалось, что не грузится от слова нифига (долго пытается загрузиться, пока не отвалится по таймауту) ни одна ссылка со схемой https, а остальное работает. Зашёл через тор — всё ок.
Это провайдер так хреново пытается подменить сертификаты, что просто всё сломал, или где?
anton0xf
bug Juick В вебне при клике по надписи "Ответить" под любым комментарием к любому посту перебрасывает к самому посту и больше ничего не происходит
anton0xf
dev habr HR задачки programming Чувак на хабре жалуется, что ему дали на собеседовании трудную задачу и заставили её писать в блокноте, и он не смог в итоге её решить за полчаса.
Из его претензий я согласен только с тем, что невозможность запускать свой код в процессе — это отстой. А вот не знать, что такое поиск в ширину, это уже явный фейл. К тому же его окончательное решение, полученное, как я понял, через пару дней, какое-то излишне многословное.
Я вот решил эту задачку, не смотря на его "решения", за 15 минут. Из них 5 ушло на заполнение дерева и минимальную визуализацию, 8 на написание функции, решающей задачу, и 2 на запуск и исправление единственной ошибки (в процессе написания я решил переименовать одну из локальных переменных, и не везде поменял её название).

Не думаю, что я особенно умный, или что быстро решил задачу (меня от части оправдывает только то, что я js практически не умею). Но, судя по голосованию внизу статьи, большинство читателей согласны с тем, что это либо слишком сложная задача (и на практике такие задачи не встречаются), либо не проверяющая сообразительность кандидата. И вот это, имхо, уже бред.
anton0xf
Bluetooth Linux Gentoo ? /me стал счастливым обладателем
радиоушей
На одном компе у меня пульса и всё завелось по инструкции (с bluez 5).
А вот на втором стоит альса (с apulse для скайпа). // я собирался и на первом пульсу выпилить
А в bluez 5 выпилили поддержку альсы.
Соответственно возникает ряд вопросов:
1. нахуя они выпилили эту самую поддержку?
2. как скоро сдохнет и поддерживается ли вообще bluez 4?
3. юзать вариант с alsa + bluez 4 или ставить сраную пульсу? другие варианты?
(http://point.im/vybaq)
anton0xf
Google ! Ы Открываю значит новую вкладку в хромиуме и вижу праздничный гугл-дудл с тортиками.
Решил проверить, что за празник — оказалось это они меня с ДР поздравляют.