Задать вопрос
  • Насколько реально нужен консул девопсу?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никто не заставляет использовать docker, systemd, ansible и вообще какие угодно системы оркестрации и оптимизации. Необязательно делать шаблоны конфигов или кластерные конфигурации сервисов, необязательно использовать библиотеки настраиваемого логгирования, возиться с балансерами и реприцируемыми базами. Но люди это делают, значит, смысл всё-таки есть?

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

    Консул - это тоже инструмент. Вряд ли хоть кто-то использует его возможности целиком и полностью, тем более что никто не заставляет. Кому-то достаточно того, что у него все сервисы зарегистрированы в одном месте и из коробки имеют автоматическое DNS-имя вида NAME.service.consul. Кто-то использует kv-хранилище для хранения параметров, а кто-то хранит в нём секреты и целые конфиги, настраивает токены с различными acl и скрещивает всё это с consul-template. Вообще, необязательно использовать именно консул, есть и другие инструменты для подобных задач. Например, zk/etcd.

    Консул чаще используют совсем не с ансиблом, а с инструментами оркестрации, в которых сервисы могут расширяться и сворачиваться, перезагружаться и мигрировать. Скажем, пусть у нас есть условный сервис rabbitmq на три ноды. Тогда у нас может быть три контейнера rabbitm{1..3}, при запуске они регистрируются в консуле скриптом запуска вместе с проверками, а далее consul отдаёт их все три в виде имени rabbitmq.service.consul. Если какой-то из них вдруг упадёт, consul оперативно это обнаружит и исключит из DNS проблемный узел. Если вдруг управляющий всем этим администратор или автоматическая система оркестрации посчитает нужным добавить новые узлы или перенести их куда-то ещё в кластере, то consul также отразит все нужные изменения. При этом использующее rabbitmq приложение должно будет знать только адрес rabbitmq.

    Конечно, любую задачу можно обвесить скриптами, костылями и даже самописными плейбуками без использования готовых инструментов, а потом повторно решать десятки задач, которые уже сто раз решены до тебя опытными людьми, но зачем?
    Ответ написан
    1 комментарий
  • Как вывести сообщения по очереди?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Любой учебник по python, искать раздел про цикл for.
    Ответ написан
    Комментировать
  • Как исправить ошибку SQLite3, Discord Bot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотри, допустим, emoji у тебя равно :duck:, тогда будет выполнен следующий запрос:

    INSERT INTO emo VALUES (:duck:)

    А надо было:

    INSERT INTO emo VALUES (':duck:')

    Теперь понятно?

    Ладно, допусим, ты вставишь в запрос кавычки, дальше кто-нибудь добавит в код эмодзи кавычки и сможет заставить скрипт выполнить такой запрос:

    INSERT INTO emo VALUES ('');DROP TABLE emo;--')

    После чего таблица emo будет удалена. Нельзя просто так вставлять в запрос то, что передаёт пользователь. Надо использовать плейсхолдеры:

    cursor.execute("INSERT INTO emo VALUES (?)", (emoji,))


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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По умолчанию Discord не присылает события on_member_join, для этого надо явно включить member intents.

    intents = discord.Intents.default()
    intents.members = True
    client = commands.Bot(command_prefix='!', intents=intents)
    Ответ написан
    Комментировать
  • Как стилизовать вывод данных в консоли?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В общем случае см. man console_codes.
    Ответ написан
    Комментировать
  • Какую информацию про неизвестный угол надо добавлять, чтобы его можно было точно определить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что площадь равна половине произведения длин этих сторон на синус угла между ними, а угол может быть острым или тупым с одним и тем же значением синуса. Например, если стороны равны 1 и площать 1/4, то уголь может быть 30 градусов или 150 градусов.
    Ответ написан
    Комментировать
  • Сменить ID профиля ВКонтакте в базе данных ВК?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, id пользователя неизменен. Можно только удалить пользователя и создать нового, тогда его id будет другим.
    Ответ написан
    Комментировать
  • Multiprocessing читает каждую строчку из txt файла на каждом процессоре?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Один из самых простых способов это сделать - назначить каждому процессу из N штук свой номер и пусть первый читает строки 1, N+1, 2N+1, ..., второй 2, N+2, 2N+2, ... и так далее. Строки других процессов просто пропускать.

    # number - номер процесса от 0 до total-1
    # total - всего процессов
    def process(number, total):
       for i, l in enumerate(f):
          if i % total == number:
              ...
    Ответ написан
    Комментировать
  • Как получить сообщение канала telegram в переменную (парсер)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если канал свой (или есть связи с владельцами), то можно подписать на него своего бота и ловить события. Использовать обычные библиотеки для Bot API (telebot, aiogram итд).

    Если канал чужой, то бота подписать не получится, необходимо использовать клиентский API, изображающий обычного пользователя (библиотеки telethon, pyrogram).
    Ответ написан
  • Как из string сделать list Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Даже если обернуть last_name в кавычки, это не будет валидный json, потому что в json кавычки должны быть двойные. Самый простой способ это решить - использовать ast.literal_eval - так как указанный код является валидным кодом на python:

    import ast
    s = "[{'name': 'Рулон', 'last_name': 'Обоев'}, {'name': 'Лежана', 'last_name': 'Раздвиногова'}]"
    print (repr(ast.literal_eval(s)))


    Почему не просто eval? Потому что это более безопасно. Если в качестве "данных" нам прилетит

    os.system("rm -rf /some/file")

    то eval выполнит этот код и удалит файл как ни в чём не бывало, а ast.literal_eval кинет исключение.
    Ответ написан
    Комментировать
  • Как починить код запуска программы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Судя по всему, речь идёт о боте для Discord? Этот код не будет работать. И довольно очевидно, что с твоим текущим уровнем знаний Python шансов заставить это работать нет.
    Ответ написан
    Комментировать
  • BadRequest: Unsupported parse_mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Скорее всего, в недрах create_bot (который не приведён в вопросе) используется parse_mode с неверным значением.
    Ответ написан
    Комментировать
  • Можно ли добавить два одинаковых бота в один аккаунт в телеграмме?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, нельзя.
    Ответ написан
    Комментировать
  • Как обратиться к бд если она занята другой программой?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как вариант, создаётся lock file рядом с базой, и все процессы, которые с ней работают, ставят эксклюзивную блокировку перед любой операцией с базой, а после её выполнения её снимают. Но всё же рекомендую перейти на самостоятельную СУБД.
    Ответ написан
    Комментировать
  • Маршрутизация 2 eth с перенаправлением?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сервер не отправляет "с основного eth1". Интерфейс для отправки выбирается в процессе маршрутизации, а не до неё.

    ip route add 79.79.79.9 via шлюз_в_сети_где_адрес_78.78.78.3


    Это изменит в рантайме, после перезагрузки / переподключения к сети маршрут слетит и его надо будет прописывать заново. Чтобы поднимался автоматически, надо смотреть, какой механизм управления сетью используется (ifupdown/netplan/network-manager/network-scripts/dhcp client/итд/итп), и решать в зависимости от.
    Ответ написан
    Комментировать
  • Как получить фото с помощью телеграм бот api?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Они там поленились документацию написать. Но нетрудно понять, что следует использовать метод downloadFile https://github.com/TelegramBot/Api/blob/master/src...
    Ответ написан
    Комментировать
  • В чём ошибка определения переменной экземпляра?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Рекомендую напечатать id объектов, сразу станет видно проблему:

    for i in range(11):
      print (f"`{i} {id(g[i])}")
      for j in range(7):
        print (f"  `{j} {id(g[i][j])}")
        #deb.write(str(i)+"-"+str(j)+" "+str(g[i][j].x)+" "+str(g[i][j].y)+"\r\n")


    кусочек вывода
    `0 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112
    `1 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112


    Все элементы списка длины 11 по первому индексу ссылаются на один и тот же массив длины 7

    Ошибка тут в том, что выражение

    some_list * 11

    конструирует список из 11 ссылок на один и тот же массив. Который на последней итерации цикла получает x=10 во всех элементах.

    Решить можно, например, так:

    g = []
    
    for i in range(11):
      g.append([])
      for j in range(7):
        g[i].append(Point(i, j))


    В python все объекты передаются по ссылке, и это надо учитывать, а при необходимости копировать их явно.
    Ответ написан
    Комментировать
  • Как мне сделать такую статистику на discord.py?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Видно же, что это голосовые каналы.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если по ссылке, то надо передать ссылку в URL: ...&document=ссылка

    Если файл лежит локально, то передать файл в multipart/form-data, как-то примерно так: https://curl.se/libcurl/c/postit2.html
    Ответ написан
    Комментировать