Rose debug info
---------------

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

Позднее Ctrl + ↑

PHPFuck для PHP8

Немного про программирование.

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

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

<?=[[$_=@([].[]),$___=-!![],$$_=![]+![],$$_=$$_*$$_,$__=$$_+![],$$__=$$_+$__,
$____=$_[-![]-![]],$$___="{$$__}"^$____,$$___=($$___^"$___"). ($$___^"{$$__}"^"$___"^"{$$_}").
($$$_=$$___^"{$$_}"). $$$_.($_____="{$$__}"^"{$$_}"^++$____).("$___"&$____).
([$$___=$_[+![]],"{$$_}"|++$$___][+![]]).$_____.$_[+![]].$$$_. ("$__"^$_[-![]-![]]^"$___")
],$$___][+![]];

Выше новая версия.

Кстати, она компактнее, но при этом выводит больше текста — «hello world», вместо «Hello!» предыдущего варианта. Ниже я немного расскажу откуда взялась экономия и с чем ещё пришлось столкнуться.

Принцип формирования текста остался, в общих чертах, прежним — корнем всего является комбинация @([].[]), которая даёт слово ArrayArray из-за неявного преобразования массива в текст — это такая особенность ПХП (символ @ нужен тут, чтобы подавить предупреждение, которое выдаёт интерпретатор).

Из этой строки потом рождаются все остальные символы. Дело в том, что в ПХП над символами можно производить некоторые бинарные и математические операции, что иногда позволяет получить другие символы. Например, первая буква — h в слове hello получается из сочетания '9' ^ 'a' ^ '0' (где ^ — бинарная операция «исключающего или»).

При этом цифры я получаю довольно простым способом — 0 как +!![] (преобразованием false в число), «девятку»,  — набирая нужные цифры по единицам (из +![]), а a — как предпоследнюю букву из полученной ранее строки ArrayArray, то есть @([].[])[-2] (аналогично, -2 получается тут из двух замаскированных единиц со знаком «минус»).

По сравнению с предыдущим вариантом в новом коде сделаны следующие изменения.

Во-первых, вместо того, чтобы составлять из получаемых букв printf (функцию, которую я использовал в прошлый раз для вывода текста), тут я пользуюсь выводом через короткую конструкцию <?= — в этом основная экономия. Я выбрал этот вариант, так как конструкция <?, которую я использовал ранее, больше не работает, а заменившая её <?php содержит буквы.

В этой связи весь код теперь — большое выражение, все переменные в нём лежат внутри массива. Если давать им нормальные имена, то основной принцип выглядит как-то так: <?=[ [ $v1 = …, $v2 = …, $result = $v1 . $v2 . … ], $result ][1]; То есть они вычисляются внутри массива, последний элемент которого, содержащий вычисленное выражение, выводится.

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

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

Ниже приведен листинг этой программы, вдруг кому-то интересно:

<?php
declare(strict_types=1);

// Доступный алфавит
$abc = str_split(count_chars("Array0123456789", 3));

// буквы, которые надо получить
$need = str_split(count_chars("hello world", 3));

function gen(array $chrs): Generator
{
    // чем операции длиннее, тем ближе к концу
    // это нужно, чтобы более короткие конструкции выигрывали
    foreach ($chrs as $ch) {
        yield $ch => [$ch, $ch];
    }

    // возврат: из чего делаем, [как выглядит, значение]
    foreach ($chrs as $ch) {
        yield $ch => ["~$ch", ~$ch];
    }

    // для символа инкремент работает, а декремент — нет (особенность ПХП)
    foreach ($chrs as $ch) {
        $value = $ch;
        yield $ch => ["++$ch", (string)++$value];
    }
}

function eval_op(string $op, string $a, string $b): string
{
    return ([
        '|' => fn($a, $b) => $a | $b,
        '&' => fn($a, $b) => $a & $b,
        '^' => fn($a, $b) => $a ^ $b,
    ][$op])($a, $b);
}

