Angie

Спросили как я отношусь к появлению Angie — отечественного форка известнейшего веб-сервера nginx.

Как-как? Сугубо положительно, разумеется.

Когда-то в веб-разработке была известная каждому аббревиатура LAMP, которая расшифровывалась как Linux, Apache, MySQL и Perl.

Это минимальный набор инструментов, чтобы сделать любой сайт. Времена менялись, Перл сменился ПХП, тот уступил Пайтону, МайЭсКуЭль заменила МарияДБ, но аббревиатура держалась.

Всё сломалось, когда пришёл nginx и вытеснил Апач.

Мне было жаль LAMP, — аббревиатуру, которую я знал с начала веба, но теперь есть шанс, что она починится по крайней мере на территории нашей страны.

А если серьёзно, никаких заметных телодвижений ребята пока не сделали, поэтому не вижу повода о них разговаривать. В стране постоянно появляются форки известных западных продуктов (в реестре отечественного ПО они достаточно заметны) и с тем же постоянством исчезают.

2 комментария

Будем дрессировать нейросети

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

Видеокарта NVIDIA с зелёной полоской и логотипом ASUS в антистатическом пакете на белом столе рядом с клавиатурой.
Моя прелесть — две немного уже старенькие NVIDIA Tesla M10 (P2405)
Материнская плата ASUS с установленным жидкостным охлаждением и радиатором на белом столе рядом с монитором Acer и упаковкой компонентов.
Мать s2066, 8xDDR4, Asus, PRIME X299-A II, Intel X299, процессор Intel, s2066, Core i9 9820X, 3300Мгц, 10 ядер, L3 16,5MB с водяным охлаждением

Потом собираемся прикупить четыре «Теслы» T4, чтобы вставить их в серверный четырёхюнитовый корпус, но это всё быстро в наше время не раздобыть.

Оставить комментарий

«Перемотка»

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

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

Скриншот профиля Элона Маска в Twitter с фотографиями интерьера и людей, поисковой строкой и новостной лентой справа.
Программа «Перемотка» («Rewind») — поиск по всему, что у вас когда-либо было на экране

К сожалению, я не могу её попробовать — требуется «Мак» на процессоре M1 или M2, а у меня «Интел», но я подумываю обновиться, если решусь, попробую обязательно. Думаю, она не понимает русский язык, но всё равно протестировать живое воплощение решения беспокоящей меня проблемы было бы очень интересно!

19 комментариев

Анекдот на Пайтоне

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

Вчера прислали известный неприличный анекдот про Василия Ивановича и Петьку, но написанный на «Пайтоне». И хотя у меня довольно пуританский блог, анекдот так вырвиглазно написан, что пришлось его переписать.

Вот что мне прислали:

class Chapaev:
    nyuans = True
    def fuck(Class):
        Class.nyuans = True
        Class.ass.append('Dick')

class Petyka:
    nyuans = False
    ass = []

if Chapaev.nyuans == True and Petyka.nyuans == False:
    Chapaev.fuck(Petyka)

Как по мне, плохо написано примерно всё, мне очень не понравилось, так что держите, вот вам моя версия, которая, кстати, как мне кажется, более точно отражает суть анекдота:

Chapaev = []
Petka   = []
dick    = [20, Chapaev]

Petka.insert(*dick)

isNuance = Chapaev in Petka and Petka not in Chapaev
print(isNuance) // True

Ну и пока у меня ещё был запал, переписал на ПХП известнейший мем из фильма «ДМБ»:

class Gopher implements Countable
{
    public function count(): int
    {
        return 0;
    }
}

$gopher = new Gopher;
var_dump(count($gopher)); // 0
var_dump(empty($gopher)); // false

2 комментария

Разница между наукой и религией

Очень понравилось объяснение разницы между наукой и религией в книге «Отчаяние» Грега Игана:

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

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

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

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

Оставить комментарий

Сегментация современного интернета

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

Кроме веба у нас тогда были:

  • «аська» — сверхпопулярный мессенджер;
  • почта — тогда она была важной частью интернета, мы очень часто переписывались по почте;
  • «ньюсы» — тематические группы общения по протоколу «news» (NNTP);
  • «айэрси» — IRC, специализированные чаты, вроде современных групповых чатов «телеграма»;
  • «эфтипи» — FTP, протокол обмена файлами, где мы постоянно искали необходимый софт;

…и чёрт знает что ещё, о чём я мог забыть — про какие-нибудь пиринговые сети, например.

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

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

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

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

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

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

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

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

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

15 комментариев

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

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

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

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

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

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

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

20 комментариев

AVIF в GD

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

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

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

Список файлов с расширениями .jpg и .jpg.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") !== [];

2 комментария

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

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

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

Чёрно-белое фото: ноги человека идут по бревну в воде, на снимке подпись «фото Е. Канаева».
Что может значить комментарий «Баржа»? Я не понимаю

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

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

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

12 комментариев

Купоны

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

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

Экран оформления заказа: 2 товара на 3058₽, скидка 113₽ (включая промокод CODE-AF), итого 2945₽, кнопка «Перейти к оформлению» и поле для нового промокода.
С добрым словом и купоном вы можете потратить меньше, чем с одним только добрым словом

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

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

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

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

