• DHT. Как реализовать безтрекерный обмен файлами?

    @ivan386
    ID для узла выбирается уже не случайно https://www.bittorrent.org/beps/bep_0042.html
    Но если не предполагается анонса и приёма запросов то ID можно выбрать любой. Не все клиенты реализовали этот BEP.

    1. router.utorrent.com: 6881 - используется только для первичного получения списка узлов командой find_node. Она не требует info_hash а только id узла и target которые могут быть одинаковы так как мы ищем свою позицию в сети.

    В дальнейшем router.utorrent.com: 6881 не должен использоваться больше никак.

    2. routing table должен содержать значения для каждого узла: id, ip(v4 или v6), port, время последнего ответа.

    Её периодически нужно сохранять на диск и при следующем старте пытаться загрузиться уже с неё.

    3. Из таблицы выбираются ближайшие по id узлы к target или info_hash. И к ним соответственно отправляются find_node или get_peers.

    announce_peer возможен только после get_peers так как нужен токен для анонса который в ответе на get_peers.

    find_node используется для нахождения ближайших к своему id узлов. Также периодически можно искать случайные id для пополнения routing table.

    В какую таблицу мы складируем инфохэши от собственных и полученных файлов?


    Соответственно нужна отдельная таблица в которой по info_hash будет храниться список пиров.

    Запрос 'ping' делаем только в router.utorrent.com: 6881 или по всем нодам из routing table?


    Ни в коем случае. Работа с ним закончена на первом этапе.

    Ping нужно отсылать только на узлы из routing table с которыми длительное время не было связи. До тех пор пока узлы не ответят на ping их нельзя отдавать другим узлам на их запросы. Соответственно и узлы полученные от другого узла нельзя отдавать дальше до проверки их состояния.

    Другие узлы также будут проверять этот пингуя или опрашивая его.
    Ответ написан
    1 комментарий
  • Как правильно настроить pgbouncer и postregsql?

    Melkij
    @Melkij
    PostgreSQL DBA
    max_client_conn в конфиге баунсера - это максимальное число возможных подключений от клиентов к самому баунсеру.
    Если у вас max_client_conn стоит, например, 100, а каждый из 20 бекендов попробует открыть по 10 соединений с баунсером - то первая сотня подключений будет успешна, остальные получат ошибку "no more connections allowed (max_client_conn)"
    max_client_conn ставится в 10000 и про него надолго забываем. Штука фактически бесплатная, libevent хорошо умеет с таким работать. Но требуется выставить корректный open file limit. Каждый коннект - это файловый дескриптор, если не скорректировать настройки ОС - то будет неприятный сюрприз.

    Далее, max_connections базы оставить как есть. Максимум в 100 процессов базы на всего 8 ядер - это и так довольно-таки много, но и урезать смысла нет.
    max_user_connections не трогать если нет причин для этого.

    pool size 20 на всего лишь 8 ядер CPU может быть чрезмерно. Но далее нужно смотреть уже мониторинг. Сколько реальных процессов базы в работе, очередь ожиданий на баунсере, хватает ли баунсеру процессорного времени (тут скользкий момент, баунсер строго однопоточный и может упираться в производительность одного ядра CPU)
    Ответ написан
    2 комментария
  • Как избавиться от ошибки с prepared statement при работе с PostgreSQL через PgBouncer?

    Melkij
    @Melkij
    PostgreSQL DBA
    Есть ощущение, что PgBouncer подготавливает выражение для ускорения работы при первом запуске, но после остановки выполнения где-то на середине и последующего запуска, PgBouncer все еще считает, что выражение должно остаться на сервере, а вот сервер уже так не думает.

    Замените слово "PgBouncer" на "ваше приложение" и тогда получите относительно верное описание происходящего.

    С практически 100% вероятностью у вас pgbouncer сконфигурирован в режиме transaction pool mode. А выполнение любого нового запроса в extended protocol (prepared statement) состоит из трёх вызовов:
    - prepare
    - bind
    - execute
    Нет ничего ошибочного в том, что pgbouncer сконфигурированный в режиме пула транзакций может направить каждое из этих 3 сообщений в разные коннекты базы. Это прямым текстом задокументированное ограничение пула транзакций. Итог закономерный, соответствующие процессы базы не понимают о чём речь и выражают удивление такими ошибками.

    Отключите использование server-side prepared statements на приложении.
    Ответ написан
    2 комментария
  • Почему в логах nginx мне пишет (13: Permission denied) при выполнение php-скриптов?

    @Blumfontein
    Пусть my_user - тот, юзер, в директории которого работает сайт.

    1) В nginx.conf ставьте

    user my_user; # вместо user nginx;

    2) В php5/fpm/pool.d/www.conf

    # Найдите и исправьте на
    user = my_user
    group = my_user
    listen.owner = my_user
    listen.group = my_user


    3) Перезапуск nginx и fpm. Далее на папку /var/lib/nginx/tmp руками ставьте права 0700 на пользователя my_user

    chown -R my_user:my_user 0700 /var/lib/nginx/tmp

    4) PROFIT
    Ответ написан
    Комментировать
  • Как настроить Postgres в Docker?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зачем оно вам? Вот скажите, зачем? Пока ни один из встреченных адептов докера не справился с таким простым вопросом "зачем вам база в докере?", может вы справитесь.

    Для использования базы вы обязаны предоставить нормальную файловую систему, необходимо предоставить сеть хоста. Изоляция? Так у вас система целиком под базу и так. Миграция на другой хост? Да у вас в этом докере только бинарники базы и есть. Точно такие же как в репозиториях, сама база-то снаружи в нормальной ФС. На другую архитектуру вы datadir не перетащите в принципе. Несколько кластеров баз на одной машине? А докер для этого зачем? На ubuntu/debian есть шикарные скрипты pg_ctlcluster. Про извращения с pg_upgrade обновлением базы не буду перепечатывать ответ с ruSO.

    На взгляд postgresql dba вы не передали никаких настроек вообще, а work_mem и вовсе уменьшили, 4мб у него дефолт. Соответственно база будет работать по-умолчанию, т.е. из расчёта запуститься на любом калькуляторе, а не внятно работать. Не хватает, соответственно, всего. Настройки более агрессивных checkpointer, bgwriter и autovacuum в первую очередь.
    По запросам смотрите pg_stat_statements
    Ответ написан
    3 комментария
  • Какие реализации могут быстро искать пересечение множеств (система тегов)?

    @yspb
    В 4 версии редиски появилась возможность подключать внешние модули.
    Например можно добавить поддержку JSON и roaring bitmaps:
    https://github.com/RedisLabsModules/rejson
    https://github.com/aviggiano/redis-roaring

    Последний уменьшает использование памяти разряженными bitmap.
    Быстрее операций and, or и xor битовых масок ничего не может быть.
    Я думаю такой же механизм сжатия используется и в Sphinx.
    Ответ написан
    6 комментариев
  • Как хранить и работать с деньгами в коде и базе данных?

    @gleb_kudr
    Вот международный стандарт по денежным единицам en.wikipedia.org/wiki/ISO_4217
    Там видно, что число знаков после запятой у них может быть разное. А значит для простоты разработки, все стоит хранить в минимальной дробной денежной единице валюты, осущеставляя конвертацию при выводе (т.е. в int)
    Ответ написан
    Комментировать
  • Какую функциональность обычно используют в PHPStorm?

    delphinpro
    @delphinpro Куратор тега PhpStorm
    frontend developer
    Помимо всего вышесказанного я тащусь от поддержки лигатур =)
    20170301-143403.png
    Ответ написан
    3 комментария
  • Как запретить коммиты в Bitbucket без номера задачи Jira?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Не уверен будет-ли это работать на битбакете, но в гите (как и во многих других системах контроля версий) есть хуки.

    https://git-scm.com/book/ru/v1/%D0%9D%D0%B0%D1%81%...
    https://xakep.ru/2016/02/11/git-hook-magic/
    Ответ написан
    2 комментария
  • Как изменить home на главная в Yii2?

    Нужно в конфиге приложения указать русский язык
    $config = [
    'language' => 'ru-RU', // язык приложения
    ....
    ];
    Ответ написан
    Комментировать
  • Как сделать ссылку на Телеграм Бота с командой?

    Berloga
    @Berloga
    Студент IT-специальности. Люблю python
    Нет, deep linking поддерживает только /start payload. Но никто не мешает добавить в обработчик команды /start редирект в другую функцию по второму слову:
    /start info -> обработать как /info
    Ответ написан
    Комментировать
  • Deep linking в Telegram?

    @nllm
    $command = explode(" ", $message);
    $command[0];//сама команда, в других элементах массива - доппараметры
    Ответ написан
    1 комментарий
  • Как работают тома в Docker?

    @askhat
    Не считая хост директорий, есть 2 способа делать персистанс в докере: (1) дата-контейнеры и (2) вольюмы. На примере композа, рассмотрим оба варианта.

    1. Дата-контейнеры
    Самый старый и, на мой взгляд, костыльный способ. Заключается в том, что данные будут сохраняться в контейнере в котором не запущен процесс, и по факту контейнер остановлен. В качестве такого контейнера можно использовать «основной» имедж или использовать специальный, как tianon/true.
    docker-compose.yml
    version: '2'
    services:
      web:
        image: 'nginx'
        volumes_from:
          - 'data'
      data:
        build: './public_html'

    public_html/Dockerfile
    FROM nginx
    ADD index.html /var/www/public_html
    CMD /bin/true

    Обратите внимание на директиву CMD в Докерфайле дата-контейнера. Не смотря на то что исходным имеджем является nginx, как и в сервисе web, команда /bin/true не запустит процесс, а лишь сигнализирует докеру об успешной сборке контейнера. docker-compose ps покажет что дата-контейнер иммет статус типа Exit..., и это именно то состояние которого мы ищем для этого контейнера.
    Прим.: для tianon/true директиву CMD указывать не обязательно, однако придётся указать директиву VOLUME, так как в отличии от основного имеджа, она не указана в исходном Докерфайле.

    2. Вольюмы
    Или, как их называют официально, именованные вольюмы. Более очевидный способ работать с персистансом.
    docker-compose.yml
    version: '2'
    services:
      web:
        image: 'nginx'
        volumes:
          - 'web_data:/var/www/public_html'
    volumes:
      web_data:

    Такая конфигурация автоматически создаст вольюм с именем web_data и замапит его на папку /var/www/public_html внутри контейнера web, при старте композа. Обратите внимание, что в этом примере вольюм обозначен как ключ без значений, это валидный ямл синтаксис, и, в данном случае, означает что композ сфолбэчит опции вольюма на дефолтные, обязательной из которых является driver: 'default'. В случае если вы поднимаете композ локально или на удалённой докер машине, дефолтный драйвер вам подойдёт, если только вы не знаете что нет.
    Прим.: из драйверов, которые представляют особый интерес, во всяком случае мне, драйвер для NFS и DigitalOcean Block Storage.

    Дефолтное поведение докера — не удалять ничего пока пользователь не попросит этого эксплицитно, это распространяется как на дата-контейнеры, так и на вольюмы.
    Ответ написан
    2 комментария
  • Мониторинг социальной активности чиновников?

    @airamkad
    Технически возможно.
    И даже политические оппоненты и просто быдло в стиле "вау, ату его" - будут неплохими финансаторами.
    Насчет полноценности результата - маловероятно. Далеко не все активны в соц. сетях. Далеко не все показывают как живут.
    Технически - возможно. Поиск же по лицами из соц. сетей - заработал.
    Ответ написан
    5 комментариев
  • Выборка ближайших точек?

    Ramzeska
    @Ramzeska
    Ну а если вас интересует функция, переводящая две координаты в расстояние между ними, с радостью поделюсь кусочком:
    <?php
        private function LatLngDist($p, $q) {
            $R = 6371; // Earth radius in km
    
            $dLat = (($q[0] - $p[0]) * pi() / 180);
            $dLon = (($q[1] - $p[1]) * pi() / 180);
            $a = sin($dLat / 2) * sin($dLat / 2) +
                    cos($p[0] * pi() / 180) * cos($q[0] * pi() / 180) *
                    sin($dLon / 2) * sin($dLon / 2);
            $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    
            return $R * $c;
        }
    
    Ответ написан
    Комментировать
  • Как убрать скрол на яндекс-карте?

    forgotten
    @forgotten
    Руководитель разработки API Яндекс.Карт
    Ответ написан
    Комментировать
  • Как заставить телеграм-бота читать групповой чат?

    @stalkerxxl
    Разрешение боту дали читать "ВСЕ сообщения"?
    Ответ написан
    3 комментария
  • Telegram bot как скрыть inline keyboard?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Послать сообщение editMessageReplyMarkup, указав в параметрах chat_id и message_id, и не указывая reply_markup.
    Ответ написан
    2 комментария