function generate(array $set): Generator
{
    foreach (gen($set) as $src1 => [$p1, $ch1]) {
        foreach (gen($set) as $src2 => [$p2, $ch2]) {
            foreach (['|', '&', '^'] as $op) {
                $result = eval_op($op, $ch1, $ch2);

                if ($result !== $ch1 && $result !== $ch2) {
                    yield [
                        $src1,
                        $src2,
                        "$p1 $op $p2",
                        $result,
                    ];
                }
            }
        }
    }
}

function out(string $str): string
{
    return preg_replace_callback(
        '/[\x00-\x1F\x80-]/s',
        fn($m) => sprintf("\\x%02X", ord($m[0])),
        $str
    );
}

$set = $abc;

do {
    foreach (generate($set) as [$src1, $src2, $str, $res]) {
        $idx = array_search($res, $need, true);

        if (!isset($rules[$res])) {
            $rules[$res] = $str;
        }

        if ($idx !== false) {
            if (!in_array($src1, $abc, true)) {
                echo out("{$rules[$src1]} = '$src1'"), "\n";
            }

            if (!in_array($src2, $abc, true)) {
                echo out("{$rules[$src2]} = '$src2'"), "\n";
            }

            echo out("$str = '$res'"), "\n\n";

            unset($need[$idx]);
        }

        $set[] = $res;
    }

    $set = array_unique($set);
} while ($need);

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

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

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

«Курчане»

Любопытно какие детали иногда всплывают по случайности в людской памяти. Недавно рассказывал маме про наши курские корни (по заметной части веток мы — потомки переселённых из-под Курска однодворцев) и она кое-что вспомнила.

Говорит, что когда мой дед (её папа) выпивал, иногда в разговоре говорил что-то вроде «ведь вы курчане», маме было лет десять, слово она запомнила, а что оно означает не знала до недавнего времени. Интересно, что себя он курчанином не называл.

Уже старенький Никонор Иванович Литвинов (1881—1975) — мой прапрадед; среди родственников

Думаю, слово появилось в его обиходе с подачи отца тёщи, моего прапрадеда Никонора Ивановича Литвинова, потомка Якова Тимофеевича Калетинова, купленного в качестве крепостного в 1829 году в деревне Копцева Старооскольского уезда — это как раз под Курском. Мама рассказывала, что Никонор Иванович отлично помнил своих предков, наверняка знал и откуда он.

Кстати, я так и не понял как Калетиновы превратились в Литвиновых. Может в документы вкралась ошибка, которая потом закрепилась, впрочем, Яков Тимофеевич (отчество было давно по крёстному) был незаконнорожденным, мало ли какая там история стояла за сменой фамилии.

Запись о покупке моего незаконнорожденного предка

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

Но это только версия, конечно.

Позже: списался с исследователем Курской губернии, вот что он ответил:

Посмотрели сказки 8-й ревизии помещиков Елисеевых. Указанных вами персон в этих ревизиях нет. Кстати, нет и Герасима Матвеевича Елисеева.

Герасим Матвеевич — это тот, у кого был куплен мой предок. Если его не оказалось в восьмой ревизии (это перепись 1833—1834 годов), то куда же он делся?

Адаптация дочки в новом садике

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

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

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

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

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

 2 комментария    690   1 мес   дочка

Голос Александра III?


Александр III Александрович (1845—1894) — император Всероссийский, царь Польский и великий князь Финляндский. Отец последнего российского монарха Николая II

Оказывается в интернете есть аудиозапись, на которой, по одному из предположений, звучат голоса Александра Третьего и его супруги Марии Фёдоровны.

Запись была сделана на восковой цилиндр между между 1889 и 1893 годами в резиденции датского короля во Фреденсборге генеральным консулом Готфридом Рубеном, который в период 1889—1897 годов записывал известных певцов и актеров того времени, а также важных высокородных гостей членов монаршей семьи на недавно изобретенном фонографе.

В 2007-м году Университетская библиотека Дании начала оцифровку коллекции консула и выложила её в интернет на своём сайте, а в 2018 году датский журналист Йенс Корнелиус высказал предположение, что голоса на одной из записей могут принадлежать Александру III с супругой.

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