4 комментария

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

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

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

10 комментариев

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

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

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

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

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

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

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

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

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

2 комментария

Определение ширины и высоты файла 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');
        }
    }
}

5 комментариев

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

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

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

Скриншот Instagram: два поста с цветными фонами и текстом — «A man on a bike puts on a helmet a red bus at front» (1/6) и «A girl in overalls is sitting inside a window» (1/7).
Концепт «текстового инстаграма», придуманого летом 2018-го года, косметически подправлено под вид моего Инстаграма в 2023-м

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

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

8 комментариев

Золото

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

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

Четыре золотые монеты Российской империи с портретами Николая II и двуглавым орлом, датированные 1897 и 1899 годами, на светло-голубой тканевой поверхности.
Золотые монеты моей знакомой — все периода правления Николая Второго

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

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

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

Оставить комментарий

AVIF в «Эгее»!

Как говорится, если нельзя, но очень хочется, то можно. «Эгея», как я писал не понимает формат AVIF, но мне его удалось всё-таки в неё вставить, причём даже малой кровью.

Изображение ниже я взял из своей заметки про Красную площадь в коронавирусный период. В оригинале оно весит 1,1 мегабайт в формате JPEG, в этой заметке используется сконвертированное изображение размером в 179 килобайт. Почувствуйте разницу.

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

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

Красно-белая церковь с разноцветными луковичными куполами и золотыми крестами на фоне голубого неба с белыми облаками, вид снизу через каменную стену и металлический забор.
Моя фотография храма Василия Блаженного (1555—1561 гг.) из заметки «Красная площадь без людей»

Итак, «Эгея» не поддерживает AVIF, но я её в «Эгею» вставил. Как же мне это удалось?

Дело в том, что «Эгея» поддерживает формат SVG, а SVG поддерживает внутри себя растровую графику, в том числе вставленную через протокол «data». Протокол «data» — это картинка, закодированная в текстовую строку, вида data:mime/type;encoding,encoded_data.

Вообще, SVG поддерживает и внешние ресурсы (то есть в теории способен подгрузить картинку снаружи), но при вставке через тег img (как в «Эгее») в нём это запрещено по соображениям безопасности.

Поэтому мысль такая — переводим графику в AVIF, кодируем в base64 («data» так умеет, а иначе бинарные данные не вставить), из-за кодирования они увеличатся на 33%, но даже при этом овчинка выделки стоит, а потом получившееся запихиваем в SVG.

Для конвертации я написал вот такой небольшой bash-скрипт (для работы требуется пакет ImageMagick):

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <picturename>"
    exit 1
fi

NAME="$1"
NEWNAME="${NAME%.*}.svg"
WH=( $(identify -ping -format '%w %h' "$NAME") )

if [[ "$NAME" == *@2x* ]]; then
    WH=( $(( ${WH[0]} / 2 )) $(( ${WH[1]} / 2 )) )
fi

cat<<XML > "$NEWNAME"
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 ${WH[*]}" width="${WH[0]}" height="${WH[1]}">
<image width="${WH[0]}" height="${WH[1]}"
href="data:image/avif;base64,$(convert "$NAME" "avif:-" | base64)"/>
</svg>
XML

echo "$NAME" to "$NEWNAME" was converted.

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

Дополнение: уже сообщают, что в 15-й и ниже Айос ничего не видно.

13 комментариев

Биполярные сказки

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

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

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

Ёклмн, да вы определитесь уже — хорошо обманывать или плохо? Или вообще плохо, но медведей обманывать можно? Ну, наверное, даже не буквально медведей, тут наверное какой-то ксенофобский подтекст?

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

2 комментария

Кирпич «РЕЧИЦА»

Хочется вспомнить, что у меня блог ещё и про кирпичные клейма, тем более, что есть о чём написать — мы с Алмазом Гараевым (блог «Казань заброшенная») ещё весной забрались туда, куда не ступает нога приличного человека и я там наснимал несколько новых для себя клейм.

Одно из них, — «РЕЧИЦА», — нашлось на обломке кирпича. К счастью клеймо сохранилось полностью и найти информацию о нём труда не составило.

Старый бетонный блок с выцветшей надписью «ОПЕРАЦИЯ» и круглым логотипом, лежащий на земле среди щебня и мусора.
Обломок кирпича «РЕЧИЦА», найденный в Казани, в месте, куда давно не ступала нога приличного человека

Речица — название деревни в Думиничском районе Калужской области. В 1897 году дворянин Владимир (по другим источникам — Владислав) Денисович Коссаковский построил в ней завод огнеупорного кирпича — глину там добывали давно поэтому логика в его решении была.

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

Сейчас в Речице никакого производства нет, но на спутниковой карте видно несколько десятков домов, значит жизнь в ней ещё теплится.

Оставить комментарий

Суперпосудомойка

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

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

Проекция белого текста «F15» на деревянной поверхности под чёрной горизонтальной полосой.
Крутая суперспособность нашей посудомойки

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

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

2 комментария