Author Archive

Понимание Kerberos

Отличное видео-объяснение протокола Kerberos

https://www.youtube.com/watch?v=_44CHD3Vx-0 (Продолжительность: 6 минут)

Цербер (Кербер) - трехголовый пес.

Примечательно, что протокол построен на симметричной криптографии с использованием трех различных закрытых ключей.

TAG:

Отличный курс по Active Directory

Всегда казалось, что Active Directory - это что-то супер сложное для понимания.

Но найдя понятный и простой курс по AD, уже так не думаю 🙂

Курс состоит всего из 4 модулей общей продолжительностью чуть больше часа.

Название модуля Ссылка на youtube Продолжительность
Введение в Active Directory https://www.youtube.com/watch?v=fojHlsyGQqA 20 мин.
Создание первого домена https://www.youtube.com/watch?v=rJJKYe5VECk 10 мин.
Подразделения, группы, учетные записи пользователей https://www.youtube.com/watch?v=ZTnLg9CzZZQ 27 мин.
Включение компьютера в домен https://www.youtube.com/watch?v=JMfe3_OmnRA 10 мин.

Исследование Keycloak

Если у вас уже установлен keycloak и настроен realm, то запросить open-id конфигурацию данного realm можно командой:

curl http://{KEYCLOAK_HOST}:{KEYCLOAK_PORT}/auth/realms/{YOUR_REALM}/.well-known/openid-configuration | jq '.'

Результат будет представлен в виде JSON. Чтобы удобочитаемо отформатировать JSON, можно воспользоваться утилитой jq (https://stedolan.github.io/jq/), которую нужно будет дополнительно установить.

Небольшое описание полученных данных

issuer - базовый адрес realm'а;

authorization_endpoint - конечная точка авторизации; Получить публичный ключ для проверки подписи токена:

curl http://{KEYCLOAK_HOST}:{KEYCLOAK_PORT}/auth/realms/{YOUR_REALM}/protocol/openid-connect/certs | jq '.'

TAG: ,

Highload табличка

Часто возникает необходимость оценки скорости работы системы или какой-нибудь утилитки. Приходится брать калькулятор делить/умножать на секунды, минуты, часы и дни. Расчеты получаются, конечно же, приблизительные. Поэтому хотелось бы иметь примерную табличку, чтобы реже пользоваться калькулятором.
Кол-во операций,
транзакций и т.д.
За 24 часа
(86 400 секунд)
За 10 часов
(36 000 секунд)
За 10 часов
(600 минут)
1 000 000 11.6 в секунду 27.8 в секунду 1 666.7 в минуту
10 000 000 115.7 в секунду 277.8 в секунду 16 666.7 в минуту
100 000 000 1 157.4 в секунду 2 777.8 в секунду 166 666.7 в минуту
300 000 000 3 472.2 в секунду 8 333.3 в секунду 500 000.0 в минуту
500 000 000 5 787.0 в секунду 13 888.9 в секунду 833 333.3 в минуту
700 000 000 8 101.9 в секунду 19 444.4 в секунду 1 166 666.7 в минуту
1 000 000 000 11 574.1 в секунду 27 777.8 в секунду 1 666 666.7 в минуту

Слетели и не работают bash alias

В один день на серваке почему-то перестали работать алиасы (alias)

Долго так промучались.

Пока не нашел такое решение.

Выполняем команду и алиасы работают:

source ~/.bashrc

Чтобы это работало при новом входе:

Добавляем:

source ~/.bashrc

в файл ~/.bash_profile

Сборка и установка турника 3 в 1

Выложим на ровную поверхность компоненты турника:

Распакуем все детали:

Наденем ручки. Половину ручек нужно разрезать пополам. Чтобы дело пошло быстрее смачиваем ручки водой, а сам турник мыльным раствором:

В сборке турник выглядит следующим образом: <<<тут будет фото>>>

Размечаем на стене отверстия для креплений гвоздем или чем-то еще, чтобы была выемка для точного высверливания отверстия. Вcего четыре крепления, каждое крепится двумя анкерами. Расстояние между центрами креплений 45см (желательно пользоваться уровнем(ватерпасом)):

Под местом сверления вешаем пакет на скотч, чтобы меньше пылить и мусорить:

При сверлении отверстий возникла 1-ая проблема стена оказалась не бетонной, а из газобетона (газоблока). Такая стена менее прочная и легко сверлится. С турником шли анкера 12x70, стало понятно, что такие анкера не удержат турник. Пришлось гуглить и смотреть ютуб...

В итоге решил вешать турник на анкера 12x100, но перед этим залить в отверстия "жидкие гвозди" (строительный/монтажный клей). Как выяснилось, применение "жидких гвоздей" значительно усиливает соединение анкера со стеной, заполняя микрополости.

Далее возникла следующая проблема: в строй-магазине были только анкера 12x120, что даже лучше (чем длинне анкер, тем больше площадь соприкосновения со стеной), но продавец положил шурупы к анкеру длинной 100мм. Обнаружив это только дома, пришлось искать шурупы под анкера на 120, не найдя таких, решил укоротить анкера до 100мм, отрезав верхнюю часть:

После высверливания 8 отверстий 12x100, обязательно выскабливаем остатки пыли ершиком или как я - шляпкой шурупа меньшего диаметра:

Дополнительно, можно пройтись пылесосом:

Все отверстия готовы:

Далее по очереди работаем над каждым креплением: заливаем клей в два отверстия, забиваем два анкера и на два шурупа прикручиваем крепление.

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

Все крепления прикручены:

Ждем 3-5 суток до полного отвердевания клея...

Проверка DNS-балансировки

host -t a google.com

PostgreSQL размер таблиц и индексов

Надыбал такой запрос, который вытягивает размеры таблиц и их индексов, а также суммарный размер:
SELECT
    TABLE_NAME,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        TABLE_NAME,
        pg_table_size(TABLE_NAME) AS table_size,
        pg_indexes_size(TABLE_NAME) AS indexes_size,
        pg_total_relation_size(TABLE_NAME) AS total_size
    FROM (
        SELECT ('"' || table_schema || '"."' || TABLE_NAME || '"') AS TABLE_NAME
        FROM information_schema.tables
    ) AS all_tables
    ORDER BY total_size DESC
) AS pretty_sizes

