Запойный сладкоежка

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

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

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

Так вот, оказалось, что отказаться о сахара, это примерно как отказаться от алкоголя — многим кажется, что меня заставили, что я бедный и несчастный, что меня надо освободить от этой кабалы. Многие предлагают съесть, что-нибудь сладкое «ведь никто не узнает» и кажется мысленно крутят у виска, когда я отказываюсь. Пока меня эти попытки веселят…

Сижу и думаю — не лишусь ли в этот раз ещё части друзей. Вдруг меня с ними объединяет только сахар?

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

Чёрная перфолента

Большая катушка чёрной перфоленты, свиток использованной ленты и лист с примерами перфорации символов на светлом столе.
Перфокарты и чёрная перфолента, я и не знал, что такая бывает

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

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

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

Дима, большое спасибо за подарок музею на Новый год!

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

Мой цвет волос в детстве

Мои волосы (63.18КиБ)
Мои волосы из далёкого 1979 года, тогда мне было меньше двух лет

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

Дочка у меня относительно светлая и мне стало любопытно сравнить её цвет с тем, что у меня был в детстве.

Мои волосы и волосы дочки (66.69КиБ)
Цвет моих волос в детстве и цвет волос дочки

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

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

Тухандредкоины

Банкнота 100 рублей Банка России с изображением крепости на скале, спутниковой антенны и золотой монеты в левом верхнем углу; текст «БИЛЕТ БАНКА РОССИИ», «100», «сто рублей».
Новые сто рублей, которые я до сих пор ни разу не видел

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

Я их в руках не держал, сфотографировать не могу, но какая-то картинка для привлечения внимания нужна (иначе большинство оставшихся читателей помрёт со скуки), поэтому вот вам фотка новой сторублёвки, которую мне прислал мой приятель.

Так вот, за купюрами в 200 и 2000 рублей сейчас охотятся коллекционеры, но так как их становится всё больше, то котируется не каждая купюра, а только серия «АА», причём чем больше нулей после серии, тем лучше — то есть ценятся купюры первых партий. На «Авито» народ надеется выручить от 100 до 4000 рублей за такие купюры, но считается, что их стоимость будет ещё расти.

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

Кстати, всех, кто всё ещё хочет понять, что такое биткоины, отсылаю к гениальной статье Вастрика «Блокчейн изнутри: как устроен биткоин» — его сайт, кстати, для меня стал открытием года. Получаю громадное удовольствия от чтения всех его статей.

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

Сказки от прабабушки

Сепия-фото: группа из шести человек (три женщины, мужчина в морской форме с ребёнком на руках, два мальчика) стоят на фоне кустарника; один мальчик впереди с пятнами на лице.
Родственники и предки со стороны мамы: слева — прабабушка, в центре — дед, справа — бабушка

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

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

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

Зато много интересного про себя вычитал. Например, в 1993-м я был вегетарианцем. Не помнил это абсолютно.

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

Что есть истина?

У нашего бывшего сотрудника в фейсбуке увидел ссылку на любопытную задачку — может ли (a == 1 && a == 2 && a == 3) быть «истиной» в ДжаваСкрипте?

Не заглядывая в статью, я предложил два варианта, вполне очевидный первый:

a = ((counter) => ({valueOf:() => ++counter}))(0)
// {valueOf: ƒ}
a == 1 && a == 2 && a == 3
// true

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

a = [1,2,3];
a.join = a.shift;

a == 1 && a == 2 && a == 3
// true

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

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

Дизассемблируй это ★

Скриншот игры: вид от первого лица в тёмном подземелье с синим полом и красным объектом; внизу интерфейс с здоровьем 100%, бронёй 0%, патронами 50 и портретом персонажа.
«ДУМ», скомпилированный с использованием одних только команд MOV

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

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

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

И вот оказалось, что эта команда — полная по Тьюрингу. Звучит невероятно, но это так. Некие ребята заморочились и сделали компилятор, который компилирует любую программу на Си в последовательность команд MOV. Причём им даже ДУМ удалось скомпилировать, правда один кадр рисуется семь часов. Кстати, такая программа неуязвима для горюшка века — Мелтдауна и Спектра.

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

Например, сравнение двух чисел делается при помощи следующего псеводокода:

mov [X], 0
mov [Y], 1
mov R, [X]

У нас есть два числа в аргументах «X» и «Y», результат сравнения которых попадает в «R» — там будет ноль, если числа не равны и единица в противном случае. Как же это работает?

