Задать вопрос
  • Как сделать чтобы бот не мог пинговать роли?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё необходимое есть прямо в классе Message:

    for m in ctx.message.mentions:
      print ("user mention %s" % m)
    for m in ctx.message.role_mentions:
      print ("role mention %s" % m)
    if ctx.message.mention_everyone:
      print ('everyone mention')


    Соответственно, нужно сделать что-то типа:

    if ctx.message.role_mentions or ctx.message.mention_everyone:
      await ctx.send(author.mention+", не пингуй!")
    else:
      await ctx.send(msg)
    Ответ написан
    1 комментарий
  • Ошибка после обновления дискорд. Как исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно просто обновить discord.py.

    pip install -U discord.py

    Описание ошибки в апстриме: https://github.com/Rapptz/discord.py/issues/5109
    Ответ написан
  • Стоит ли изучать математику по первоисточникам?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Труды некоторых математиков XX века вполне можно читать и научиться полезному, они используют достаточно современную терминологию и нотацию. В отличие от более старых, где порой от одних обозначений все мозги перекручивает. Но особого смысла в этом нет. С точки зрения содержания математика не зависит от того, кто её излагает. А вот с точки зрения приобретения дальнейших новых знаний и взаимопонимания с другими знающими математику людьми лучше всё-таки читать актуальную современную литературу.
    Ответ написан
    1 комментарий
  • Запуск tor при старте контейнера(на базе Alpine)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    rc-update управляет системными сервисами, которые запускаются процессом init, запускаемым при старте системы. В контейнере же обычно запускается ровно одна программа, никакой инициализации системы с запуском кучи процессов не происходит. Так что надо запустить tor вручную. Ещё иногда внутри контейнеров используют лёгкие системы запуска сервисов типа runit, но ради одного tor разбираться с этим как-то жирно.

    tor нужно запустить в режиме демона, чтобы после его запуска можно было запустить что-то ещё. Например, сделать скрипт, в котором запустить tor и сразу же нужное:

    команда_запуска_tor >/dev/null 2>&1 &
    команда_запуска_моего_приложения


    Этот скрипт положить внутрь контейнера и использовать вместо изначальной команды.

    Но это всё не docker-way. Красиво и по феншую запустить tor отдельным контейнером.
    Ответ написан
  • Хочу узнать внешний IP адрес?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    traceroute может не показать никакого внешнего адреса даже в тех случаях, когда он никак не зарезан. Например, пусть у нас сетка с роутером 192.168.1.0/24, у которого внешний IP-адрес 192.0.1.2 с единственным маршрутом через 192.0.1.1, и мы делаем traceroute, тогда нам отвечают:

    1. Наш хост.
    2. Роутер 192.168.1.1.
    3. Роутер внешней сети 192.0.1.1.
    4....

    Тут нет 192.0.1.2. А ведь и 192.0.1.1 может ответить не этим адресом, а каким-нить 178.24.3.16. А ещё он может вообще не отвечать на ICMP echo request, тогда в трейсе будет пустая строка, или не уменьшать TTL транзитных пакетов, тогда его вообще не будет видно никак.

    Лучше спросить у своих сетевых админов.
    Ответ написан
    Комментировать
  • Asyncpg в Docker - почему может падать с ошибкой No Route To Host, если route точно есть?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно описать доступ из одного контейнера в другой с помощью links в docker-compose.yml. Сейчас доступ режется докером.
    Ответ написан
  • Как docker-compose заставить ходить через прокси?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ну, для начала, переменная для wget должна называться http_proxy, а не HTTP_PROXY...

    Потом, лучше её задавать для конкретного контейнера, а не для всего докера. Если это нужно в процессе сборки контейнера - указывать в Dockerfile через ARG (не через ENV).
    Ответ написан
    Комментировать
  • Docker доступ в интернет через другой контейнер?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если нужно завернуть трафик не через обычный шлюз в штатной докер-сети, а через один из контейнеров, то это с помощью системы подпорок и растяжек таки можно сделать.

    1. В конфигурацию контейнеров добавить:

    cap_add:
      - NET_ADMIN


    Это необходимо, так как по умолчанию внутри контейнера нельзя конфигурировать сеть. Ну и redsocks, скорее всего, без этого может не заработать.

    2. В скрипте внутри первого контейнера или в entrypoint добавить прописывание роута:

    ip route replace default via IP_другого_контейнера

    IP второго контейнера лучше зафиксировать. Либо, как вариант, узнавать его через dig (тут контейнер имеет имя router, и нужно через параметр links разрешить к нему доступ):

    ip route add default via `dig +short router`

    3. В контейнере-роутере надо настроить nat и форвардинг. Примерно так:

    sysctl -w net.ipv4.ip_forward=1
    iptables -t nat -A POSTROUTING -s 172.18.0.0/24 -j MASQUERADE


    Тут можно тоже какими-нибудь командами угадать нужную сетку, чтобы не завязываться на фиксированные IP. Например, так:

    network=$(ip route list|grep scope\ link|cut -d ' ' -f 1)


    Ну а вообще такие манипуляции - вряд ли хорошая практика. Лучше сразу закладывать в разрабатываемом софте нативную работу через прокси, если это необходимо.
    Ответ написан
  • Как предотвратить кражу сетевого оборудования?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если товариш так упорствует, то вероятно он из этих, что верят, будто бы антенны чипируют людей коронавирусом. Цели установить где-то ещё у него наверняка нет, выбрасывает, продаёт за 1000 рублей или сдаёт на металлолом.

    Можно заставить УК сменить все замки на чердак, а потом выяснять, кто брал ключи в районе времени кражи. Вряд ли вор будет месяцами выжидать после смены замка.
    Ответ написан
    Комментировать
  • Почему функция не работает?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Правильно так:

    cursor.execute("INSERT INTO clans VALUES (?, ?)", (ctx.author.id, cname))


    Очевидно же, что запрос INSERT INTO clans VALUES (123, ee) не будет работать из-за отсутствия кавычек вокруг ee.
    Ответ написан
  • Как лаконично сформировать SQL-запрос на основе параметров из GET-запроса?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если задача извлечения данных по набору параметров из базы, то запрос можно конструировать, безо всяких многоэтажных условий.

    Примерно так:

    $filters = array();
    $values = array();
    
    foreach(array("user_id","city","age","name") as $key) {
      if (isset($_GET[$key])) {
        $filters []= "$key = ?";
        $values []= $_GET[$key];
      }
    }
    
    $sth = $dbh->prepare("SELECT * FROM users WHERE ".implode(" AND ", $filters);
    $sth->execute($values);


    Тут для всех указанных запросов накапливаются условия фильтра и значения в два массива, один затем через AND используется в WHERE, а второй передаётся при выполнении запроса.

    Но реальные сложные проекты так не делают. У них может быть ORM, кэширование и много всякой другой магии, цель которой - увеличить скорость выполнения запросов и уменьшить лишнюю активность. Ну и базы данных могут бычть частично или полностью быть совсем не SQL.
    Ответ написан
    2 комментария
  • Как показать два разных значения из друх разных словарей (в боте дискорда)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    for user_id,counter in user_counter.items():
      ...
      msg += "Ой, а вот у **%s** целых %d подходов %d раз" % (user.name, counter, user_kolvo[user_id])

    Или даже так:

    for user_id in user_counter:
      ...
      msg += "Ой, а вот у **%s** целых %d подходов %d раз" % (user.name, user_counter[user_id], user_kolvo[user_id])

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

    user_data[user_id] = { "counter": число, "quantity": число, "birthday": "32.05.1700" }
    ...
    for user_id in user_data:
      msg += "Ой, а вот у **%s** целых %d подходов %d раз" % (user.name, user_data[user_id]["counter"], user_data[user_id]["quantity"])
    Ответ написан
    2 комментария
  • Код бота на отправление сообщения работает, но бот не пишет в чат, как это исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Тут в коде нет никакой отправки сообщений. Об этом смотреть в Как сделать так, чтобы бот писал в канал вовремя (код прилагается)?

    И да, global msg убрать - оно тут не нужно совсем - а msg = 'Статистика:\n' переставить перед циклом.
    Ответ написан
  • Как сделать так, чтобы бот писал в канал вовремя?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно каким-то образом узнать id нужного канала. Самый простой способ: в клиенте Discord ПКМ->Копировать ID.

    Далее:

    my_channel = client.get_channel(ID_нужного_канала)
    await my_channel.send('Сообщение')
    Ответ написан
    Комментировать
  • Иногда внутри докера запросы выполняются по несколько секунд, почему так происходит?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Судя по симптомам, в докере тормозит DNS. При использовании Session IP проверяется один раз и потому проблем нет, а без сессий IP запрашивается при каждом запросе.
    Ответ написан
    Комментировать
  • Как в PuTTY пробросить публичный удалённый порт?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вероятно, используется SSHv1, который не умеет в any на remote tunnel? Что если зафорсить v2?
    Ответ написан
    Комментировать
  • Крупная БД на docker?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо использовать дата-контейнеры, это изначально плохая практика, спорная даже в тех редких случаях, когда их всё же используют.

    Дата-контейнеры использовали во времена, когда ещё не завезли пользовательских volume в докер, тогда типичным способом создания такого, не принадлежащего явно ни одному "тяжёлому" контейнеру", было создание лёгкого ничего не делающего контейнера, от оторого все тянули данные к себе.

    Сейчас же просто делаешь volume и всё. Но для базы данных нет никакого смысла делать volume, проще и надёжнее пробросить физический каталог.
    Ответ написан
    Комментировать
  • Формула вычесления GMT зоны?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    -2 часа это 24-2=22 часа
    Ответ написан
  • Как можно создать аккаунт Microsoft на чужой номер?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть варианты.

    Например, пользователь был владельцем этого номера сколько-то лет назад, уже перестал им пользоваться, номер уже принадлежит новому владельцу, но Microsoft об этом ничего не знает.

    Или номер был указан во времена, когда это не проверяли посредством SMS вообще, и может даже номер телефона был опциональным полем, которое спокойно можно было не заполнить или заполнить с ошибками. В конце концов, были времена, когда у Microsoft не было единого аккаунта, в разных базах могли быть самые разные данные, и при слиянии необязательный номер попало в обязательные.
    Ответ написан
  • Можно ли создав свой DNS сервер сделать свой бесплатный домен?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно ли бесплатно получить миллион долларов, напечатав банкноты на принтере? Тут примерно такой же случай.
    Ответ написан
    Комментировать