Суффиксный массив на Java за N*log^2(N)

public static int[] getSuffixArray(String s) {
 
    System.out.println(s);
 
    int N = s.length();
 
    int steps = Integer.bitCount(Integer.highestOneBit(N) - 1);
 
    int rank[][] = new int[steps + 1][N];
 
    for (int i = 0; i &lt; N; i++) {
        rank[0][i] = s.charAt(i) - 'a';
    }
 
    Tuple tuples[] = new Tuple[N];
 
    for (int step = 1, cnt = 1; step &lt;= steps; step++, cnt &lt;&lt;= 1) {
        for (int i = 0; i &lt; N; i++) {
            Tuple tuple = new Tuple();
            tuple.firstHalf = rank[step - 1][i];
            tuple.secondHalf = i + cnt &lt; N ? rank[step - 1][i + cnt] : -1;
            tuple.originalIndex = i;
 
            tuples[i] = tuple;
        }
 
        Arrays.sort(tuples);
 
        rank[step][tuples[0].originalIndex] = 0;
 
        for (int i = 1, currRank = 0; i &lt; N; i++) {
            if(!tuples[i - 1].firstHalf.equals(tuples[i].firstHalf)
                    || tuples[i - 1].secondHalf.equals(tuples[i].secondHalf)) {
                ++currRank;
            }
            rank[step][tuples[i].originalIndex] = currRank;
        }
 
 
    }
 
    int suffixArray[] = new int[N];
 
    for (int i = 0; i &lt; N; i++) {
        suffixArray[i] = tuples[i].originalIndex;
    }
 
    return suffixArray;
}
 
static class Tuple implements Comparable<tuple> {
    Integer originalIndex;  // хранит оригинальный индекс суффикса
    Integer firstHalf;      // хранит ранг первой половины суффикса
    Integer secondHalf;     // хранит ранг второй половины суффикса
 
 
    @Override
    public int compareTo(Tuple tuple) {
        return this.firstHalf.equals(tuple.firstHalf)
                ? this.secondHalf.compareTo(tuple.secondHalf)
                : this.firstHalf.compareTo(tuple.firstHalf);
    }
 
    @Override
    public String toString() {
        return "Tuple{" +
                "originalIndex=" + originalIndex +
                ", firstHalf=" + firstHalf +
                ", secondHalf=" + secondHalf +
                '}';
    }
}
 
</tuple>

Перевод времени на сервере

Когда мы тестируем нашу систему, часто возникает необходимость в переводе времени на сервере. У нас используются операционные системы Ubuntu и CentOS, поэтому команды будут для них. Ubuntu # Отключаем службу NTP (если она установлена и включена), которая синхронизирует время и помещает вам перевести время
sudo timedatectl set-ntp off
# Переводим времени, время указывается в формате ЧЧ:ММ:CC
sudo date +%T -s "11:14:00"
CentOS # Смена текущей даты в формате ГГГГММДД (время при этом обнуляется 00:00:00)
sudo date +%Y%m%d -s "20190413"
# Переводим времени, время указывается в формате ЧЧ:ММ:CC
sudo date +%T -s "10:48:56"
TAG: , ,