(A)
Увидел в тексте правительственной телеграммы непонятную штуку — букву «А» в скобках: «(А)».
По контексту догадался, что это «@», но не сразу понял откуда такое обозначение. Лишь чуть позже дошло, что «@» — «„а“ в кружке́ », кружок показали скобками, а так как в телеграмме всё набирается прописными буквами, то и получается такое странное сочетание знаков.
Гиря братьев Рекшинских
Недавно один из чердаков обогатил меня старинной гирей в два фунта (818 грамм, если верить нашим кухонным весам). С одной стороны у неё клеймо с весом («2Ф» — два фунта) и производителем («БР. Р», гирю выпустил завод братьев Рекшинских), с другой — изображение двух сторон медали, которую Рекшинские получили за свою продукцию в 1886 году на одной из выставок. На изображении аверса сокращённая надпись «За трудолюбие и искусство» и год получения медали, на реверсе — портрет Александра Третьего.
Рядом с изображением медали легко заметить медную пломбу с цифрами, это поверочное клеймо — свидетельство об успешно пройденной поверке, способ борьбы государства с обвесом покупателей.
На странице 214 справочника А. И. Гуляева «Торговля и торговыя установленія» читаем:
Вновь изготовляемыя металлическія гири должны быть снабжены особою вывѣрочною пробкою изъ красной мѣди, для наложенія на нее клеймъ.
Поверочные клейма стали ставить на гири ещё в 12 веке, но до 1899 года в этом вопросе был полный бардак — поверка производилась нерегулярно, часто — единственный раз, в момент изготовления, пошлина за услугу была в каждом городе своя и так далее.
На моём фото поверочное клеймо образца 1907 года — тогда его изменили на торговых гирях с орла на инициалы императора («Н II» — «Николай Второй») и корону. Цифра под короной — номер поверочной палатки (отделения Палаты мер и весов, осуществившего поверку), а «08» — год проведения процедуры (1908).
В моём случае номер поверочной палатки — «6», это палатка Нижнего Новгорода, где и располагался один из заводов Рекшинских.
Кирпич «АК»
Пока был в отпуске, один из друзей прислал фотографию кирпича, который нашёлся во дворе его дома в Казани. Дом старинный, кирпич, по виду — тоже. Очень необычное место расположения клейма — на постели, это редкость, обычно они у нас на тычке.
На роль производителя у меня только одна кандидатура — крестьянин Алексей Калугин, кирпичный завод на Арском поле которого в 1894—95 годах упоминается в источниках. Завод основан в 1885 году, производил по 300 тысяч кирпичей и работало на нём девять человек.
Мениск
На «Реддите» вовсю обсуждают вещи, о которых узнали очень поздно. Я тут тоже
Открытие недели — мениск бывает не только в колене (и даже там их два)! Оказывается в человеческом организме менисков немало, кроме колена, они находятся так же
Кроме того, мениском называют несколько
99 бутылок: Zephir
69. Zephir — язык программирования, созданный для написания модулей расширения PHP и являющийся его сателлитом. Текущая версия (0.12.2) содержит несколько багов, с которыми пришлось столкнуться при написании программы. К счастью, перед компиляцией «Зефир» транслируется в Си, поэтому разобраться в происходящем труда не стоило.
Язык со сборкой мусора, использует как статическую, так и динамическую типизацию. Последняя необходима, например, для сохранения результата вызова пользовательских методов, похоже транслятор пока не умеет опираться на подсказку возвращаемого типа, поэтому требует в таких местах динамическую типизацию.
По синтаксису «Зефир» явный наследник ПХП, но выглядит почище — без «долларов» в именах переменных (которые многих раздражают) и скобок в управляющих конструкциях
К сожалению, реализация языка пока сыровата — на первые баги я наткнулся в первые десять минут программирования, а сообщения об ошибке синтаксиса предельно лаконичны — показывается только строка, в чём ошибка заключается приходится разбираться самостоятельно.
«Песня о пиве» на «Зефире» выглядит следующим образом:
// Beer song by Evgeny Stepanischev
// song.zep
namespace Beer;
class Song
{
private static function format(int bottles) -> string
{
string result = "";
switch bottles {
case 0:
let result = "No bottles";
break;
case 1:
let result = "1 bottle";
break;
default:
let result = "%d bottles"->format(bottles);
}
return result . " of beer";
}
public static function sing() -> void
{
int bottles = 99;
var botStr = self::format(bottles);
while bottles > 1 {
echo "%s of beer on the wall, %1$s of beer.\n"->format(botStr);
let bottles--;
let botStr = self::format(bottles);
echo "Take one down and pass it around, %s on the wall.\n\n"->format(botStr);
}
echo "No more bottles of beer on the wall, no more bottles of beer.\n",
"Go to the store and buy some more, 99 bottles of beer on the wall.\n";
}
}Поскольку язык используется для написания расширений, а не самостоятельных программ, написанному выше надо помочь запуститься:
zephir build
php -d extension=beer.so -r 'Beer\Song::sing();'PHP: доступ к приватным свойствам
Кинули ссылку на один из способов получения доступа к приватным свойствам в ПХП, тут создаётся функция, которая вызывается в контексте объекта с закрытым свойством:
function inspect_closure(object $o, string $p)
{
return (function () use ($p) {
return $this->$p;
})->call($o);
}Я решил вспомнить сколько таких способов вообще существует в ПХП.
Сначала, очевидно, на ум должен прийти рефлекшн, ведь он для этого и предназначен:
function inspect_reflection(object $o, string $p)
{
$refClass = new \ReflectionClass(get_class($o));
$refProp = $refClass->getProperty($p);
$refProp->setAccessible(true);
return $refProp->getValue($o);
}Теперь экзотика. Например, мне вспоминается доступ через преобразование в массив, я о нём уже однажды писал. При преобразовании объекта в массив его приватные и защищённые свойства видны по специальным именам в полном соответствии с документацией:
function inspect_array(object $o, string $p)
{
return ((array) $o)[
sprintf("\0%s\0%s", get_class($o), $p)
];
}Последний способ самый спорный. Не работает с анонимными классами и объектами, в свойствах которого лежат анонимные функции. А ещё от него легко защититься, если закрыть магический метод, отвечающий за сериализацию.
По сути — родственник предыдущего метода. При сериализации все закрытые свойства в объекте сохраняются под теми же специальными именами, что в предыдущем способе:
function inspect_serialize(object $o, string $p)
{
$class = get_class($o);
$serialized = serialize($o);
if (preg_match("/s:\d+:\"\\0{$class}\\0{$p}\";([^;]+;)/s", $serialized, $m)) {
return unserialize($m[1]);
}
throw new \UnexpectedValueException('Something went wrong.');
}Конечно такую регулярку очень легко обмануть, более корректно было бы написать парсер, но для иллюстрации принципа, думаю, вполне годится.
HA
Сначала немного не по теме.
Все файлы на виртуалку я переношу через образ дискеты
dd if=/dev/zero of=floppy.img bs=1024 count=1440
diskutil eraseVolume MS-DOS VOLUME `hdiutil attach -nomount floppy.img`
hdiutil attach floppy.imgПоследняя команда смонтирует получившийся образ, после чего можно записать туда любые файлы.
Как справедливо напомнили читатели в комментариях к моему эксперименту c ARJ,
Для тестирования я выбрал форк архиватора, с которым сталкивался во времена интереса к языку программирования
ARJ
Пока экспериментировал с арифметическим кодированием,
Захотелось его сравнить
Скачал виртуальную машину с
В итоге файл размером 214962 байт ужался до 67634, это 31,5% исходного объёма. Современный архиватор xz 5.4.2 на максималках (использует алгоритмы LZMA и LZMA2) ужал тот же файл до 54648 байт, это 25,4% исходного объёма. Вроде неплохой прогресс.
Но потом я вспомнил, что
Всё как обычно — есть популярные продукты, а есть почти неизвестные программы, которые в тёмном углу пилят
JPEG: арифметическое кодирование
С каждым годом появляется всё больше графических форматов, которые пророчат на замену привычным в вебе джейпегу, гифу и пнг. Скорость их появления так возросла, что форматы устаревают даже не будучи реализованными хотя бы в одном из распространённых браузеров.
Производители то ли осторожничают, то ли так и не сделали внутри своих продуктов некие абстракции, которые бы позволили быстро внедрять любые декодеры форматов.
WebP едва появился в большинстве браузеров, а уже предлагается добавить поддержку BPG и FLIF. На фоне этой всей движухи неясно почему почти никто не обращает внимание на арифметическое кодирование
Этот метод кодирования изначально был защищён патентами компании «АйБиЭм» и поэтому декодеры его не реализовывали, но несколько лет назад патенты истекли и теперь вполне можно было бы добавить его в браузеры, жаль, что пока никто этого не сделал.
Меня привлекают в арифметическом кодировании две вещи: почти моментальная скорость преобразования без потерь из «традиционного» джейпега и бо́льшая эффективность кодирования.
Для эксперимента я взял первый попавшийся джейпег, который лежал у меня в папке «Загрузки» и попробовал сравнить результат арифметического кодирования и другие методы оптимизации в различных сочетаниях. На скриншоте выше example0 — исходный файл, example1 и example2 — результаты арифметического кодирования, остальные файлы применением других оптимизаций.
В эксперименте использовались даже те оптимизаторы, которые работают минутами, они давали превосходные результаты относительно исходного образца, но арифметическое кодирование так и не побили.
Картинка в терминале
Несколько лет назад программа «айТерм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, и в графическом интерфейсе.
Теория разбитных окон ★
Сегодня сделал двум мужчинам замечание в раздевалке спортзала — они громко разговаривали матом, а в раздевалке были дети. Мужчины мне парировали, что дети сейчас знают мат назубок, но материться перестали. Я ещё подумал — какая мощная демонстрация теории разбитых окон — если дети уже и так знают, то как будто и ничего страшного.
Потом мои мысли перескочили на дочку — моего собственного ребёнка, дальше по ассоциативному ряду — на её недавний день рождения и переход в старшую группу садика, в двуязычную среду
Только за сегодняшний день я услышал три англоязычные песни с матом — две в такси, одну спортзале. Если даже я на это реагирую, то что насчёт детей, изучающих английский? Вроде ещё недавно мат, включая англоязычный, из песен убирали — по радио крутили цензурированные версии, а теперь это никого не волнует что ли?
Если ваш ребёнок знает английский, то поделитесь опытом как вы его ограждаете от этого или расскажите почему не ограждаете.
Отцовское
Я маленький котик,
И я чую тортик!
Ева (три года)
Неожиданно одна из самых стрессовых для меня штук в отцовстве — дни рождения дочки. Подготовку большей частью на себя берёт жена, и я просто не представляю сколько сил она на это тратит. Меня же сажает на ноль само событие, отчасти, наверное,
Сегодня в первой половине дня праздновали трёхлетие дочки — до дневного сна была первая, «детская» часть. Сейчас дочка спит, жена
О том, что день рождения ребёнка это непросто, предупреждал меня один из хороших детных знакомых, когда у нас дочка была ещё только в планах. Я тогда подумал, что он сильно преувеличивает — пфф, что там сложного? Оказывается вот что: найти место, придумать и согласовать программу, купить дочке платье, найти фотографа, пару аниматоров, составить список подарков для гостей, купить собственный, заказать торт, еду, всё это притащить на место и дальше следить, чтобы всё прошло без эксцессов.
Дочка в восторге, в дневной сон ушла счастливая и совершенно без сил. Пойду готовиться ко второй части праздника, пока она не проснулась.
«Жулик»
У меня тут в комментах и письмах уже спрашивают — всё ли в порядке, вернулся ли я
Немногие сейчас помнят,
Народная мысль того времени придумало устройство для воровства электричества — «жулик», это такой переходник, позволяющий запитывать от патрона что угодно. Поэтому розеток старались иметь поменьше, а всё необходимое подключали через «жулик», причём с утра пораньше или поздно вечером, так как воров пытались ловить контролёры.
Офлайн-лагерь
В пятницу утром уезжаю
Фотоаппарат с собой взять будет можно, но только плёночный. Таких у меня дома три — советские
В общем, если в выходные попытаетесь со мной связаться, не пугайтесь, что не отвечаю — я вышел из интернета, вернусь в воскресенье вечером.
Гончарно-кирпичный завод Агапова
Поиски новых сведений о производителях кирпичей в Казанской губернии увенчались небольшим успехом.
Теперь известно, что в 1877 году некий крестьянин Агапов собирался построить
Спички на экспорт
Недавно на чердаке старинного дома я нашёл раздавленный коробок с англоязычной надписью «сделано в России» и заинтересовался что он такое, — судя по шрифту, коробок очень старый. Оказалось — такие спички делали на экспорт. Согласно «Каталогу экспортных спичечных этикеток России» Зацепина со товарищи, бренд «KAYS» производил спички с 1929 года.
Родившиеся в СССР помнят, что спички в советское время были одной из самых дешёвых вещей — коробок можно было купить на копейку. Для меня до сих пор спички —
Оказывается экспортировать спички начали ещё при царе, в революцию торговые связи закономерно порушились и экспорт восстановили только в 1922—23 годах. Сейчас это выглядит удивительным, но некоторые страны восстановлению активно препятствовали, например в США на русские спички была наложена запретительная пошлина, снятая только в 1932 году.
Несмотря на это, к концу
Небезынтересна так же фраза «impregnated safety matches» (здесь: «пропитанные безопасные спички»). Это означает, что спички пропитаны специальным веществом для предотвращения тления (выкинутая тлеющая спичка могла привести к пожару). В начале
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Старомосковский русский
Нередко в досужих разговорах с приятелями всплывает тема диалектов — рассуждаем почему русский язык почти одинаковый на территории всей нашей немаленькой страны. Да, отличия в говорах есть, но они минимальны, несравнимо, к примеру с Германией, где они едва понимают друг друга. Думаю, это заслуга движения по унификации всего и вся в СССР, но может и нет, правильного ответа я не знаю.
Может было бы значительнее интереснее, если бы разные области страны разговаривали на сильно различающихся вариантах русского, но как по мне, сталкиваться с едва заметными различиями тоже очень занимательно, ведь заметить их существенно сложнее.
Недавно обратил внимание, что одна из моих знакомых произносит некоторые слова без конечного мягкого знака.
Пока читал в Википедии соответствующую статью, нашёл и у себя несколько старомосковских особенностей. Например — смягчение согласных («Перьмь», «дьверь»).
«Форбс»
Пару дней назад неожиданно написала бывшая коллега — сказала, что со мной ищет контакта журналист из «Форбса», собирает материал для статьи о проекте, к которому я
Мы сейчас всей семьёй отдыхаем за границей, поэтому журналист предложила позвонить через фейсбучный «Мессенджер» (я даже не подозревал, что там есть звонки), проговорили больше часа, что смог — вспомнил.
Так что, если мы знакомы, можете всем говорить, что знаете чувака, у которого брали интервью для журнала «Форбс».
Тайна кофейного стаканчика
Иногда не могу объяснить почему я делаю
До некоторого времени ничего необычного внутри не находилось, и я не знаю, что заставляло меня продолжать, но однажды моя упоротость моё упорство было вознаграждено — внутри нашлась реклама некого заведения.
С тех пор такое мне стало попадаться всё чаще, причём в нескольких разных кофейнях. Возможно