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

Позднее Ctrl + ↑

ARJ

Что-то меня потянуло на разную околокомпьютерную древность.

Пока экспериментировал с арифметическим кодированием, как-то сами собой вспомнились различные архиваторы времён ДОСа, но больше всего почему-то ARJ, который в «Иркеннефти», где я иногда в летние каникулы работал в детстве, называли «а-эр-йот».

Один из рассказов Анджея Земянского, сжатый «а-эр-йодом» в экране «Волкова Коммандера»

Захотелось его сравнить с чем-нибудь современным.

Скачал виртуальную машину с MS-DOS 6.22, установил туда ARJ 2.21 (это версия сентября 1991 года) и попробовал посмотреть насколько уменьшится один из рассказов Анджея Земянского — первый попавшийся текстовый файл, который был у меня на компьютере.

В итоге файл размером 214962 байт ужался до 67634, это 31,5% исходного объёма. Современный архиватор xz 5.4.2 на максималках (использует алгоритмы LZMA и LZMA2) ужал тот же файл до 54648 байт, это 25,4% исходного объёма. Вроде неплохой прогресс.

Архиватор 2003-го года уделывает современный xz, как Тузик грелку

Но потом я вспомнил, что где-то в сети существует таблица сравнения архиваторов за 2002-й год. Победителя нагуглить не удалось, зато архиватор «Compressia», который находится строчкой ниже, нашёлся на «ВебАрхиве». Он смог сжать тот же файл до 44361 байт, что составляет 20,6% исходного файла. А это архиватор 2003-го года (я скачал последнюю версию — 1.0b)!

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

31 августа   arj   программирование

JPEG: арифметическое кодирование

Редактор «ГИМП» умеет открывать джейпеги с арифметическим кодированием

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

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

WebP едва появился в большинстве браузеров, а уже предлагается добавить поддержку BPG и FLIF. На фоне этой всей движухи неясно почему почти никто не обращает внимание на арифметическое кодирование в старом-добром джейпеге.

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

Эксперимент по использованию различных оптимизаторов джейпега

Меня привлекают в арифметическом кодировании две вещи: почти моментальная скорость преобразования без потерь из «традиционного» джейпега и бо́льшая эффективность кодирования.

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

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

31 августа   jpeg   программирование

Картинка в терминале

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

Вообще уже очень давно существует формат «Сиксел», рождённый в незапамятные времена компанией «ДЭК» (DEC), его даже поддерживают некоторые терминалы, но он значительно сложнее придуманного авторами «айТерма2».

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

Картинку с надписью «HELLO» видно сразу и в графической среде, и в терминале

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

Мне тут подумалось, что было бы интересно попробовать вставить внутрь настоящей картинки её закодированную копию, чтобы при попытке вывода её в консоль в виде текста, в терминал попадали управляющие коды и на экран выводился не бинарный мусор, а картинка.

Для этого я нарисовал небольшой ГИФ и вставил закодированную картинку после изображения следующей командой:

cat test.gif \
    <(echo -ne "\033[3F\033[J\033]1337;File=inline=1:") \
    <(base64 test.gif) \
    <(printf "\a")\
> test2.gif

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

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

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

29 августа   gif   macos   программирование

Теория разбитных окон

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

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

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

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

22 августа  

Отцовское

Я маленький котик,
И я чую тортик!
Ева (три года)

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

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

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

Дочка в восторге, в дневной сон ушла счастливая и совершенно без сил. Пойду готовиться ко второй части праздника, пока она не проснулась.

18 августа   дочка

«Жулик»

«Жулик» — керамический патрон-розетка, фотография с сайта «Мешок»

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

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

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

15 августа   история

Офлайн-лагерь

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

Фотоаппарат с собой взять будет можно, но только плёночный. Таких у меня дома три — советские «ФЭД-2», «Zenit-E» и «Зоркий», но не представляю как понять работают ли они. Попробую пощёлкать ими вхолостую, возьму тот, который покажется более работоспособным. Посмотрим, повезёт ли. Если да, постараюсь поделиться иллюстрированными впечатлениями.

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

7 августа  

Гончарно-кирпичный завод Агапова

Выписка из книжки «Систематическій сборникъ постановленій Казанской Городской Думы за 22 года (съ 1871 по 1892 включительно)», сведения за 1877 год

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

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

Теперь известно, что в 1877 году некий крестьянин Агапов собирался построить гончарно-кирпичный завод на участке между Адмиралтейской слободой и устьем Казанки.

Спички на экспорт

Экспортные спички «Kay’s», сделано в советской России в первой половине 20-го века

Недавно на чердаке старинного дома я нашёл раздавленный коробок с англоязычной надписью «сделано в России» и заинтересовался что он такое, — судя по шрифту, коробок очень старый. Оказалось — такие спички делали на экспорт. Согласно «Каталогу экспортных спичечных этикеток России» Зацепина со товарищи, бренд «KAYS» производил спички с 1929 года.

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

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

Несмотря на это, к концу 20-х годов Советский Союз экспортировал свои спички в более чем полтора десятка стран.

Небезынтересна так же фраза «impregnated safety matches» (здесь: «пропитанные безопасные спички»). Это означает, что спички пропитаны специальным веществом для предотвращения тления (выкинутая тлеющая спичка могла привести к пожару). В начале 20-го века такая пропитка уже была обычным делом, но подобные надписи какое-то время ещё оставались на этикетках.

4 августа   история

99 бутылок: dc

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

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

Компактно «песню о пиве» можно записать таким кодом:

[n10P]su[[s]P]ss[[No bottles]Plon2+Q]sn
[d0=ndn[ bottle]n1!=slon]sb[ of beer]so
[ddlbx[ on the wall, ]nlbx[.]lux
[Take one down and pass it around,]lux
1-dlbx[ on the wall.]lux[]luxd0!=B]sB
99lBx
[No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.
] n

А вот вариант с комментариями (которые, правда, не делают программу уж сильно понятнее):

# beer.dc
# Степанищев Е. В. bolknote.ru

# Печать с переводом строки, мне не нравится помещать
# его в строку символом — ломаются отступы
[
	n 10 P
] su

# Печатаем «s»
[
	[s] P
] ss

# Печатаем «No bottles of beer», убираем (сложением) ноль со стека,
# прерываем выполнение родителя (выходим из двух уровней)
[
	[No bottles] P lon
	2+Q
] sn

# Вывод кол-ва бутылок с «bottle(s) of beer»
[
	d 0 =n
	d n [ bottle] n 1 !=s lon
] sb

# « of beer» — в регистр «о», будем использовать
# для вывода части фразы
[ of beer] so

# основной цикл программы (вызывается рекурсивно)
[
	d

	d lbx [ on the wall, ] n lbx [.] lux
	[Take one down and pass it around,] lux

	1-
	d lbx [ on the wall.] lux [] lux

	d 0 !=B
] sB

99 lBx

[No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.
] n
2 августа   99   программирование
Ранее Ctrl + ↓