Первой командой ноль записывается в ячейку по адресу «X». Это ассемблер, у нас тут всё — число, остальное — человеческие интерператации, поэтому записанное в «X» мы используем как адрес. Второй командой единица записывается в ячейку по адресу «Y». Третьей командой мы читаем значение по адресу «X» и если значения в «X» и «Y» совпадают, то ноль перетрётся единицей (и она попадёт в R), если нет, то в ячейке по адресу «X» ноль останется (который попадёт в R).

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

Возьмём, например, логическое «ИЛИ» («OR»), тут чуточку сложнее:

OR_ADDRS: dd OR_0, OR_1
OR_0: dd 0, 1
OR_1: dd 1, 1
; …
mov eax, X
mov edx, [OR_ADDRS + eax]
mov eax, Y
mov eax, [eax + edx]
mov R, eax

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

Что тут происходит? В регистр (переменную, с которыми работает процессор) «eax» записывается значение «X» (возможные входные значения у нас тут — ноль или единица, численное представление булевых значений).

Далее в регистр «edx» записывается число из адреса, который является суммой адреса массива OR_ADDRS и содержимого регистра eax. Таким образом в eax попадёт OR_0 или OR_1, в зависимости от того былы записаны в eax ноль или единица. Эти значения — тоже числа и являются адресами двух других массивов из двух элементов.

Далее в eax мы записываем аргумент Y, его значение складывается с адресом полученным на предыдущем шаге и из получившегося адреса мы читаем записанное там значение. В переводе на ПХП получается следующее:

function mov_or(int $X, int $Y): int
{
    define('OR_0', [0, 1]);
    define('OR_1', [1, 1]);

    define('OR_ADDRS', [OR_0, OR_1]);

    $R = OR_ADDRS[$X][$Y];

    return $R;
}

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

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

Ассемблер под Линукс ★

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

Тогда не довелось, решил вчера попробовать. Теорию в очень общих чертах я знал — есть системные вызовы (сисколы), которые можно дёргать какой-то командой, имена сисколов мне знакомы через Си. Попробовал написать программу, которая выводит на вход то, что ей дают на вход. Быстро разобрался, что регистры сейчас имеют впереди букву «эр», а сисколы делаются прерыванием №128. Удобный способ, параметры идут в логичном виде — последовательно через регистры в почти алфавитном порядке (ближе к концу последовательность нарушается):

MOV RAX, 3 ; sys_read
MOV RBX, 0 ; stdin
MOV RCX, string ; адрес строки, которую выведем на экран
MOV RDX, len ; длина строки
INT 0x80

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

MOV RAX, 0 ; sys_read
MOV RDI, 0 ; stdin
MOV RSI, string ; адрес строки, которую выведем на экран
MOV RDX, len ; длина строки
SYSCALL

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

Так как системный вызов для открытия файла (sys_open) как раз требует на вход сишную строку, я передал указатель, который взял со стека, в сискол, ожидая, что всё заработает. Это было моей ошибкой. Я потратил не меньше часа, разбираясь, что я сделал не так, перебирал способы передачи параметров, ползал по стеку при помощи отладчика gdb, ничего не помогало, пока не забрезжила догадка, что сами параметры командной строки тоже лежат на стеке и системному вызову это может не нравится.

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

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

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

🍎 + 🍍 + 🍌 = 🥗 ★

Задача: найти положительные целые значения для яблока, банана и ананаса, если сумма трёх дробей (яблоко/(банан+ананас) + банан/(яблоко+ананас) + ананас/(яблоко+банан)) равна 4.
Казалось бы, обычная картинка, которых сотни — реши фрукты

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

Когда я увидел картинку выше, ради развлечения сунул её в «Вольфрам» — хотелось посмотреть как ему указать, что числа должны быть целые. Заинтересовало, что решения не нашлось. Я задумался и внимательно посмотрел на фрукты, в них подвоха тоже не увидел.

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

Минимальные подходящие числа для уравнения такие (ответ проверял на ЯП «Эр»):

`🍎` <- 154476802108746166441951315019919837485664325669565431700026634898253202035277999
`🍌` <- 36875131794129999827197811565225474825492979968971970996283137471637224634055579
`🍍` <- 4373612677928697257861252602371390152816537558161613618621437993378423467772036

print(`🍎` / (`🍌` + `🍍`) + `🍌` / (`🍎` + `🍍`) + `🍍`/(`🍎` + `🍌`)) # [1] 4

Это числа от 79 знаков и больше! Где уж такое решить!

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

← сюда туда →