Из-за способа записи звук неважного качества, а часть записи вообще на датском, поэтому без расшифровки некоторые места не понять:

Женский голос:

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

Мужской голос:

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

Поёт:

Сам Бисмарк чуть от радости
Не вырвал трёх волос,
Как телеграф известие
Такое нам принес,
Что немцы храбро заняли
Пункт важный и большой
И утверждали в Африке
Права страны родной…
С тех пор в Берлине стар и млад
Одно лишь и твердят:
Nach Afrika, nach Kamerun!
Nach Ki-Ka-Kamerun!
Nach Afrika, nach Kamerun!
Так немцы говорят!
Nach Afrika, nach Kamerun!
Nach Ki-Ka-Kamerun!
Nach Afrika, nach Kamerun!
Так немцы говорят!

Мужской голос:

— Закончив, (не разборчиво) не могу вам сказать сегодня. Если б вы заранее меня предупредили, так это другое дело. Я бы взял с собой книгу или что-нибудь в этом роде, чтобы мне прочитать. А так прямо из головы, это нелегко. Вы меня застали врасплох. И конец. До свидания, господа.

Женской голос (на датском):

— Меня очень веселит слушать голос моего мужа.

Сбербанк

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

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

Обложка моей сберегательной книжки из начала 1990-х годов

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

Движение денег на счету и остаток — 64 рубля, интересно, набежали ли там какие-то проценты?

Любопытно, кстати, что было бы, если бы я пришёл сейчас в «Сбербанк» восстанавливать счёт? Получилось бы? Какие проценты там накапали с 64 рублей 6 копеек (мне тут напомнили про деноминацию) за двадцать с лишним лет?

Мне на их извечное «где открывали, туда и идите» и ответить-то нечего — не помню где открывал. Или они сейчас так не говорят?

 6 комментариев    656   1 мес  

Память на цифры

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

Например, я бы ни за что не запомнил цифрами код домофона от подъезда, где мы снимали квартиру в нашу последнюю поездку в Москву, но хозяйка прислала его скриншотом и я его запомнил сразу картинкой и помню до сих пор.

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

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

 2 комментария    405   1 мес  

Москва

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

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

Дочка внутри «Лунохода» на детской площадке ВДНХ (Москва)

Идея была попасть в московский зоопарк и Музей космонавтики, но итоге мы сходили ещё в «Экспериментариум» (чистый восторг), «Инно-парк» (слабое подобие «Экспериментариума», зато посмотрели на «катушку Теслы», где молнии), «Робостанцию» (так себе), Музей Дарвина (хорошо, но плохо, что мы его перепутали с Палеонтологическим), «Музей автомобильных историй» (слабовато) и «Москвариум» (очень хорошо).

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

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

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

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

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

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

 3 комментария    494   1 мес   дочка

LWF

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

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

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

Восстановленная из формата LWF картинка — я с друзьями на пейнтболе

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

На нём сфотографированы мы с друзьями после игры в пейнтбол; тогда он в Казани только-только появлялся.

 6 комментариев    834   1 мес   lwf

Собака-провожака

Чуяло моё сердце, что покупкой котёнка в дом дочка не ограничится. Вообще она больше хотела щенка («папочка, я сама буду с ним гулять»), но в тот момент удалось договориться на кота. Заметно, что дочка растёт больше собачницей, — каждая неагрессивная собака, встреченная по дороге в садик, будет неизбежно обласкана с разрешения хозяев.

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

Скриншот папки, где лежат два коротких видео с собакой-провожакой

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

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

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

 6 комментариев    786   1 мес   дочка

Во времена динозавров, Ленина и диал-апа

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

Например, вот наглядная иллюстрация скоростей интернета в то время:

Забавную картиночку мне тут прислали :). Если хватит терпения, а картинка весит 40 кило, попробуйте дождаться ее загрузки. Мне всегда было любопытно что же делают собаки на пастбище. :)

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

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

Я это даже заскриншотил, но, к сожалению, скриншот не дожил до нашего времени.

 3 комментария    612   1 мес  
Ранее Ctrl + ↓