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

Позднее Ctrl + ↑

Песенный и разговорный языки

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

В общем, мне интересно это посмотреть, как раз потому что я ничего в этом не понимаю.

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

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

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

Какой же купить смартфон?

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

Главная претензия связана с тем, что «Хуавей» отлучили от сервисов Гугла. Из-за этого тут собственный магазин приложений, в котором, конечно, есть далеко не всё, что нужно. Некоторые приложения можно скачать просто из интернета, но ещё часть сильно интегрирована с сервисами Гугла, поэтому их приходится ставить очень особенным способом.

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

Плёнка на экране за год стала очень некрасиво отклеиваться, видимо надо менять

Второй набор претензий к самому устройству, — у меня раскладной Mate Xs 2. Несмотря на то, что это не первое поколение раскладных устройств, недостатков у него хватает — довольно компромиссная камера, временами неустойчивый приём, аккумулятора хватает только до вечера, иногда с натягом.

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

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

Пока фаворит по всем моим хотелкам — Oppo Find X7 Ultra. Стандартный магазин приложений, бомбические камеры, глобальная гарантия на весь мир, топовое железо. Хотя до сих пор продолжаю изучать рынок, всё больше склоняюсь к покупке именно этого устройства.

Любовь и химия

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

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

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

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

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

Возвращаясь к науке.

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

Дискета на 90 мм

Некоторое время назад я прочитал в «Википедии», что дискета на 3,5 дюйма на самом деле метрическая и её ширина — 90 миллиметров, а вовсе не 88,9 как должно было бы быть. Поскольку «Википедия» источник сомнительный, я решил это проверить — нашёл дома дискету и ещё одну купил. Замерил обе линейкой. Получилось примерно 88,9 миллиметров.

Многие засомневались в точности моей линейки, несколько читателей даже замерили свои дискеты штангенциркулем и все замеры совпали с тем, что написано в «Википедии» — получилось 90 миллиметров.

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

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

Заодно разобрал дискету и померил сам диск. Получилось что-то около 86,5 мм. Тоже не 3,5 дюйма.

Дискета 3,5 дюйма на самом деле метрическая — 90 миллиметров

Репер 1890 года

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

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

Репер на здании кафедры астрономии и космической геодезии

Небольшой отпуск

У меня тут небольшой отпуск — взял со среды неделю, чтобы посидеть в тишине. На Новогодних почилить не получилось — работа не позволила. А тут ещё и жена на защиту тренерского диплома по психологии в Москву улетела и, чтобы не мучаться проблемой того, кто будет забирать дочку из школы (её надо забирать раньше, чем я заканчиваю работу), решил убить двух зайцев одним махом.

Заставляю себя не думать о работе, но по инерции мысли всё равно туда скатываются. Ну хотя бы рабочие чаты удаётся не читать. А вот что не удаётся — это выспаться. Я, как уже много раз писал, — «сова», а поскольку дочку надо отправлять в школу (она ездит на школьном автобусе), вставать приходится в обычные 6:30 утра.

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

Замеры strlen_uft8 на «Флиппере Зеро»

Ну что же, я наконец сравнил свой вариант функции определения длины строки в кодировке UTF-8 с наивной реализацией и чужим быстрым вариантом.

Оказалось, что обычные функции замера времени под «Флиппером» не работают. мне не удалось получить значение текущего времени ни одним из способов к которым я привык на Си, поэтому опять пришлось читать исходники прошивки «Флиппера».

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

FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t start = furi_hal_rtc_datetime_to_timestamp(&curr_dt);

for (int i = 0; i<1000000; i++)
len += strlen_utf8("This is a test и русских букв тоже");

furi_hal_rtc_get_datetime(&curr_dt);
uint32_t stop = furi_hal_rtc_datetime_to_timestamp(&curr_dt);

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

Скриншот экрана «Флиппера», снятый через специальную программу; отображается суммарная длина и время работы — пять секунд

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

Энтекофобия

Наконец-то выбрался из потенциальной ямы лени — снова начал делать зарядку по утрам. Так как большинство упражнений я делаю на счёт, опять задумался о том, что мне как будто бы некомфортно считать больше десяти.

Например, если мне надо отсчитать четырнадцать повторов, я лучше разобью это число на десять и четыре, на два раза на семь или ещё как-нибудь, лишь бы не считать дальше десяти. Очень странная штука.

«Щенячья школа»

Интересно, что дочка частенько вдохновляется в своих поделках фильмами, которые мы смотрим. Если они ей нравятся, разумеется.

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

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

DSP SIMD для Flipper Zero

В этом версии нет никакой защиты цикла от чтения за границей буфера, мне показалось, что во «Флиппере» это неважно, но возможно это не так.

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

Сегодня описывать и замерять уже не буду, и так времени много ушло, но по крайней мере всё работает на настоящем «Флиппере».

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

#include <arm_acle.h>

size_t strlen_arm_utf8(char * str) {
    uint32_t len = 0;
    int8x4_t zero = 0x00000000;
    int8x4_t one  = 0x01010101;
    int8x4_t threshold = -1077952577; // -65, -65, -65, -65

    for (;;) {
        uint8x4_t result;
        int8x4_t vec = *(int8x4_t *) str;

        __uadd8(0xFFFFFFFF, vec); result = __sel(zero, one);
        if (result > 0) {
            if (result == 0x01000000) {
                __ssub8(threshold, vec); result = __sel(zero, one);
                return __usada8(result, 1, len);
            }
            break;
        }

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

        str += sizeof(uint8x4_t);
    }

    for (signed char c; (c = *str); str++) {
        if (c >= -64) {
            len++;
        }
    }    

    return len;
}
Ранее Ctrl + ↓