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Спички на экспорт
Недавно на чердаке старинного дома я нашёл раздавленный коробок с англоязычной надписью «сделано в России» и заинтересовался что он такое, — судя по шрифту, коробок очень старый. Оказалось — такие спички делали на экспорт. Согласно «Каталогу экспортных спичечных этикеток России» Зацепина со товарищи, бренд «KAYS» производил спички с 1929 года.
Родившиеся в СССР помнят, что спички в советское время были одной из самых дешёвых вещей — коробок можно было купить на копейку. Для меня до сих пор спички —
Оказывается экспортировать спички начали ещё при царе, в революцию торговые связи закономерно порушились и экспорт восстановили только в 1922—23 годах. Сейчас это выглядит удивительным, но некоторые страны восстановлению активно препятствовали, например в США на русские спички была наложена запретительная пошлина, снятая только в 1932 году.
Несмотря на это, к концу
Небезынтересна так же фраза «impregnated safety matches» (здесь: «пропитанные безопасные спички»). Это означает, что спички пропитаны специальным веществом для предотвращения тления (выкинутая тлеющая спичка могла привести к пожару). В начале
Гончарно-кирпичный завод Агапова
Поиски новых сведений о производителях кирпичей в Казанской губернии увенчались небольшим успехом.
Теперь известно, что в 1877 году некий крестьянин Агапов собирался построить
Офлайн-лагерь
В пятницу утром уезжаю
Фотоаппарат с собой взять будет можно, но только плёночный. Таких у меня дома три — советские
В общем, если в выходные попытаетесь со мной связаться, не пугайтесь, что не отвечаю — я вышел из интернета, вернусь в воскресенье вечером.
«Жулик»
У меня тут в комментах и письмах уже спрашивают — всё ли в порядке, вернулся ли я
Немногие сейчас помнят,
Народная мысль того времени придумало устройство для воровства электричества — «жулик», это такой переходник, позволяющий запитывать от патрона что угодно. Поэтому розеток старались иметь поменьше, а всё необходимое подключали через «жулик», причём с утра пораньше или поздно вечером, так как воров пытались ловить контролёры.
Отцовское
Я маленький котик,
И я чую тортик!
Ева (три года)
Неожиданно одна из самых стрессовых для меня штук в отцовстве — дни рождения дочки. Подготовку большей частью на себя берёт жена, и я просто не представляю сколько сил она на это тратит. Меня же сажает на ноль само событие, отчасти, наверное,
Сегодня в первой половине дня праздновали трёхлетие дочки — до дневного сна была первая, «детская» часть. Сейчас дочка спит, жена
О том, что день рождения ребёнка это непросто, предупреждал меня один из хороших детных знакомых, когда у нас дочка была ещё только в планах. Я тогда подумал, что он сильно преувеличивает — пфф, что там сложного? Оказывается вот что: найти место, придумать и согласовать программу, купить дочке платье, найти фотографа, пару аниматоров, составить список подарков для гостей, купить собственный, заказать торт, еду, всё это притащить на место и дальше следить, чтобы всё прошло без эксцессов.
Дочка в восторге, в дневной сон ушла счастливая и совершенно без сил. Пойду готовиться ко второй части праздника, пока она не проснулась.
Теория разбитных окон ★
Сегодня сделал двум мужчинам замечание в раздевалке спортзала — они громко разговаривали матом, а в раздевалке были дети. Мужчины мне парировали, что дети сейчас знают мат назубок, но материться перестали. Я ещё подумал — какая мощная демонстрация теории разбитых окон — если дети уже и так знают, то как будто и ничего страшного.
Потом мои мысли перескочили на дочку — моего собственного ребёнка, дальше по ассоциативному ряду — на её недавний день рождения и переход в старшую группу садика, в двуязычную среду
Только за сегодняшний день я услышал три англоязычные песни с матом — две в такси, одну спортзале. Если даже я на это реагирую, то что насчёт детей, изучающих английский? Вроде ещё недавно мат, включая англоязычный, из песен убирали — по радио крутили цензурированные версии, а теперь это никого не волнует что ли?
Если ваш ребёнок знает английский, то поделитесь опытом как вы его ограждаете от этого или расскажите почему не ограждаете.
Картинка в терминале
Несколько лет назад программа «айТерм2» (iTerm2, терминал для «Мака») обзавелась поддержкой графики в командной строке. Сильной необходимости в ней нет, но иногда это удобно — можно посмотреть картинку на удалённом сервере, не выкачивая её себе.
Вообще уже очень давно существует формат «Сиксел», рождённый в незапамятные времена компанией «ДЭК» (DEC), его даже поддерживают некоторые терминалы, но он значительно сложнее придуманного авторами «айТерма2».
Я это знаю, так как
В общем виде тот и другой форматы представляют собой управляющие последовательности, после которых передаётся закодированная картинка.
Мне тут подумалось, что было бы интересно попробовать вставить внутрь настоящей картинки её закодированную копию, чтобы при попытке вывода её в консоль в виде текста, в терминал попадали управляющие коды и на экран выводился не бинарный мусор, а картинка.
Для этого я нарисовал небольшой ГИФ и вставил закодированную картинку после изображения следующей командой:
cat test.gif \
<(echo -ne "\033[3F\033[J\033]1337;File=inline=1:") \
<(base64 test.gif) \
<(printf "\a")\
> test2.gifЕстественно, так как бинарный код изображения идёт первым, при выводе на экран его так же будет видно, поэтому я добавил другие управляющие конструкции (большинство терминалов их поддерживают), возвращающие курсор на место и вычищающие бинарщину.
В данном случае я сначала двигаю курсор на три строки вверх (столько занимает бинарный мусор на экране), потом произвожу очистку от курсора до конца экрана.
Теперь буду пугать наших системных администраторов картинкой, которую видно сразу и в терминале, при выводе командой cat, и в графическом интерфейсе.
JPEG: арифметическое кодирование
С каждым годом появляется всё больше графических форматов, которые пророчат на замену привычным в вебе джейпегу, гифу и пнг. Скорость их появления так возросла, что форматы устаревают даже не будучи реализованными хотя бы в одном из распространённых браузеров.
Производители то ли осторожничают, то ли так и не сделали внутри своих продуктов некие абстракции, которые бы позволили быстро внедрять любые декодеры форматов.
WebP едва появился в большинстве браузеров, а уже предлагается добавить поддержку BPG и FLIF. На фоне этой всей движухи неясно почему почти никто не обращает внимание на арифметическое кодирование
Этот метод кодирования изначально был защищён патентами компании «АйБиЭм» и поэтому декодеры его не реализовывали, но несколько лет назад патенты истекли и теперь вполне можно было бы добавить его в браузеры, жаль, что пока никто этого не сделал.
Меня привлекают в арифметическом кодировании две вещи: почти моментальная скорость преобразования без потерь из «традиционного» джейпега и бо́льшая эффективность кодирования.
Для эксперимента я взял первый попавшийся джейпег, который лежал у меня в папке «Загрузки» и попробовал сравнить результат арифметического кодирования и другие методы оптимизации в различных сочетаниях. На скриншоте выше example0 — исходный файл, example1 и example2 — результаты арифметического кодирования, остальные файлы применением других оптимизаций.
В эксперименте использовались даже те оптимизаторы, которые работают минутами, они давали превосходные результаты относительно исходного образца, но арифметическое кодирование так и не побили.
ARJ
Пока экспериментировал с арифметическим кодированием,
Захотелось его сравнить
Скачал виртуальную машину с
В итоге файл размером 214962 байт ужался до 67634, это 31,5% исходного объёма. Современный архиватор xz 5.4.2 на максималках (использует алгоритмы LZMA и LZMA2) ужал тот же файл до 54648 байт, это 25,4% исходного объёма. Вроде неплохой прогресс.
Но потом я вспомнил, что
Всё как обычно — есть популярные продукты, а есть почти неизвестные программы, которые в тёмном углу пилят