Задать вопрос
  • Как перевести строку в html flask?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Чтобы шаблонизатор flask так не делал, надо использовать фильтр safe.

    {{ url_for('static' filename='...')|safe }}

    См. также документацию.
    Ответ написан
  • Как запустить докер с бинарником скомпилированным из го?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Почему в ENTRYPOINT делается chmod? Надо просто ./client или даже полный путь /app/client.
    Ответ написан
  • Как делают прогресс бары закрепленные внизу?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    man console_codes

    Читаем про коды, которые перемещают по экрану (ESC[x;yH), меняют цвета (ESC[x;y;zm) и всё такое. Также обратить внимание на scroll region (ESC[top;bottomr), сохранение и восстановление положения курсора (ESC[?s, ESC[?u). Размер терминала можно получить с помощью ioctl TIOCGWINSZ (низкоуровневый вариант) или функции get_terminal_size модуля shutil, изменение размеров терминала в процессе работы можно отслеживать с помощью сигнала SIGWINCH.
    Ответ написан
    Комментировать
  • Как через url отправить сообщение боту в телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, в upd всё верно написано, надо сначала получить chat_id. Это можно сделать, отправив боту любое сообщение, а потом с помощью вызова .../getUpdates его получить. В сообщении будет искомый chat_id. Далее можно на этот chat_id посылать сообщения. Если это всё для того, чтобы просто посылать в телеграм себе оповещения, то держать постоянно запущенного бота и не нужно, достаточно дёргать sendMessage по необходимости.
    Ответ написан
    Комментировать
  • AIOgram, как лучше обновить код рассылки, чтобы она не останавливалась из-за Flood control?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо использовать time.sleep в асинхронном коде, это блокирует event loop! Вместо этого надо использовать асинхронный вариант asyncio.sleep.

    По существу с таким кодом будет делаться 10 отправок в секунду, а официально лимит 30 в секунду. Но лучше бы дополнительно отлавливать исключение с flood control и по нему делать дополнительный sleep хотя бы на 1 секунду, а то и чуть больше, чтобы счётчик числа попыток на стороне Telegram обнулился за это время.
    Ответ написан
    Комментировать
  • Как передать картинки в Телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Комментировать
  • Как объединить 'Привет' и message.text?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    bot.send_message(message.chat.id, 'привет '+message.text)

    или
    bot.send_message(message.chat.id, f'привет {message.text}')
    Ответ написан
    3 комментария
  • Ошибка при работе с модулем scapy Python Debian?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    "Сниффить" может только root.
    Ответ написан
    5 комментариев
  • Как лучше и правильно использовать gettext?

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

    Надо либо переключать язык на язык конкретного пользователя во всех нужных местах (что приведёт к частым переключениям и до кучи несовместимо с асинхронным кодом), либо использовать gettext в режиме class-based API.

    Похожий вопрос Как сделать мультиязычным приложение python?
    Ответ написан
    Комментировать
  • Как проверить JSON на обновления?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    upd: Каждый объект и каждый запрос имеют ID.
    ID каждого объекта больше предыдущего на 1.


    Помнить самый большой из id уже возвращавшихся, при каждом запросе проверять, нет ли id больше запомненного. Запросы делать с определёнными интервалами (sleep), чтобы их число в единицу времени не превышало лимитов (наприммер, если разрешено максимум 10 запросов в минуту, то нужно сделать интервал не меньше 6 секунд).

    Между прочим, getUpdates в библиотеках telegram используют примерно так же. Более того Bot API позволяет указать в параметре offset нужный id, чтобы в ответ вернулись только более новые.
    Ответ написан
    Комментировать
  • Как дать python программе права администратора?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Довольно кроссплатформенный способ запросить права администратора реализует модуль https://pypi.org/project/elevate/
    Ответ написан
    2 комментария
  • Как прикрутить чат телеграм в модальное окно или просто на сайт?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Например,

    1. Сделать приватный канал, в который постить полные тексты публикаций. Соответственно, не подписавшись на этот канал, полный текст не увидеть.

    2. Сделать, чтобы полные тексты показывал бот, в который кидать идентификатор публикации через deep link, в боте проверять подписку.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для этого порт надо пробрасывать как tcp, не http/https.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    input - синхронная функция, она блокирует event loop. Для работы с консолью можно использовать асинхронную функцию ainput из модуля aioconsole.

    import asyncio
    from aioconsole import ainput
    
    async def main():
      s = await ainput('Enter something: ')
      print (f"You entered {s}")
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    Ответ написан
    Комментировать
  • Почему пишет значение NULL в столбце "id" если примаре кей?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    primary key и не обязан "сам заполняться" ни в одной базе. Даже в mysql это отдельная фича - auto_increment. А тут для этого нужен sequence или serial. См. например тут: https://www.postgresqltutorial.com/postgresql-serial/
    Ответ написан
    1 комментарий
  • Как правильно работать с большим количеством данных?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    70 Гб - это вообще не гигантский объём. Люди оперируют террабайтами и даже больше. Главная проблема не в объёме таблицы, а в том, чтобы не читать её целиком (full scan) при выполнении запроса. И вот тут главная фигня: одно только условие like '%слово%' в любом случае требует просмотреть каждую строку, значит, будет full scan. Обычные индексы по этому полю строить бесполезно. Есть всякие полнотекстовые, но в общем случае их тоже надо правильно готовить, чтобы работало приемлемо. Решение может зависеть от задачи. Например, если это ключевые слова в виде текстовой строки с пробелами или иными разделителями, то их можно вынести в отдельную таблицу отдельными строками и проиндексировать там, полнотекстовый поиск тут будет излишним.
    Ответ написан
    1 комментарий
  • Как вывести на экран приветствия в Linux Mint ip адрес?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    LinuxMint использует lightdm и slick-greeter. Как пишут в интернетах, там нельзя поменять текст сообщения, хотя можно скрыть hostname и настроить ещё немного опций. Чтобы чего-то сообщать юзерам, народ извращается с xmessage, zenity, gdialog и прочими инструментами, например.

    Вот в gdm можно поменять сообщение. Можно поменять используемый display manager в своей системе. Или только greeter. Это же Linux, тут много чего можно поменять по вкусу.
    Ответ написан
    Комментировать
  • Определение оператора сотовой связи и региона по номеру мобильного телефона, как сделать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В России есть Россвязь, которая распределяет номерную ёмкость по операторам. Эта информация публична, можно скачать машиночитаемые выгрузки у них на сайте: https://rossvyaz.gov.ru/deyatelnost/resurs-numerac...

    Далее, в России есть MNP, позволяющий переносить мобильный номер от оператора к оператору. Но только в пределах региона. Поэтому если задача по номеру определять только регион, то она надёжно решается указанными выше выгрузками. Оператора по ним определять ненадёжно, так как ежедневно много номеров меняют оператора, и любые данные быстро устаревают.

    Оператором базы данных перенесённых номеров (БДПН) является ЦНИИС, на его сайте можно получить текущего оператора только по конкретному номеру: https://zniis.ru/bdpn/check/ а обновляемый доступ ко всей базе простым смертным не получить.

    Чтобы понимать масштаб проблемы, сейчас в России ~14.7 млн. перенесённых номеров, за вчерашние сутки ~9.5 тыс. номеров поменяли оператора и ~1.5 тыс. вернулись из списка перенесённых к своему родному оператору.

    Таким образом, никакого смысла в подобном сайте без обновляемого доступа к БДПН (а она обновляется каждые 2 часа) нет.

    Что касается технической реализации, то тут всё достаточно просто, если у тебя есть доступ к БДПН. ЦНИИС публикует раз в сутки Numbering_Plan, аналогичный выгрузке DEF-9xx.csv Россвязи (формат отличается, но смысл тот же - диапазоны, каждый назначен оператору+региону), также публикует раз в сутки Port_All с полным списком MNP. Если не нужно поддерживать (для простоты) частые (каждые 2 часа) обновления, то этого достаточно. Любой номер сначала проверяем на наличие в Port_All, если не нашёлся - ищем подходящий диапазон в Numbering_Plan.
    Ответ написан
    Комментировать
  • Аренда Ip у провайдера и подключение его к серверу в датацентре?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    BGP оперирует не IP-адресами, а автономными системами, которые должны быть не менее чем /24 (256 адресов). Судя по всему, у вас нет своей AS, а адреса принадлежат провайдерам.

    Я вижу только один способ сохранить прям те же самые адреса: сервер поместить в датацентр, а на старом месте оставить недорогой сервер для проброса нужных портов в целевой сервер в датацентр. Лучше подобное воспринимать как временное решение, всё переносить на новый IP сервера, переводить туда клиентов и всё такое, чтобы в дальнейшем когда-нибудь от лишних провайдеров отказаться.

    Если у оператора есть точка присутствия в датацентре, а текущий договор на юрлицо, то можно попробовать официально договориться с ним о том, чтобы подключиться к нему в датацентре и перености IP, но у оператора моугт быть (и скорее всего будут) свои нюансы устройства сети, которые это не позволят.
    Ответ написан
    Комментировать