Евгений Степанищев

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

Переезд на HTTPS

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

Это меня раздражает. Обычно это автоматизируют, но у «Мастерхоста», где я сейчас беру хостинг, такой автоматизации нет, а самому мне её костылить претит. Поэтому я просто заплатил «Комодо» через каких-то посредников 1000 рублей и закрыл эту тему на два года.

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

23 мая  

«Гилан»

«Гилан» — воздух в пластике за ваши деньги. Дарю слоган

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

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

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

Повёлся на объём 😭

23 мая  

99 бутылок: Rust

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

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

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

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

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

// Beer song. Evgeny Stepanischev, 2018
fn bottles(beer: u8) -> String {
    match beer {
    	0 => "no bottles".to_string(),
    	1 => "1 bottle".to_string(),
    	_ => format!("{} bottles", beer)
    }
}

fn main() {
	let mut beer = 99;
	while beer > 0 {
	    println!("{} of beer on the wall, {0} of beer.", bottles(beer));
	    beer -= 1;
	    println!("Take one down and pass it around, {} of beer on the wall.\n", bottles(beer));
	}

	println!("No more bottles of beer on the wall, no more bottles of beer.");
	println!("Go to the store and buy some more, 99 bottles of beer on the wall.");
}

Как сконвертировать bytea

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

Ограничусь фотографией на которой почти ничего не видно, дабы не эпатировать публику

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

def decodeBytea(bytes: bytearray, charset: str) -> str:
	if bytes[:2] == b'\\x':
		return bytearray.fromhex(bytes[2:].decode()).decode(charset)
	else:
		raise ValueError('Invalid format')

Формат немудрёный — впереди слеш-экс, дальше идут шестнадцатеричные коды байт, которые надо превратить в символы.

Музей Нацбанка РТ

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

От приятеля узнал, что сегодня, в «ночь музеев» можно будет пройти в музей отделения Национального банка в Татарстане — это такое помпезное здание по адресу Баумана, 37. Если вы бывали в Казани, наверняка проходили мимо.

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

Музейчик небольшой, в основном в нём монеты и несколько предметов старины, но взглянуть стоило. Выше, например, монеты Екатерины I, её монеты-плитки (как копейка в первом ряду) ни с чем не спутаешь.

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

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

Банкнот в музее тоже немало, жаль, опять же, всё за стеклом, фотографии на смартфон не особо удаются, снимок выше более-менее получился, на нём — период 20-40 годов. Интересно, что купюры 1947 года (справа) очень похожи на повёрнутые на 90° деньги моего детства, те, что появились в 1961 и исчезли вместе с развалом СССР.

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

Выше, судя по надписи (action au porteur), — акции на предъявителя, рядом с ними лежало ещё несколько занимательных бумаг и поясняющая надпись «коллекция ценных бумаг, выпущенных организациями г. Казани на рубеже 19—20 веков, передал в дар Музею Д. В. Железняк».

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

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

Вообще у меня есть ещё несколько фотографий, остатки можно посмотреть в «Фейсбуке». Раньше выкладывал на «Яндекс.Фотки», но этот сервис, как вы возможно знаете, приказал долго жить, а ничего нового я пока не подыскал.

Аудиоплатье

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

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

Можно предположить, что дело в этих щелчках, в них содержится что-то, что сбивает мозг с толку.

17 мая  

СравниТакси

В рабочие дни я минимум два раза езжу в такси — на работу и обратно. Когда-то давно я рассчитал, что это дешевле, чем ездить на машине и это до сих пор верно (у нас в семье есть машина, мне есть с чем сравнить).

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

Отдельной строкой — не знаю на чём они зарабатывают, но приложение бесплатное, никаких встроенных покупок или рекламы.

16 мая  

Модуль PHP на Go

Потешную штуку показали на днях — php-go, позволяет писать модули для ПХП на Гоу. У меня как-то такой потребности не возникало, но попробовать-то интересно!

Пока ехал домой, думал что бы такое обернуть. По какой-то длинной ассоциативной цепочке всплыло как много лет назад я изучал чем быстрее всего посчитать длину юникодной строки. Тогда нагуглился способ через команды набора SSE2.

Ссылка давно протухла, но «Вебархив», к счастью, имеет копию страницы — статья называется «Ridiculous UTF-8 character counting».

Программа там на Си, я её минимально подпилил, чтобы она нормально компилировалась, завернул через cgo в Гоу, а оттуда при помощи php-go протащил как модуль ПХП.

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

Зато попробовал php-go, вещь предельно простая, в случае нужды можно будет что-то быстренько набросать с её использованием.

Функция sleep и сигналы

Век живи, век учись. Вот уж не знал, что при получении сигнала программой на ПХП, моментально прерывается выполнение функции sleep (и родственных ей time_nanosleep и usleep):

$ php -r 'pcntl_signal(SIGUSR1, "_"); var_dump(sleep(PHP_INT_MAX));' &
[1] 3177
$ kill -USR1 3177
$ int(4294967288)

Вообще в Си так же, но где ПХП и где Си. Как и в Си, назад возвращается количество секунд, которые функция не «доспала» (time_nanosleep возвращает массив из секунд и наносекунд, а usleep — NULL). Правда под Виндой есть особенность — sleep при «недосыпе» всегда возвращает 192 (значение константы WAIT_IO_COMPLETION).

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

function bulletproof_sleep(int $seconds): bool
{
    $period = ['seconds' => $seconds, 'nanoseconds' => 0];

    while (array_sum($period) > 0) {
        $period = time_nanosleep($period['seconds'], $period['nanoseconds']);

        if (is_bool($period)) {
            return $period;
        }
    }

    return true;
}

Дореволюционная библиотека

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

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

Всё, что лежит на диване на первом снимке — дореволюционные издания на татарском, записанные арабским алфавитом. Целая библиотека, всё отпечатано в Казани.

Одна из книг, кстати, обёрнута приказом 1920-х годов, что-то там про дезертиров, я не вчитывался, подписано военным комиссаром арского кантона ТССР Муштаковым. Единственный текст на русском.

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

Ранее Ctrl + ↓