Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Позднее Ctrl + ↑

Конец ускоренной strlen на «Флиппере»

В итоге, эпопея с ускорением функции замера длины строки в кодировке UTF-8 на «Флиппере Зеро» подошла к концу — коммит не взяли.

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

Тем не менее, я с удовольствием повозился инструкциями SIMD. До этого мини-проекта у меня было теоретическое понимание о том, что это за функции, но на практике я их не использовал.

Моя функция, кстати, претерпела некоторые изменения:

size_t furi_string_utf8_length(FuriString* str) {
    size_t len = string_size(str->string);
    const char * cstr = string_get_cstr(str->string);
    const char* end = cstr + len;

    if(len >= sizeof(uint8x4_t)) {
        const char* vend = end - sizeof(uint8x4_t);

        int8x4_t zero = 0x00000000;
        int8x4_t one = 0x01010101;
        int8x4_t threshold = -1077952577; // -65, -65, -65, -65

        do {
            int8x4_t vec = *(int8x4_t*)cstr;

            __ssub8(threshold, vec);
            uint8x4_t result = __sel(one, zero);

            len -= __usada8(result, zero, 0);

            cstr += sizeof(uint8x4_t);
        } while(cstr <= vend);
    }

    while(cstr < end) {
        signed char c = *cstr++;
        len -= c < -64;
    }

    return len;
}

Оказалось, что тип FuriString хранит в себе бинарную длину строки, поэтому я переделал код, чтобы он не пытался читать чужую память. В векторизованой части это было вероятно, но своих рассуждений и дискуссии по коммиту я сделал вывод, что в случае «Флиппера» это не имеет какого-либо значения.

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

В итоге, решая эту, возможно несуществующую, проблему, я опробовал на практике векторные инструкции расширений NEON и DSP SIMD, научился делать два параллельных запроса на вливание в «Гитхабе» и ещё раз вспомнил как компилировать и заливать свою прошивку во «Флиппер Зеро».

Опять голова болит

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

Головная боль вообще мой бич — иногда голова так болит, что не сплю несколько дней. Такое было несколько раз в жизни. К счастью не в этот раз.

К сожалению, врачи не нашли у меня ничего им понятного, такого что можно было бы исправить и эти боли прекратились бы. Она так меня достаёт, что одна из первых заметок на этом сайте была о головной боли.

Как же я устал.

М. Г.

Рассматривали тут с приятелем книгу с дореволюционными шрифтами, заметили непривычное сокращение — «М. Г.». Долго думали что это такое, потом меня осенило, что это «милостивый государь» или «милостивая государыня».

Вырезка из книги «Образцы шрифтовъ, линеекъ, украшеній, политипажей и примѣненій къ нимъ», типография В. В. Вараксина, Казань, 1911

Сгорели две GaN-зарядки

Какая-то напасть — одна за другой выгорели с громким хлопком две зарядки «Сяоми», сделанные по технологии GaN. Два года назад я рассказывал про них у себя в блоге.

Сгорели в момент включения с разницей всего в несколько дней. Вставлялись в две разные розетки, я их посмотрел потом тестером розеток — ничего необычного. Ничего не понимаю. Что это? Дефект партии (я их сразу две покупал)? Запланированное старение?

Одна из сгоревших GaN-зарядок

Собачий возраст

Сегодня были у мамы жены, повод печальный, но я не хочу об этом. У неё живёт лабрадор Челси, которой 16 лет. Я не раз уже слышал, что возраст собаки надо умножать на семь, чтобы получить эквивалентный человеческий возраст.

Мне всегда это казалось сомнительным, ведь очевидно, что хотя бы в начале и конце этой шкалы соответствия нет — половая зрелость у собак наступает в год или полтора, а шестнадцатилетний лабрадор не ведёт себя и не двигается так, как человек, которому за сто.

Погуглил и нашёл более точную форуму — надо взять натуральный логарифм от возраста собаки, умножить на 16 и прибавить 31. Таким образом, «человеческий» возраст Челси — 16 × ln(16) + 31 ≈ 75 лет. Это куда больше похоже на правду.

«Аватар: легенда об Аанге»

