filin

(no subject)

Вечер. В соседней комнате дамы по зуму поют песни. Доносится:

— А если транспонировать в «ля» или «ми»?

Я:

— А если транспонировать в «ля-ля-ля»? Или в «ми-ми-ми»?

(И по некотором, гм, размышлении: а вот интонировать в «ля-ля-ля» или в «ми-ми-ми» — действие, имеющее смысл...) Origin: https://filin.dreamwidth.org/14564.html, comment count unavailable comments
filin

(no subject)

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

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

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

Origin: https://filin.dreamwidth.org/14103.html, comment count unavailable comments
filin

Система цифровых пропусков: демо-версия, SMS-канал

Работает.

Для пропуска в медучреждение даже удаётся уложиться в одну SMS. Благо для SMS там ни фио, ни адреса не нужны. Паспорт, дата рождения, краткое название учреждения (в свободной форме).

Как я и предполагал, если поля для госномера, Тройки и Стрелки не заполнять, то их надо просто не заполнять. Оставлять пустыми. Никаких дополнительных звёздочек туда писать не надо.

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

Как и вчера, пропуск выдали на 15 апреля.

Текст запроса пропуска не зависит от текущей даты. Т.е. один и тот же текст можно слать и в другие дни. Для регулярных походов (в моём случае они как раз регулярные) удобно.

У меня ответная SMS приезжала в считанные секунды, но дело было до 8 утра. В SMS содержится цифробуквенный код и текст на русском, что пропуск действителен на 15.04. Никаких ссылок.

Если системе не нравится формат, она присылает сообщение, что формат не нравится, со ссылкой, где искать описание формата. Что именно ей не понравилось, не пишет. Это я пытался для начала латиницей послать.

YMMV.

Origin: https://filin.dreamwidth.org/13918.html, comment count unavailable comments
filin

Система цифровых пропусков: имеем демо-версию

Сабж.

Система выдаёт пропуск в медицинское учреждение. На 15 апреля. ТОЛЬКО на 15 апреля. Ни раньше, ни позже. Сегодня, напомню, 13-е.

У меня есть основания предполагать, что 15 апреля (в первый день, когда пропуска будут обязательны) ещё можно будет получить пропуск на оное 15 апреля. У меня НЕТ оснований предполагать, что 16 апреля можно будет получить пропуск на 16 апреля.

Отправить багрепорт в техподдержку пока не удаётся.

Ну вы поняли.

Origin: https://filin.dreamwidth.org/13704.html, comment count unavailable comments
filin

И я про screen

По итогам обсуждения у Витуса (1 серия, 2 серия) собрал и причесал:

source_ssh_auth:
fix_ssh_auth_sock () {
    if [ -e "$HOME/bin/fixssh" ]; then /bin/rm -f "$HOME/bin/fixssh"; fi
    if [ -S "$SSH_AUTH_SOCK" -a ! -L "$SSH_AUTH_SOCK" ]; then
        local new_ssh_auth_sock_dir
        new_ssh_auth_sock_dir="$HOME/.ssh/auth_sock"
        local new_ssh_auth_sock
        new_ssh_auth_sock="$new_ssh_auth_sock_dir/auth_sock.$(hostname)"
        if [ ! -d "$new_ssh_auth_sock_dir" ]; then
            mkdir -p "$new_ssh_auth_sock_dir" || return
        fi
        ln -sf "$SSH_AUTH_SOCK" "$new_ssh_auth_sock" || return
        SSH_AUTH_SOCK="$new_ssh_auth_sock"
        export SSH_AUTH_SOCK
    fi
}

case "$DISPLAY" in
    # don't run fix_ssh_auth_sock if logged in locally in X
    # because otherwise you'll lose connection to local ssh agent
    # after first remote or terminal login to this host
    :*) ;;
    *) fix_ssh_auth_sock ;;
esac


