raw.githubusercontent.com Пользователь с github удалился и сборка сломалась. Исходный репозиторий не склонирован, похоже, нигде. Ну, как всегда. В итоге в archive.org получилось найти страницу проекта, посмотреть, кто его форкнул, и склонировать форк себе.
archive.org — офигенный проект. В Dockerfile одного проекта было прописано скачивание кое-чего с URL вида Со мной щас случилось неожиданное. Т.к. я на Хаскелях и Скалах так никогда и не писал ничего длиннее пятка строк, то меня, как и большинство остальных людей несколько смущало понятие "монада". Хотя и знал уже, что по сути это всего лишь умное название для некоего враппера. Но всегда оставалось ощущение, что там есть какой-то более сложный нюанс, т.к. про всякие джавовые 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)`
почитать.
Чувак пишет:
И приводит пример вычисления длины списка (см. скриншот)
Моя реакция: "А-ха-ха! Кто-то паттернматчинга не видел"
let rec length = function [] -> 0 | _::l -> 1 + length l
(пример на OCaml)
Решил тут немного про Пролог
Чувак пишет:
It is unlikely that shorter formalisms that are equally clear and expressive exist.
И приводит пример вычисления длины списка (см. скриншот)
Моя реакция: "А-ха-ха! Кто-то паттернматчинга не видел"
let rec length = function [] -> 0 | _::l -> 1 + length l
(пример на OCaml)
var n = 3;
n.toString()
но нельзя написать
3.toString()
на выходе будет ошибка "Invalid or unexpected token". скорее всего, парсер думает, что после "3" точка означает дробное число. имхо — кошмар
marketplace.visualstudio.com
raw.githubusercontent.com
github.com
Расширение для ВСкод/ВСкодиум, которое выделяет все вхождения текста/регулярки в документе маркером определённого цвета
великая вещь!
Функционал даже побогаче, чем у Style Token у Notepad++
raw.githubusercontent.com
github.com
Расширение для ВСкод/ВСкодиум, которое выделяет все вхождения текста/регулярки в документе маркером определённого цвета
великая вещь!
Функционал даже побогаче, чем у Style Token у Notepad++
Если двое из пятнадцати разработчиков, собравшихся вместе, пришли к согласию, то они образуют большинство.
Нынче juick.com Виталя не смог почитать откуда и для чего есть KotlinNullPointerException.
Спойлер: основной поставщик сего — когда твои/компилятора предположения о том как работает джава код, с которым ты взаимодействуешь из котлина, оказываются не верны. И на сим месте все сводиться к более строгой обработке платформенного типа.
<messageID>long</messageID>в ответе:
<Msid>string</Msid>горите, суки, горите!
Подходит время, когда fabric/crashlitics купленый гулом превратиться в тыкву и останется только firebase crashlitics на который надо мигрировать. И, святая дискета, насколько же у них всратая дашборда, сделанная без малейшего понимания для чего ее используют. Хотя казалось бы бери и скопируй с купленой тобой, раз уж ее нормально сделали .
Вот например последние релизы. В фабрике тебя встречала картинка как пользователи обновляются, сидящих на старых билдах становилось меньше, на новых больше, что и показывал график в динамике. Не так чтоб полезно, но сердце грело. Ну из полезного можно было прямо из этого экрана перейти на креши конкретной версии. В файбейзе просто версия последнего билда написана и сколько на нем юзеров сидит.
Или сам список крешей. У фабрика там был фильтр "top builds" он автоматом пихал туда до трех наиболее используемых пользователями версий. И тебе, кроме этого фильтра, довольно редко что-то было надо. Он обновлялся без твоего участия в зависимости от инфы с последних релизов и ты видел актуальную картину происходящего. Теперь же у тебя список версий включая все тестовые и предрелизые сборки — выбери нужные сам. Но ты можешь найти нужные версии где-нибудь, в файбейзе только последний билд указан и накостылить себе фильтр руками. Потом не забывать его обновлять.
Короче, гугл — верни стену...
cannot load such file —
If Lambda not found gem — check gems location in lambda function package. Version should correspond lambda runtime (2.5.0 at this moment), even minor version matter
.\vendor\bundle\ruby\2.5.0\
stackoverflow.com
Java 8 library desugaring in D8 and R8: ConcurrentHashMap (with bug fixes for Android 5.0)
developer.android.com
Прям линукс напоминает. Там тоже все фиксят примерно к тому моменту, когда все прекращают это использовать. На редите уже часто говорят что выкидывают сапорт ведра 5 из проектов)
Забавно, если бы переходил на него с джавы, то впечатления были бы совершенно другие) Но я переходил с котлина. И первое впечатление было, блин ну почему вы не могли взять и котлиновских фич потырить раз уж в своем гугле решили котлин-ферст и вот все это.
Я прям не ожидал такой бурной реакции организма, на отсутствие дата классов, не считал их главной фичей котлина, а как оказалось, прям зубы заскрипели от предчувствия, что опять надо херней страдать. Хотя дарт до екстеншинов почти дожил, может и до иммутабельных дата классов в доживет, для которых не надо километры кода писать.
По итогу: ко всему можно привыкнуть, но восторга не вызвало совершенно.
"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
гугл меня не понимает и советует дичь :(
и вот я узнаю, что ms слелали свой моноширный фонт с легатурами! надо пробовать! "Cascadia Code" github.com
эфериума, но эти васяны даже не позаботились проверить обуликованные примеры. Он не то что не компилируется, а просто набор криво распознанных файнридером букв с листка, где кто-то ручку расписывал.
Господи, пускай у них вечным руководителем будет заскучавшая синеволосая страпоннеса (и как гугл.опечатка подсказывает вместо последнего слова — "пострашнее")!
Самый популярный проект json-rpc 2.0, если верить инторнетику — из под Господи, пускай у них вечным руководителем будет заскучавшая синеволосая страпоннеса (и как гугл.опечатка подсказывает вместо последнего слова — "пострашнее")!
С другой стороны, нахер бы мне ее ориентация? А затем, что фотка в джипег-обработчике приходит всегда ландскейп. И это нестыдно. Коллективный стековерфлоу и прочия в один голос рассказывают, что это ничего, это нормально. Все так делают. Первый раз больно, а потом втянешься. Надо просто фотку повернуть. Только знай ориентацию и скажи куда.
Дали готовый джипег, но с гранатами не той системы, поворачивать надо.
Нет, я надеюсь, что это я таки кривожоп, а в чудесном мире натурального андроида все хорошо с ориентацией у всех.
В общем, оно не работает)) Только instant run иногда все же подтягивал изменения, то новая хрень стабильно не подтягивает их никогда. В общем, гугл как всегда, а полная перекомпеляция апк наше все. Из плюсов, отключать новую фичу не надо, она не добавляет к коду ничего и обычный билд не замедляет.