Недавно по приходе с работы застал дочку, прыгающую по дивану и выкрикивающую «Аппа, Аппа, йип-йип». Влияние школы — сверстники заинтересовали аниме-сериалом «Аватар: легенда об Аанге».

Дочка им очень увлеклась и вот уже какую неделю смотрит. Аппа — это магический летающий бизон, друг главного героя, а «йип-йип» — это, насколько я понял, команда «взлетай».

При этом больше всего она зафанатела почему-то крайне неоднозначным персонажем — принцем огня Зуко. Я не очень-то вникал, но кажется поначалу он был антогонистом, а потом присоединился к команде главного героя. Дочь сказала, что он «смешной и добрый».

Поскольку дочка очень любит изготавливать всё, что её впечатлило, Зуко тоже был немедленно воплощён — под него был загримирован и одет платонический друг какой-то куклы.

В кадр попала другая её поделка — кошелёк из кожи, к «Аватару…» он отношения не имеет, просто рядом лежал.

Не особо жажду смотреть оригинальный сериал, но планирую попробовать на вкус тематическую поделку от «Нетфликса». Фанаты её ругают, но я-то не фанат, может понравится. Фантазийный материал меня всегда очень радует, может и тут заинтересуюсь.

Это самодельный Зуко — один из действующих в сериале героев

Проблемы лысых

У обеих наших машин панорамная крыша — стекло, прикрытое шторкой. Жена любит ездить с открытой шторкой, так как стекло сверху даёт ощущение простора. Я это могу понять, мне самому нравится. Чего, надеюсь, никогда в полной мере не поймёт моя жена — почему в мороз иногда мне приходится ездить в шапке. Шторка дают дополнительную теплоизоляцию, без которой у меня мёрзнет голова — я её брею налысо уже много лет.

Отложенные сообщения

Для меня один из самых важных рабочих инструментов «Телеграма» — отложенные сообщения. Я крайне редко использую их в личной переписке, зато постоянно по работе.

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

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

Разумеется есть несколько более редких сценариев использования, просто эти два у меня возникают постоянно. Если вы не используете отложенные сообщения, но у вас в голове иногда мелькает мысль что-нибудь спросить у кого-то попозже, попробуйте перегрузить эту заботу из головы в «Телеграм».

IAndex.Music

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

За пять прошедших лет нейросети пока ещё не развились до такого уровня, но уже появилась возможность проверить мои рассуждения на практике. С момента появления сервиса «Моя волна» в «Яндекс.Музыке», я почти всю музыку слушаю там, совершенно не утруждая себя запоминанием исполнителей или отдельных композиций, которые в данный момент хорошо легли на моё настроение.

Одна из лучших покупок недавнего прошлого — наушники, которые всегда под рукой

Кажется я мало подвержен музыкальной ностальгии, поэтому если трек вернётся в следующий раз, — очень хорошо, не вернётся — ну послушаю что-нибудь новое, ничего не теряю.

Из-за этого паттерна мне совершенно нечем поддержать разговоры о музыке — я очень мало знаю о том, что я слушаю. Так что на вопрос что мне нравится на данный момент в музыке я, чаще всего, могу ответить только: «то, что мне подбирает „Яндекс.Музыка“».

Сделал PR с новой strlen во «Флиппер»

Спасибо Шурику Бабаеву за помощь, добавил свой коммит с векторизованной функцией для измерения длины строки в кодировке UTF-8 в кодовую базу прошивки «Флиппера».

Попутно выяснилось, что «Флиппер» использует функцию замера длины из библиотеки M*LIB. Можно было бы закоммитить новую версию в неё, но не стал этого делать по двум причинам.

Во-первых, моя версия заточена под конкретную платформу, а M*LIB, кажется, универсальная библиотека. Во-вторых, если бы мой коммит в неё и приняли, надо было бы ещё каким-то образом добиться обновления библиотеки в прошивке «Флиппера», а это, наверняка, непростая задача.

Кстати, сделал итоговые замеры. Миллион итераций с четырьмя короткими строками (от ЯБ12341 до ЯБ12341234) моя версия делает за шесть секунд, тогда как прежняя — за 39.

Ранее Ctrl + ↓