Что делает. Если видит в переменной SSH_AUTH_SOCK сокет ssh-агента (но не симлинк на него — поэтому ! -L), делает на него симлинк с well-known именем. После чего переставляет переменную SSH_AUTH_SOCK.

Единственная переменная часть в имени — hostname. Защита от проблем, возникающих в случае с NFS-mounted home.

Что позволяет. Типичная ситуация: с хоста A, где агент, идем с форвардом агента на хост B, запускаем там screen или tmux, и оттуда ходим на хосты C, D и т.д. Если не выполнить fix_ssh_auth_sock, то после первого detach, по любой причине, $SSH_AUTH_SOCK внутри screen останется негодным навсегда. А он случайный. А если выполнить, то после перелогина и подсоединения к сессии он снова станет годным. Будет через симлинк указывать на новый сокет.

Запускается... Во-первых, не запускается, а читается. "." (source), в смысле. Потому что надо переставить переменную. У меня из .zprofile, а остальным рекомендуется .profile или .bash_profile. Синтаксис намеренно выдержан таким, чтобы можно было запускать даже из dash.

Не надо запускать это из НЕинтерактивного шелла — агент отвалится после завершения команды. Честно говоря, маны на bash и dash мутны в части того, выполняется ли .profile из логинного, но неинтерактивного шелла. Подозреваю, что нет, но экспериментируйте себе сами.

.zlogin:
if [ -n "$SSH_CONNECTION" ]; then exec screen -xRR; fi


Что делает. При интерактивном логине по ssh молча запускает screen в режиме «если есть запущенная сессия, подцепиться к ней (к самой свежей по времени создания, если их несколько), НЕ отцепляя других возможных клиентов той же сессии; если ее нет, создать и подцепиться». Согласно man screen, именно с этими ключами screen запускается, если указать его в качестве логинного шелла.

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

Запускать. У меня из вышеуказанного .zlogin. У кого .profile или .bash_profile, оттуда последней командой.

Origin: https://filin.dreamwidth.org/13498.html, comment count unavailable comments
filin

Приступ ламатьявэ

Антисимит — это слойка с сыром и ветчиной: квадратная, без дырки, с начинкой, причем религиозно недопустимой. Неудивительно, что сильно уступает симиту по вкусу.

Рыдательный падеж.

«Нашла опечатку в древнеиндийской философии».

Origin: https://filin.dreamwidth.org/13214.html, comment count unavailable comments
filin

Thermarest pump hack

В Исландии пришлось купить новый (надувной) коврик на замену старому Thermarest, у которого прогнили и одна за другой начали рваться внутренние перегородки (которые делают его горизонтальным). 4 года.

Купленный в Акурейри Exped шел в комплекте с pump sack — (слегка гермо) мешком, который используется для накачивания (теоретически его же можно использовать как одежную герму, но практически уж очень он тонкий, стремно, да и размер великоват). У Exped прямо в инструкции пишут, что надувать его ртом не стоит — портится он от такого содержания влаги. У Thermarest типа пишут, что можно, но практика показывает, что тоже лучше не надо (у той модели, это первый вариант NeoAir, не только у нас были такие проблемы). Их же у нас и надувные подушки, тот же формат.

Ну, я и задумался, что второй Thermarest, который еще не сдох, тоже стоило бы надувать забортным воздухом. У Exped другой формат входного отверстия, с прижимным клапаном. У Thermarest — закручивающаяся "пробка" со входом через торец (если ртом надувать, то она берется в рот, тогда как у Exped вы будете прижимать отверстие к губам снаружи). Заглянул в гугл — да, существует. Thermarest Pump Sack. В Спортмарафоне 2350 р. Судя по фотке, просто надевается манжета. А клапан там по принципу "если начать дуть, то давлением оттолкнет коврик, и зажмет выходную щель".

