• Видит ли 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
    Ответ написан
  • При обновлении данных в БД sqlite3, обновляет только 1 строку, как сделать, что бы обновляло сразу все?

    @galaxy
    UPDATE stata
       SET coins = coins + dohod

    все.
    Ответ написан
    Комментировать
  • Ошибка при запросе к БД, на хостинге, как быть?

    @galaxy
    Версия какая mysql на хостинге? Судя по этому - 5.5.x.
    Определять же функциональные зависимости между колонками mysql научился в версии 5.7

    С другой стороны, я вообще не понимаю смысл этого запроса - никаких агрегаций там все равно нет, зачем группировка?

    Вероятно, получить результат как на локальной базе поможет выключение only_full_group_by из sql_mode
    Ответ написан
    Комментировать
  • Зачем нужен корневой сертификат?

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

    Если сайт вам сам присылает корневой сертификат, как вы можете ему доверять?

    Распространение таких корневых точек доверия - важная часть построения всей системы PKI (Public key infrastructure), и это не криптографическая проблема, а социально-техническая.
    Ответ написан
  • Почему выдает ошибку literal does not match format string при добавлении даты?

    @galaxy
    Попробуйте TO_DATE:
    INSERT INTO people (last_name, first_name, sex, birthday)
    VALUES ('Иванов', 'Иван', 'm', to_date('1999-04-04', 'yyyy-mm-dd'));
    Ответ написан
    Комментировать
  • Почему rows в explain будто бы удваиваются?

    @galaxy
    Значения rows в выводе EXPLAIN по определению неточные - это оценка, исходя из статистики.
    Если mysql достаточно свежий, можно сделать EXPLAIN ANALYZE - тогда запрос будет реально выполнен и покажет реальные значения для rows.
    Если EXPLAIN сильно ошибается с оценками, стоит сделать ANALYZE TABLE и, возможно, поиграться с настройками статистики для таблицы (UPDATE HISTOGRAM)
    Ответ написан
    Комментировать