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

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

Поиск источника SQL-запроса

Слоями абстракций сейчас никого не удивишь и иногда 90% километрового стректрейса — кишки фреймворка. Отлаживать в таких условиях что-то довольно муторно. Кроме того, фреймворк может скрывать детали реализации.

Если ради оптимизации надо найти, где в большом приложении выполняется конкретный SQL-запрос, особенно с учетом всяких ORM и entity-менеджеров, то можно включить отладочные логи для самой нижележащей штуки в этом всем (например, hibernate). А потом поставить conditional breakpoint на строчке, которая выводит сырой SQL-запрос. Ее обычно легко найти поиском по области видимости и/или по названию класса из лога. Затем запустить тесты (у вас же хорошее покрытие, да?), словить запрос на строчке с логом, идти вверх по стеку вызовов и смотреть, кто же такой запрос генерирует и в каких случаях.

СсылкаКомментировать

Tcpdump

Для того, чтобы "по-быренькому" посмотреть трафик на порту, можно использовать команду

tcpdump -n port 8125 -X

Флаг -n настраивает показ IP-адресов вместо хостов, а -X — показ содержимого в hex и ASCII. По умолчаю используется основной интерфейс, если нужен localhost — надо добавить -i lo.

Ну а для продвинутого анализа возможно лучше подойдет Wireshark.

СсылкаКомментировать

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. Типа чтобы демки сайтов заказчику показывать. Звучит как эксплоит, да и исходников нет... -_-

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

СсылкаКомментировать