Тут-то Галенэль и выступила в качестве народного умельца, найдя в Fitzman силиконовую пробку с крышкой для бутылки за 109 р. Толстый (выходной) конец которой имеет подходящий диаметр, чтобы надеться на выход Exped'овского pump sack (21 мм), а тонкий (вставляющийся в бутылку) — подходящий внутренний, чтобы надеться на Thermarest'овскую пробку (она 17 мм, он 16, но это силикон, он слегка тянется).

Такой вот pump hack.

Origin: https://filin.dreamwidth.org/12765.html, comment count unavailable comments
filin

"Ссылки на источники забанили за спам"

Из комментов к чужому посту. Дословно (прямо вместе с опечаткой):

"ответил, но на ссылки на источники пост забанили за спам."

И это, если вдуматься, нельзя считать случайным эффектом. Он закономерный, и чем дальше, тем закономернее. Ссылка на источник начала считаться неприличным поведением не только в тупых спамодавках.

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

Origin: https://filin.dreamwidth.org/12472.html, comment count unavailable comments
filin

Языки хренового программирования

На правах потока сознания.

СННЯУ (с неделю назад я узнал), что на современном HTML + CSS (БЕЗ JavaScript), оказывается, можно сделать модальный диалог подтверждения. Минут 5 я разбирался, как это устроено (надо было найти релевантный код в полном дизайне страницы), а потом за пару секунд встроенный параноик нашел, как легким изящным неосторожным движением посадить в этой программе багу, которую потом только искать придется с полгода... А тем временем данные из базы на сервере будут пропадать... Подтверждение было у кнопки удаления, ага. Все мои читатели знают, за что я нынче люблю языки с богатой системой типов и строгой типизацией времени компиляции?

Полученный инсайт я вторую неделю перевариваю.

Инсайт начался с того, что HTML даже изначально, до CSS — язык программирования. Да, domain-specific. Да, с весьма ограниченной функциональностью. Да, для своеобразного типа процессора. Но программирования. Декларативный, если я правильно соображаю, как принято называть этот класс языков. В смысле, программист на нем излагает, что должно быть показано Ю. Конечному и как оно должно выглядеть, а не как именно это рисовать. Современный CSS добавляет к арсеналу программиста дополнительные возможности, но не меняет ситуацию кардинально. Однако, с дополнительными возможностями появляются и дополнительные возможности их использования как бы не вполне по назначению.

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

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

Ошарашенный изяществом придуманной баги, инсайт на сем не остановился, а двинулся дальше.

Следующий шаг сформулировался так: поведение программы на декларативномм языке, даже простой, плохо предсказуемо для программиста. Не заточен под это человеческий мозг. Про Пролог я такое читал, про Моделику краем уха слышал от коллег (слышал о фактах, вывод мой), а HTML + CSS даны в ощущениях.

Причем в простых случаях, на уровне Hello World, оно как раз обманчиво хорошо предсказуемо. Лучше, чем с процедурным или функциональным. Но как только скомбинировались несколько посылок декларативных инструкций (а в реальных задачах будет именно так) — комбинаторный взрыв разносит вдребезги систему ассоциативных связей.

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

Следствие-сюрприз: система наследования в объектно-ориентированных языках — элемент декларативного программирования. И как только она становится развесистой (наследственный полиморфизм, в противовес параметрическому, плюс множественное наследование, как бы оно ни выглядело) — это минное поле.

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

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

Инсайт, впрочем, не остановился и здесь. Следующим шагом оказалось то, что любой язык, включая естественные и даже язык жестов — тоже, в частности, такой язык программирования. Как правило, хренового. Человеческие языки (вернее, это скорее свойство процессора) обычно здорово выигрывают по скорости программирования и порой даже по предсказуемости. От машины, однако, можно добиться уровня предсказуемости, с человеком недостижимого. Но дорого. Между процессорами есть и еще ряд различий, но к языкам они уже не относятся :)

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

Origin: https://filin.dreamwidth.org/12263.html, comment count unavailable comments