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

Позднее Ctrl + ↑

Пора выкинуть ёлку

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

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

Пихта под потолок занимает три больших пакета для мусора

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

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

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

 7 комментариев    211   5 дн  

AVIF в GD

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

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

Пока примотал реализацию на соплях, как концепт. Результаты, кстати, хорошие, можно посмотреть на скриншоте разницу:

Разница в размере файлов в двух форматах — JPEG и AVIF

Но пока мотал, наткнулся на прекрасное. 🤦🏻‍♂️

В ПХП есть несколько модулей для работы с картинками, но самых распространённых два — GD и Imagick. Я начал с GD, так как на виртуалке он собран с поддержкой AVIF (а Imagick — нет), по крайней мере сам модуль так утверждает:

var_dump(gd_info()['AVIF Support']); // true
var_dump(imagetypes() & IMG_AVIF); // 256

Так же существует функция imageavif, что хороший знак — модуль устроен так, что если поддержки какого-то формата нет, то функция просто отсутствует.

Но при попытке сконвертировать картинку из JPEG в AVIF создавался файл нулевой длины, хотя функция возвращала true:

var_dump(imageavif(imagecreatefromjpeg('0.jpg'), '0.jpg.avif')); // true

GD это очень старый модуль, он родился, когда в PHP главенствовал процедурный модуль, поэтому его суть — функции; в PHP, если мы вызываем функции и что-то идёт не так, мы можем узнать что именно при помощи функции error_get_last. Помогла она и на этот раз:

array(4) {
  ["type"]=>
  int(2)
  ["message"]=>
  string(50) "imageavif(): AVIF image support has been disabled
"
  ["file"]=>
  string(17) "Command line code"
  ["line"]=>
  int(1)
}

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

yum shell
> remove php-pecl-imagick-im6
> install php-pecl-imagick-im7
> install ImageMagick7-heic
> install libheif
> run

В этом модуле, кстати, проверка на поддержку AVIF делается вот таким немного неочевидным способом:

$isAVIFSupported = Imagick::queryformats("AVIF") !== [];
 Нет комментариев    194   5 дн   avif   php

Краткость — сестра брата жены деверя золовки

Никак не могу понять телеграммный стиль некоторых комментаторов под фото. Ощущение такое, что опять вернулись телеграммы, где оплата по словам и у людей туговато с деньгами.

Например, попадается фото, на нём — девушка, под фото комментарий из одного слова, например, «глаза!» (или «ноги!»). Кажется, это означает примерно следующее: «милостивые господа, позвольте обратить ваше внимание на прекрасные глаза этой незнакомки».

Что может значить комментарий «Баржа»? Я не понимаю

А что может означать комментарий «Баржа» под фотографией? Справедливости ради, что-то похожее на баржу там есть, фото я обрезал, но просто поверьте.

Что этим хотел сказать автор комментария?

Давал свою экспертную оценку видовой принадлежности судна? Запрашивал её? Может это выдающаяся баржа? Или у неё есть какая-то история, в которой комментатор осведомлён? Или в самом начале комментария автора хватил инфаркт и он упал лицом на кнопку «отправить сообщение»? Мне никогда не догадаться наверняка.

 3 комментария    210   6 дн  

Купоны

Сегодня до рабочего дня (я обычно приезжаю на работу загодя), выбирал себе крупный молоток на «Маркете» — за все годы у меня так и не завелось приличного. Обычно всё что надо забиваю либо молоточком из детского набора (это ещё из моего детства), либо обухом топора.

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

С добрым словом и купоном вы можете потратить меньше, чем с одним только добрым словом

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

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

В интернете есть много сайтов (а в «ВК» — пабликов), которые называются «купонаторы». На них собраны купоны для самых разных магазинов. Всегда, когда я вижу на сайте какого-либо магазина окошко для ввода купона, я гуглю его название со словом «купон» (или «промокод»). И почти всегда что-то находится. Иногда скидки просто космические, мой рекорд — что-то около 60%.

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

 2 комментария    207   6 дн  

Титанобоа vs. мегалодон

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

Сегодня дочка огорошила меня новым вызовом: «папочка, а кто победит — титанобоа или мегалодон?», ответа у меня пока нет, буду изучать вопрос.

 5 комментариев    223   7 дн   дочка

Углеродно-кремниевая сегрегация

Когда-то в Америке висели таблички, запрещающие неграм входить в бары «для белых», а сейчас иллюстраторы используют специальные метки, предписывающие искусственному интеллекту не заходить на их сайты:

<meta name="robots" content="noai, noimageai">

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

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

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

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

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

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

 1 комментарий    215   7 дн   html   ИИ

Определение ширины и высоты файла JPEG

В «Эгее» есть какой-то плавающий баг, из-за которого иногда не заливаются файлы JPEG. Илья, автор «Эгеи», пытался с ним разобраться, но до конца понять проблему не смог.

Пока рабочая теория такая, что функция ПХП getimagesize (она возвращает тип изображения и его высоту с шириной) иногда выдаёт неправильные значения.

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

Вот Илья и попросил написать меня такой код на чистом ПХП. Надеюсь это позволит продвинуться в изучении проблемы — код вошёл в одиннадцатую версию «Эгеи».

Выложу его у себя тоже, чтобы не потерялся, ну и может кому-то ещё пригодится:

function readJPEGWxH(string $filename): array
{
    $file = new SplFileObject($filename);

    if (!$file->flock(LOCK_SH)) {
        throw new RuntimeException('Cannot lock the file');
    }

    if ($file->fread(2) !== "\xFF\xD8") {
        throw new RuntimeException('Unknown format');
    }

    for (;;) {
        $decoded = @unpack('H4segment/nlen', $file->fread(4));

        if ($decoded === false) {
            throw new RuntimeException('Unknown format');
        }

        ['segment' => $segment, 'len' => $len] = $decoded;

        // SOFn (Start Of Frame)?
        if (preg_match('/^ffc[0-3]/', $segment)) {
            $segdata = @unpack('Cbits/nheight/nwidth', $file->fread(5));

            if ($segdata === false) {
                throw new RuntimeException('Unknown format');
            }

            return [$segdata['width'], $segdata['height']];
        }

        // len = full lenght of segment except segment magic code
        if ($file->fseek($len - 2, SEEK_CUR) !== 0) {
            throw new RuntimeException('Cannot find start of frame');
        }
    }
}

Концепт: текстовый «Инстаграм»

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

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

Концепт «текстового инстаграма», придуманого летом 2018-го года, косметически подправлено под вид моего Инстаграма в 2023-м

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

Весь остальной интерфейс, включая игры со шрифтами («𝓘𝓷𝓼𝓽𝓪𝓰𝓻𝓪𝓶», например) рисуется символами Юникода — там всё нужное есть.

 4 комментария    233   8 дн  

Золото

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

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

Золотые монеты моей знакомой — все периода правления Николая Второго

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

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

В общем, золото в руках подержал, поставил, так сказать, галочку. 👍

 Нет комментариев    208   8 дн  
Ранее Ctrl + ↓