Пишу, по большей части, про историю и программирование. Живу в Казани (Татарстан, Россия).

Позднее Ctrl + ↑

Осенняя вата

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

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

Очень похоже на меня.

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

Ну вот что с этим делать?

 9 комментариев    277   12 дн  

Книжное послевкусие

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

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

 1 комментарий    268   14 дн  

15 сентября и 20 октября 1912 года

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

Листы отрывного календаря за 15 сентября и 20 октября 1912 года

99 бутылок: Psql (переработанная версия)

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

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

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

Таблицу замен я реализовал через девять переменных с числовыми именами, значением которых является число на единицу меньше имени. Например: \set 9 8 — тут переменная с именем 9 получает значение 8.

Чтобы реализовать вычитание единицы, пришлось разделить счётчик цикла на две переменные — beer_h (старший разряд) и beer_l (младший разряд), вычитание производится для каждой цифры отдельно. На диск записывается код, в который помещается имя переменной и её новое значение, используя текущее значение, как имя переменной, из которой надо взять следующее. Понимаю, что запутанно, надеюсь на примере понять будет проще.

Вот этот кусок: \qecho '\\set beer_h :':beer_h. Если текущее значение переменной beer_h равно 9, то на диск будет помещен скрипт с содержимым \set beer_h :9, после его подключения код выполнится, а так как значение переменной 9 — 8, то beer_h получит значение 8.

Одновременно я таким же способом создаю логические переменные beer_разряд_value_значение со значением 1, которые я использую потом как флаги, чтобы остановить цикл или отключить использование множественного числа, когда число «бутылок» доходит до единицы.

С кодогенерацией, кстати, работать веселее — сгенерированный код потом можно использовать как некий аналог подпрограмм, экономя размер кода.

В общем, в результате получилось реализовать «песню про пиво» на чистом языке утилиты psql, не привлекая другие языки программирования.

\if 0
    99.psql
    Psql beer song v.2
    Written by Evgeny Stepanischev https://bolknote.ru
\endif

\if :{?beer_l} \else
    \set 9 8 \set 8 7 \set 7 6 \set 6 5 \set 5 4 \set 4 3 \set 3 2 \set 2 1 \set 1 0
    \set print /tmp/beer_print.sql
    \set minus /tmp/beer_minus.psql

    \out :print
    \qecho '\\if :{?beer_h_value_0} \\echo -n :beer_l'
    \qecho '\\else \\echo -n :beer_h:beer_l \\endif'

    \set beer_h 9
    \set beer_l 9
    \set s s
\endif

\include :print
\echo -n ' bottle':s' of beer on the wall, '
\include :print
\echo ' bottle':s' of beer.'

\if :{?beer_l_value_0}
    \unset beer_l_value_0
    \set beer_l 9
    \out :minus
    \qecho '\\set beer_h :':beer_h '\\set beer_h_value_:':beer_h 1
    \include :minus
\else
    \out :minus
    \qecho '\\set beer_l :':beer_l '\\set beer_l_value_:':beer_l 1
    \include :minus
\endif

\if :{?beer_h_value_0}
    \if :{?beer_l_value_1}
        \set s
    \endif
    \if :{?beer_l_value_0}
        \echo Take one down and pass it around, no bottles of beer.'\n'
        \echo No more bottles of beer on the wall, no more bottles of beer.
        \echo Go to the store and buy some more, 99 bottles of beer on the wall.
        \q
    \endif
\else
    \unset beer_l_value_1
\endif

\echo -n 'Take one down and pass it around, '
\include :print
\echo ' bottle':s' of beer.\n'

\include_relative 99.psql

Остатки иной цивилизации

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

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

Мельничный жернов, встреченный на берегу реки

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

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

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

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

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

 1 комментарий    240   15 дн  

99 бутылок: Psql

Давно чесались руки написать очередную «песню о пиве» на каком-нибудь языке программирования, но что-то никак не мог определиться с выбором. В конечном счёте выбрал psql.

75. Psql — не язык программирования, а клиентская программа, распространяемая вместе с СУБД «Постгрес». У неё есть довольно скромный встроенный язык, в который относительно недавно добавили условный блок.

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

Добавлено позднее: мне всё же удалось реализовать «песню о пиве» без использования эскуэля.

\if 0
    99.psql
    Psql beer song
    Written by Evgeny Stepanischev https://bolknote.ru
\endif 

\if :{?beer} \else \set beer 99 \endif
\echo :beer bottles of beer on the wall, :beer bottles of beer.

select :beer-1 beer, :beer > 2 notend \g /dev/null
\gset

\if :notend \set s s \else \set s \endif

\echo Take one down and pass it around, :beer bottle:s of beer.'\n'

\if :notend
    \include_relative 99.psql
\else
    \echo 1 bottle of beer on the wall, 1 bottle of beer.
    \echo Take one down and pass it around, no bottle:s of beer.'\n'
    \echo No more bottles of beer on the wall, no more bottles of beer.
    \echo Go to the store and buy some more, 99 bottles of beer on the wall.
\endif

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

:{?beer} — синтаксис проверки существования переменной, это нужно чтобы понять запускаем ли мы программу в первый раз или включили её в себя же, чтобы имитировать цикл.

select :beer-1 beer, :beer > 2 notend — эскуэль-запрос, которым делается математика и сравнение — вычитается единица из переменной и проверяется не пора ли выходить из цикла.

\g /dev/null — запуск запроса в выводом результата в /dev/null (то есть в никуда), поскольку его результат на экране нам не нужен.

\gset — записываем результат запроса в переменные, имена которых равны именам столбцов запроса.

У меня есть одна идея, как сделать вычитание, не привлекая эскуэль, надо будет попробовать. А вот с остановом хуже — там никаких идей.

А куда ударение?

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

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

Реконструкция подростковой особи Triceratops horridus («трицератопс хорридус»)

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

Проблема теперь другая!

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

А вот как быть с «трицератопсом» (это растительноядный динозавр, ударение на третий слог) или с «лапиллями» (вулканические каменные выбросы, ударение на второй слог). Чаще всего я интуитивно ставлю ударение правильно, но, как показывает гугление постфактум, иногда ошибаюсь.

Уважаемые авторы детских книг, помните, пожалуйста, что не все родители учились на палеонтологов или вулканологов, иногда мы понятия не имеем с каким ударением читается то или иное слово, маленькая чёрточка над ударным слогом нас бы очень сильно выручила! Ставьте её, пожалуйста!

 1 комментарий    295   18 дн   дочка

Командир

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

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

 1 комментарий    298   20 дн  

Умирающие ссылки

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

Небольшая часть проектов живут по новым адресам, либо с новой адресацией, в этом случае я просто подправляю ссылку, большинство же ссылок приходится переправлять на «Веб-архив», потому что больше некуда.

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

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

 6 комментариев    255   20 дн  

Новый способ сжимать видеосвязь

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

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

С таким «сжатием» видеоконференцию можно проводить даже через канал с очень скудной пропускной способностью. Очень здорово придумано.

 3 комментария    328   22 дн  
Ранее Ctrl + ↓