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
filin

Вопрос викторинного типа

Где в Британии правостороннее движение?

Вопрос, возможно, не вполне корректно сформулирован юридически. Но с точки зрения Ю. Конечного (©Витус) корректно.

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

В Интернете ответ найти несложно, так что предлагаю все же построить своих догадок. Ну или если кто и так уже знает...

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

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

Толковые производители смартфонов?

Граждане, а не подскажете, кто из производителей смартфонов (ОС - Андроид) сейчас делает приличные машинки?

В смысле минимума глюков и желательно беспроблемной разлочки бутлоадера (подразумевается замена родной ОС на Lineage).

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

Я так понимаю, что вроде бы пока Sony на уровне (чьей Xperia Z я был вполне доволен, но наконец она решила сдохнуть). А еще?

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

Андроид с рутом

Уважаемые технически эрудированные френды!

Объясните, если кто знает, какие сейчас существуют "сторонние" прошивки Андроида со штатным рутом в комплекте.

Некоторое время я пользовался cyanogenmod, но недавно зашел и выяснил, что оно discontinued, и на его месте теперь LineageOS.

А что еще бывает? Очень хотелось бы ответа из своего опыта, и по возможности развернутого, а не в фейсбучном стиле.

Второй вопрос - что у нас сейчас с версиями Андроида. У LineageOS для моей Xperia Z поддерживается только 14.1, Андроид 7.1. Есть опыт с андроидом 4 и 5, но не то чтобы очень продвинутый. Так, проблемы с записью на SD без рута я так и не сумел решить, ни в четверке, ни в пятерке.

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

Настоящим крокодилам на размеры наплевать

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

Когда я спросил про размеры, девушка честно сказала: «бывает по-разному, надо мерить». Exactly. Принес домой, сравнил. Номинально тот же размер, но новые на сантиметр короче!

Beware. Надо мерить каждый раз.

Origin: http://filin.dreamwidth.org/11093.html, comment count unavailable comments