RedUser
dev GitHub internet archive.org — офигенный проект. В Dockerfile одного проекта было прописано скачивание кое-чего с URL вида raw.githubusercontent.com Пользователь с github удалился и сборка сломалась. Исходный репозиторий не склонирован, похоже, нигде. Ну, как всегда. В итоге в archive.org получилось найти страницу проекта, посмотреть, кто его форкнул, и склонировать форк себе.
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
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)

k0st1x
dev сегодня узнал, что в JS можно написать
var n = 3;
n.toString()

но нельзя написать
3.toString()
на выходе будет ошибка "Invalid or unexpected token". скорее всего, парсер думает, что после "3" точка означает дробное число. имхо — кошмар
lex2d
dev Android Там с первого мая нас покинут jcenter c bintray. Оно в основном любимо было некоторыми либками для андроида, посему не думаю что сильно что-то затронет, но вроде какой-то опенсорс какие-то бинарники и архивы через бинтрей распространял, ибо помню что с него что-то качалось, но вот что — не помню.
jfrog.com
alex0b
books dev quotes Если двое из пятнадцати разработчиков, собравшихся вместе, пришли к согласию, то они образуют большинство.
alex0b
dev Пришлось вспомнить говноскилы: распарсить xml на php и нагенерить mysql-совместимого. Прости мне, ибо я нагавнокодил.
lex2d
dev juick_ppl Уровень экспертизы Виталика я оценил, еще когда не осилил найти где что-то в го коде имплементировано (оно емнип в соседнем файлике лежало) и на основание сего нашел язык крастноглазым.

Нынче juick.com Виталя не смог почитать откуда и для чего есть KotlinNullPointerException.

Спойлер: основной поставщик сего — когда твои/компилятора предположения о том как работает джава код, с которым ты взаимодействуешь из котлина, оказываются не верны. И на сим месте все сводиться к более строгой обработке платформенного типа.
lex2d
· Edited
dev Android Небольшой боянистый плач ярославны...

Подходит время, когда fabric/crashlitics купленый гулом превратиться в тыкву и останется только firebase crashlitics на который надо мигрировать. И, святая дискета, насколько же у них всратая дашборда, сделанная без малейшего понимания для чего ее используют. Хотя казалось бы бери и скопируй с купленой тобой, раз уж ее нормально сделали .

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

Или сам список крешей. У фабрика там был фильтр "top builds" он автоматом пихал туда до трех наиболее используемых пользователями версий. И тебе, кроме этого фильтра, довольно редко что-то было надо. Он обновлялся без твоего участия в зависимости от инфы с последних релизов и ты видел актуальную картину происходящего. Теперь же у тебя список версий включая все тестовые и предрелизые сборки — выбери нужные сам. Но ты можешь найти нужные версии где-нибудь, в файбейзе только последний билд указан и накостылить себе фильтр руками. Потом не забывать его обновлять.

Короче, гугл — верни стену...
alex0b
dev Android учусь делать google sign-in . Все почти ок, логинит. Только почему-то в onActivityResult приходит иной resultCode, не тот что я передавал. Хз чо за магия.
lex2d
dev Android Я тут весьма сомневался, но почитал доки и осталось подождать полгодика и подвезут фикс для ConcurrentHashMap из прошлого поста.
Java 8 library desugaring in D8 and R8: ConcurrentHashMap (with bug fixes for Android 5.0)
developer.android.com

Прям линукс напоминает. Там тоже все фиксят примерно к тому моменту, когда все прекращают это использовать. На редите уже часто говорят что выкидывают сапорт ведра 5 из проектов)
lex2d
DART dev kotlin Решил тут для разнообразия Flutter потыкать и для начала решил ознакомиться с dart.

Забавно, если бы переходил на него с джавы, то впечатления были бы совершенно другие) Но я переходил с котлина. И первое впечатление было, блин ну почему вы не могли взять и котлиновских фич потырить раз уж в своем гугле решили котлин-ферст и вот все это.

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

По итогу: ко всему можно привыкнуть, но восторга не вызвало совершенно.
lex2d
dev Android Люблю ведро за заботливо разложенные грабли

"Basically, Android's ConcurrentHashMap in API level 21 / 22 multithreaded put(), putIfAbsent(), putAll(), ... operations can fail to add a key/value pair if there are hash collisions on the added keys and the underlying datastructure needs to be resized at the time of the concurrent puts.

This is no wonder since Android API 21/22 uses the same CHM implementation that was used until OpenJDK 8 ea b120 (where the bug was fixed)."
issuetracker.google.com
k0st1x
dev ? Mac люди добрые, как узнать список загруженный библиотек (dyib?) у процесса под маком?
гугл меня не понимает и советует дичь :(
k0st1x
dev font на работе не так давно использую фонт при работе "Fira Code" с легатурами.
и вот я узнаю, что ms слелали свой моноширный фонт с легатурами! надо пробовать! "Cascadia Code" github.com
alex0b
ethereum мутанты dev GOlang Самый популярный проект json-rpc 2.0, если верить инторнетику — из под эфериума, но эти васяны даже не позаботились проверить обуликованные примеры. Он не то что не компилируется, а просто набор криво распознанных файнридером букв с листка, где кто-то ручку расписывал.
Господи, пускай у них вечным руководителем будет заскучавшая синеволосая страпоннеса (и как гугл.опечатка подсказывает вместо последнего слова — "пострашнее")!
alex0b
dev ЯДибил кикимер Android Нифига не понимаю, че за проблемы с ориентацией у камеры. Не гейфон вроде а все тудаже. Сурфейс таки перестраивается, а если спросить у камеры — что у нее, она всегда говорит что у нее торчит 0.
С другой стороны, нахер бы мне ее ориентация? А затем, что фотка в джипег-обработчике приходит всегда ландскейп. И это нестыдно. Коллективный стековерфлоу и прочия в один голос рассказывают, что это ничего, это нормально. Все так делают. Первый раз больно, а потом втянешься. Надо просто фотку повернуть. Только знай ориентацию и скажи куда.
Дали готовый джипег, но с гранатами не той системы, поворачивать надо.
Нет, я надеюсь, что это я таки кривожоп, а в чудесном мире натурального андроида все хорошо с ориентацией у всех.
lex2d
dev Android Потыкал в бете андроид студии apply changes, который заменит instant run. Тест был простой: небольшие изменения в лайаутах,, типа текста или отступов, чтоб посмотреть как быстро оно будет изменения ресурсов применять.

В общем, оно не работает)) Только instant run иногда все же подтягивал изменения, то новая хрень стабильно не подтягивает их никогда. В общем, гугл как всегда, а полная перекомпеляция апк наше все. Из плюсов, отключать новую фичу не надо, она не добавляет к коду ничего и обычный билд не замедляет.