Минутка просвещения

Читать в телеге. Когда-то там были посты не только от меня.

Proxy auto config

Для того, чтобы выйти за пределы “безопасного” интернета, иногда надо использовать прокси. И хочется это делать удобно. Для браузеров есть куча расширений, которые это вроде как предлагают, некоторые даже включают прокси только на заблокированные сайты. Однако эти расширения работают не очень качественно и/или запрашивают разрешения к очень многим вещам (например, почти все просят доступ ко всем данным всех сайтов).

Чтобы шапочка из фольги не жала, можно воспользоваться встроенными настройками браузера, чтобы он ходил на нужные сайты через прокси, а на остальные — без нее. Поможет нам в этом механизм Proxy auto config. Идея его заключается в том, что создается pac-файл, который по сути является скриптом на javascript, реализующим одну функцию: получить адрес прокси для url. Выглядит он примерно так:

function FindProxyForURL(url, host) {
    host = host.toLowerCase();
    if (shExpMatch(host,     "*telegram.org")
        || dnsDomainIs(host, "t.me")
        || dnsDomainIs(host, "telegra.ph")
        || shExpMatch(host,  "*media.tumblr.com")
        || dnsDomainIs(host, "httpbin.org")
    ){
        return "SOCKS localhost:9050";
    } else {
        return "DIRECT";
    }
}

Готовые можно найти в интернете. Протестировать самописное можно здесь. А дальше — прописываем в настройке браузера “Automatic proxy configuration URL” путь к файлу, например file:///home/ov7a/proxy_config.pac.

Ссылка

Отключение "удобств" journalctl

Чтобы заставить journalctl показывать строки без запихивания в less (например, чтобы скопировать из лога длинную строку), можно использовать флаг no-pager:

journalctl --no-pager

Ох уж этот systemd, который специально делает тебе “удобнее”. Если покопаться в исходниках, то всплывает интересная вещь: запихивать все в какой-нибудь less — это изначальная функциональность journalctl, которая появилась одновременно с парсингом аргументов командной строки в коммите “journalctl: add command line parsing”. Еще один повод для нелюбви к Поттерингу, который делает 2 фичи в одном коммите и вдобавок описания плохие делает.

Ссылка

Опрос про баги

В канале админа профунктора был такой опрос. Результаты меня немного опечалили.

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

Ссылка

Почему функциональное программирование не распространено

Отличный доклад про историю популярных сегодня языков и как мы пришли к тому, что в топе ООП-языки, а функциональное программирование — не мейнстрим. Кто хочет сразу суть и ответы — можно начать смотреть с 40:00.

Ссылка

Права и символические ссылки

Если вы хотите сменить права на символическую ссылку, то надо использовать флаг -h для chown:

$ mkdir target
$ ln -s target symlink
$ stat -c "%U %F %N" *
ov7a symbolic link 'symlink' -> 'target'
ov7a directory 'target'
$ chown nobody symlink
$ stat -c "%U %F %N" *
ov7a symbolic link 'symlink' -> 'target'
nobody directory 'target'
$ chown ov7a symlink # ops, lets rollback
$ chown -h nobody symlink # retry with -h flag
$ stat -c "%U %F %N" * 
nobody symbolic link 'symlink' -> 'target'
ov7a directory 'target'
Ссылка

Задержка между нажатием клавиши и появлением символа на экране

https://danluu.com/input-lag/

В статье довольно неплохо описано, почему у старых компьютеров она меньше, чем у современных. Рекомендую почитать.

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

Ссылка

Перенаправление портов

Способов сделать это - тьма тьмущая:

  1. Настроить firewall - iptables, ufw, firewalld,… тысячи их! Обычно инструкция не всегда простая, надо курнуть манов.
  2. Если дело происходит на маршрутизаторе - то обычно есть встроенные средства (и GUI тоже).
  3. Haproxy и прочие решения для балансировки нагрузки. Сейчас такое даже в Spring есть встроенное.
  4. nginx, apache и прочие продвинутые веб-сервера.
  5. ssh. Например, так: ssh -L 80:target_server:80 gateway_server. Чего он только не умеет… Кстати, в одном из проектов этот способ был весьма удобен для отладки взаимодействия с базой, к которой не было прямого доступа.
  6. Консольные утилиты. Например, так: socat TCP-LISTEN:80,fork TCP:target_server:80.
  7. В каком-нибудь docker’е это задается на уровне конфига. В kubernetes команда port-forward делает проброс порта к поду.
  8. Ngrok. Вы ставите себе утилиту на комп и она вытаскивает наружу веб-сервер с localhost. Типа чтобы демки сайтов заказчику показывать. Звучит как эксплоит, да и исходников нет… -_-

И наверняка этим список не исчерпывается.

Ссылка

Навигация по коду в Github

Github в ноябре добавил навигацию по коду: переход к функции в файле, переход к определению, поиск использований. Прикольная штука, жаль только поддерживаются далеко не все языки, только всякие попсовые типа Javacript, Go и Python. Примечательно, что библиотека для поддержки этого, semantic, написана командой Github на… Haskell.

Ссылка

Значение по умолчанию minimum_should_match

Какой будет minimum_should_match в bool_query, если его не указать? Вроде как 1, но на самом деле - фигушки, если рядом есть must, то это 0:

В документации к версии 6.8 пишут:

If the bool query is a filter context or has neither must or filter then at least one of the should queries must match a document for it to match the bool query. This behavior may be explicitly controlled by settings the minimum_should_match parameter.

В версиях 7.0 - 7.4 про это не было сказано. Вообще. Хорошо хоть в 7.5 сделали отдельный раздел про этот параметр, где написано короче, но яснее:

If the bool query includes at least one should clause and no must or filter clauses, the default value is 1. Otherwise, the default value is 0.

Благо elasticsearch - опенсорс и можно посмотреть, почему такое безобразие произошло с документацией: вот ее удалили, и только через год вернули.

Ссылка