Задать вопрос
  • Выгружает ли хэши паролей пользователей команда pg_dumpall?

    @galaxy
    Для будущих поколений ответ на заданный вопрос: да, выгружает.
    Ответ написан
    Комментировать
  • Что означает данное выражение в мультипликативности функции Эйлера?

    @galaxy
    Ответ написан
    Комментировать
  • Можно ли провести видеокарту в Россию?

    @galaxy
    Киргизия - страна ЕАЭС. Соответственно, любой купленный там товар, - это товар ЕАЭС, на него не распространяются никакие таможенные пошлины и ограничения. Поэтому морду кирпичом и везем, хоть в чемодане, хоть почтой.

    И кстати, у РФ и Киргизии нет общей границы.
    Ответ написан
  • Как гарантируется порядок данных в столбцах для индекса BRIN?

    @galaxy
    Пункт 7.5 говорит о порядке строк в результатах конкретного запроса, ни к физическому порядку, ни к BRIN индексам это отношения не имеет.

    BRIN индекс вы всегда сможете применить (в смысле создать). Будет ли он использоваться, определяет планировщик, исходя из статистики данных и структуры запроса. Будет ли такой индекс эффективен, зависит действительно от данных.

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

    BRIN хранит небольшую выжимку об нескольких последовательных (в смысле размещения на диске) блоках данных таблицы. Поэтому он, как правило, очень эффективен по объему: по сравнению с B-tree и другими индексами он очень невелик.
    При запросе такой индекс отвечает на вопрос: совместима ли выжимка с условиями запроса, т.е. могут ли в блоках данных на диске быть подходящие под запрос строки. Например, для сортируемых типов данных индекс может хранить MIN и MAX значения колонки в пределах блоков, которые описывает выжимка.
    Индекс может выдавать ложноположительный ответ, но не может ложноотрицательный. Допустим, его спрашивают: "найди строки с x = 5", он видит у себя группу блоков с MIN=3 и MAX=20 и отвечает: "тут может быть строка с x = 5". А для группы с MIN=13 и MAX=88, например, он ничего не ответит, т.к. 5 там содержаться не может. СУБД, получив данные по такому индексу, обязана перепроверить строки на предмет ложноположительных результатов.

    Такой индекс лучше всего работает на данных, которые физически определенным образом расположены на диске (например, отсортированы по нужной колонке). Данные на диске лежат обычно в том порядке, как их положили (если потом их активно не стирали и перезаписывали).
    Допустим, если у вас есть архивная таблица с колонкой, содержащей дату создания, или с автоинкрементым полем, BRIN по этим полям будет эффективен.

    Если данные не отсортированы, BRIN будет выдавать слишком много блоков-кандидатов, в которых будет, скорее всего, сравнительно немного подходящих строк.
    Ответ написан
    Комментировать
  • Как в EF Core (Npgsql) указать владельца базы данных и ее таблиц?

    @galaxy
    Есть такой вариант:
    REASSIGN OWNED — сменить владельца у всех объектов (в текущей БД) на другого.
    Ответ написан
    Комментировать
  • Важен порядок элементов в параметре типа список в SELECT чтобы избежать дедлока?

    @galaxy
    Тут ORDER BY code может помочь, причем сортировка должна быть в одном и том же порядке в разных сессиях.
    Ответ написан
    Комментировать
  • Видит ли VPN-провайдер, какие программы для выхода в Интернет используют его пользователи?

    @galaxy
    Вопрос такой: видит ли VPN-провайдер, какие программы для выхода в Интернет используют его пользователи?

    VPN-провайдер (равно как и обычный провайдер) видит трафик, через него проходящий. Так что если в трафике есть нечто, позволяющее идентифицировать программу, то можно сказать, что видит (по крайней мере, возможность такую имеет).

    Может ли он различить, какой браузер используется (может быть, он видит user agent)?

    Чтоб не усложнять: видите в адресе сайта https:// - никто ничего увидеть не может, т.к. трафик зашифрован. Видите http:// - может.

    Может ли он отличить браузер и не браузер? Может ли он различить программу, которая не является браузером, но активно ходит в Интернет?

    Давайте так: ходить в Интернет ≠ ходить на сайты по HTTP(s). Несмотря на то, что браузеры могут использовать и другие протоколы для определенных нужд, не HTTP(s) трафик - признак того, что трафик не от браузера.
    С другой стороны, другие программы могут использовать протокол HTTP(s), и отличить браузер его использует или не браузер, вообще говоря, невозможно (user agent в этом смысле не слишком надежный помощник).

    Еще раз просуммирую: провайдер видит не программы, а трафик. Он может, как правило, идентифицировать протокол (и таким образом отличить, смотрите вы ютуб, качаете торренты, или, скажем, подключаетесь к mysql серверу).
    Если протокол не зашифрован, провайдер может в нем копаться и теоретически узнать много разного (допустим, user-agent и по нему сделать вывод о браузере). Сейчас по некоторым оценкам 85+% всего HTTP трафика - это https, т.е. зашифровано.
    VPN, который использует рядовой пользователь, тоже будет зашифрован в 99% случаев. Это скрывает трафик от провайдера (обычного, которым вы к интернет подключены). Провайдер самого VPN видит весь проходящий через него трафик, т.е. см. выше.
    Ответ написан
    5 комментариев
  • Как узнать, какая запись dkim верная?

    @galaxy
    Селекторы разные (поле s= в DKIM-Signature, и левый поддомен в dkim._domainkey.site.com)?
    Несколько TXT записей по одному селектору не допускается.
    Если наворотили в одной записи, можете попробовать по очереди убрать их из DNS и протестировать каким-нибудь валидатором (гугл "dkim validator").
    Ответ написан
  • Как работать со строками в питоне?

    @galaxy
    >>> zzz("test.txt")
    'c:\\tmp\\file_name'
    >>> print(zzz("test.txt"))
    c:\tmp\file_name
    >>>


    В консоль в первом случае выводится результат repr() от строки. Там слеши экранированы, чтобы это можно было копировать и сразу вставить в код. В самой строке слеши не дублируются.
    Ответ написан
  • PyOtp постоянно ошибка binanscii.Error: Non-base 32 digit found. Как исправить?

    @galaxy
    key = "letters1keydog963"
    totp = pyotp.TOTP(key)


    Конструктор ожидает ключ, закодированный в Base32, а там нет символов 0, 1, 8 и 9 (в документации это как-то очень вскользь прописано).

    Для произвольных, в т.ч. бинарных, ключей используйте base64.b32encode.

    Как я понял, так они сделали ради совместимости с Google Authentificator:

    Parameters
    Secret
    REQUIRED: The secret parameter is an arbitrary key value encoded in Base32 according to RFC 3548. The padding specified in RFC 3548 section 2.2 is not required and should be omitted.
    Ответ написан
    Комментировать
  • Как убрать отступы в коде?

    @galaxy
    Не вставлять их?

    $data[] = '
    <url>
    <loc>'.$site.'/look/'.$sitemap['tag'].'</loc>
    <lastmod>'.date('Y-m-d').'T'.date('h:i:s+01:00').'</lastmod>
    <priority>0.8</priority>
    </url>
    ';


    Если не нравится, что код стал выглядеть не шибко красиво:
    $data[] = "\n<url>\n<loc>"
      .$site."/look/".$sitemap['tag']."</loc>\n"
      ."<lastmod>".date('Y-m-d').'T'.date('h:i:s+01:00')."</lastmod>\n"
      ."<priority>0.8</priority>\n"
      ."</url>\n";
    Ответ написан
    Комментировать
  • Как в простом блокноте сделать текст жирным?

    @galaxy
    Словно в пустом участке есть нечто, превращающее строку в жирную

    Это нечто в данном случае - юникодный символ 'WORD JOINER' (U+2060).
    Он не превращает строку в жирную, а меняет отображение шрифта в данной строке. Как именно меняет, зависит от используемого шрифта - может и не менять вовсе (судя по всему, меняет только в том случае, если шрифт не поддерживает этот символ).
    Почему это происходит - а хз, честно говоря. Какая-то бага, связанная то ли с лигатурами, то ли с юникодными символами-модификаторами, причем, судя по всему, бага в Windows GDI или в стандартных контролах типа RichEdit (в Notepad++, например, тоже проявляется).
    Ответ написан
    1 комментарий
  • Как оптимизировать скорость обновления материализованного представления Postgres?

    @galaxy
    REFRESH в постгресе выполняет по сути пересоздание представления. Если у вас огромная таблица-источник, да еще куча данных упакована в JSON, тут матвью вряд ли в текущем виде спасет.

    Как часто меняются данные в JSON? Какая часть таблицы обновляется (или там вообще aphend-only)?
    Если данные меняются редко и/или лишь небольшая их часть (или вы готовы несколько пожертвовать производительностью таких UPDATE), можете триггером при обновлении/вставке JSON колонки распаковывать данные и записывать отдельную таблицу (которая раньше у вас была матвью).

    Если скорость операций обновления на исходной таблице критична, добавьте поле типа json_col_updated TIMESTAMP (можно сделать отдельную таблицу со связью 1-к-1, если исходную не хочется трогать) и обновляйте его триггером, когда меняется поле с JSON. Дальше с нужной периодичностью распаковывайте массово только обновленные данные (json_col_updated > last_unpack).
    Ответ написан
    Комментировать
  • 10к строк по базе размером 500кк?

    @galaxy
    SELECT * FROM base WHERE domain LIKE '%habr%' LIMIT 10000;


    проще всего так, наверно:

    CREATE EXTENSION pg_trgm;
    
    CREATE INDEX trgm_domain_base_idx ON base USING GIST (domain gist_trgm_ops);
    
    EXPLAIN ANALYZE SELECT * FROM base WHERE domain LIKE '%habr%' LIMIT 10000;


    https://www.postgresql.org/docs/current/pgtrgm.html
    Ответ написан
    Комментировать
  • Как написать sql-скрипт, который пройдет по всем таблицам всей БД и изменит поле row_num с varchar(10) на int4 и сделает его not null?

    @galaxy
    Запрос на изменение типа должен быть примерно такой (и обратите внимание на точку с запятой в конце запроса):
    alter table %I alter column row_num type int4 using row_num::int, alter column row_num set not null;

    (если где-то будут NULL'ы или row_num не влезет/не сконвертируется в int, будут проблемы).

    В скрипте DO $ $ BEGIN EXECUTE ( - лишнее, это же просто SELECT.
    Либо, если вы не хотите копировать вывод запроса и отдельно выполнять, можно таким скриптом:
    DO $$DECLARE q TEXT;
    BEGIN
        FOR q IN SELECT format(
                            'alter table %I alter column row_num type int4 using row_num::int, alter column row_num set not null',
                            tablename
                          )
                   FROM pg_tables WHERE schemaname = 'public'
        LOOP
            EXECUTE q;
        END LOOP;
    END$$;
    Ответ написан
    Комментировать
  • COPY в Postgresql?

    @galaxy
    Слейте все в один файл.
    Под *nix одной командой:
    tail -qn +2 files/*.txt > data.csv
    (если все файлы в одной папке files)

    Ну либо берете список файлов (из вывода dir / ls) и, допустим, в продвинутом текстовом редакторе дописываете к каждому названию куски команды COPY. Получится один большой скрипт
    Ответ написан
    1 комментарий
  • SQLite3, что делать?

    @galaxy
    SELECT rownum FROM (SELECT row_number() over(ORDER BY rate DESC) rownum, id FROM users) q WHERE id = ?
    Ответ написан
    1 комментарий
  • Как вернуть записи из каждой группы с минимальной датой создания?

    @galaxy
    возвращать одно рандомное из дублей, но тогда есть вероятность вывода неправильного результата

    а в чем неправильность такого результата?

    В любом случае, группировка и джойн тут избыточны:
    SELECT DISTINCT ON (project_id) *
      FROM tasks
     WHERE tasks.id = ANY (...)
     ORDER BY project_id, created
    Ответ написан
    2 комментария
  • Как оптимизировать COUNT(*)?

    @galaxy
    Будет ли от этого оптимизация или будет еще хуже?

    В описанной ситуации, скорее всего, будет.
    Вот пример для таблицы на 5 млн строк:
    > EXPLAIN ANALYZE select count(*) from u where val like 'xz%';
    -> Aggregate: count(0)  (actual time=358.829..358.829 rows=1 loops=1)
        -> Filter: (u.val like 'xz%')  (cost=1081.88 rows=4995) (actual time=0.388..358.196 rows=4995 loops=1)
            -> Index range scan on u using u_val  (cost=1081.88 rows=4995) (actual time=0.383..356.709 rows=4995 loops=1)
    
    > EXPLAIN ANALYZE select count(*) from (select id from u where val like 'zx%' limit 11) q;
    -> Aggregate: count(0)  (actual time=1.609..1.609 rows=1 loops=1)
        -> Table scan on q  (actual time=0.002..0.005 rows=11 loops=1)
            -> Materialize  (actual time=1.594..1.601 rows=11 loops=1)
                -> Limit: 11 row(s)  (actual time=0.089..1.560 rows=11 loops=1)
                    -> Filter: (u.val like 'zx%')  (cost=1183.58 rows=5465) (actual time=0.088..1.555 rows=11 loops=1)
                        -> Index range scan on u using u_val  (cost=1183.58 rows=5465) (actual time=0.082..1.537 rows=11 loops=1)


    Ускорение более чем в 200 раз. Разумеется, тут важно, что строк, подходящих под условие, в таблице значительно больше 10 - в данном случае 5.5 тысяч. Если подходящих строк будет в пределах нескольких десятков, разница будет не особо заметна.
    Ответ написан
    Комментировать
  • Как сделать рекурсивный запрос с возвращением всех пройденных элементов?

    @galaxy
    with recursive q as (
        select * from tes where from_id = 1
         union all
        select tes.* from tes, q where tes.from_id = q.to_id
    )
    select * from q order by from_id, to_id

    https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/4445
    Ответ написан