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

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

Преобразование unix-timestamp в человеческую дату

Годами я использовал онлайн сервисы типа epochconverter, чтобы из временной метки 1590735600 получить "Friday, May 29, 2020 10:00:00 AM GMT+03:00". На днях узнал, что это можно сделать и в консоли:

$ date -d @1590735600
Пт мая 29 10:00:00 MSK 2020
СсылкаКомментировать

Импорт вложенных структур

Если надо импортировать значение из enum, то Alt+Enter в Intellij по умолчанию вам любезно добавит имя enum спереди, превратив

val color = RED

в

import my.package.Colors
...
val color = Colors.RED

По моему опыту, это чаще всего не нужно: обычно по контексту и значению enum очевидно, какому перечислению оно принадлежит. Чтобы изменить это поведение, есть настройка "insert imports for inner classes". При ее изменении будет добавляться полный импорт:

import my.package.Colors.RED
...
val color = RED

Но до фанатизма доводить не стоит: бывают случаи, когда лучше все-таки использовать квалифицированное значение (т.е. с именем enum спереди). Например, когда в области видимости есть enum со схожими по смыслу и/или написанию значениями.

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

Управление доступом по ssh

Есть несколько способов для этого:

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

  2. Ключевой доступ. По умолчанию используйте его. Он надежнее, позволяет более гранулировано управлять доступом и использовать ssh практически бесшовно. Есть и проблемы: например, не очень просто удалить ключ уволившегося сотрудника из всех мест или ограничить права уже внутри хоста. Но это решается, например, через системы конфигурации типа Puppet или Ansible.

  3. Доступ через SSO. С этим вариантом я столкнулся на новой работе. Суть заключается в том, что никто не дает доступа к серверам напрямую — только через промежуточный агент, который управляет доступом. Банальный вариант — вы запрашиваете доступ к определенному серверу, а после одобрения подключаетесь к серверу-агенту, вводите свои LDAP-данные и работаете дальше. Пример из интернета. Этот подход хорош для большой организации — контролируемый менеджмент ключей, возможность аудита, ведения журналов доступа и т.п. Но для рядового сотрудника это не очень удобно — возникают многие проблемы парольного доступа. Например, уже не скачаешь нормально файл по scp через промежуточный узел или не пробросишь чужие порты.

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

Compose key

Надеюсь, что ни для кого не секрет, что для текста лучше использовать длинное тире '—', а не знак минуса '-'. Но проблема в том, как его вводить.

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

Один из вариантов решения этой проблемы — Compose-клавиша, которая говорит о том, что несколько следующих символов надо преобразовать в один. В Linux назначить эту клавишу можно в настройках клавиатуры (я навесил на правый Win). Теперь я могу вводить тире как Win + - + - + -, а Æ из имени сына Илона Маска как Win + A + E. И работает это в любом приложении. Стандартные комбинации можно посмотреть, например, здесь.

В винде для этого надо нажать Alt и ввести на numpad код символа в ASCII или в Unicode. Помните лайфхаки из 2000-х, как в аське сердечки слать, еще до того как появились эмодзи? Вот это оно и есть. Но как запомнить код для тире — я не представляю. А в маках это тоже вроде как можно сделать, но инструкции удручают своей длиной. См. например, эту.

Сама по себе фича мне очень нравится. Все тире в последних моих текстах я набирал только так:)

Как мне подсказал @n_kudryavtsev, в Windows 10 уже примерно года два есть "панель эмодзи", которую можно вызвать, находясь в любом текстовом поле, комбинацией Win + .. Там в одном из разделов есть и длинное тире.

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

Канал о безопасности сильного ИИ

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

Лайтовое видео, с которого начинал я:

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

Монтирование файловой системы через ssh

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

sshfs user@remotehost:/remotedir localdir

А дальше с ней работать как обычно — большинство программ не заметит разницы.

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

Поиск источника 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.

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