Задать вопрос
  • Как адаптировать код php под FreeBSD?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Просто вынести содержимое блока while(true) { ... } из цикла и убрать sleep, тогда вместо бесконечного цикла скрипт будет делать то же самое всего один раз. После этого скрипт можно гонять через cron.

    Вопрос чисто по php, остальные тэги лишние.
    Ответ написан
    Комментировать
  • Какие существуют способы бесплатной интеграции whatsapp в битрикс?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Бесплатных легальных сервисов для интеграции WhatsApp (т.н. WhatsApp Business API) нет. Есть нелегальные (не очень дорогие), основанные на имитации взаимодействия с WhatsApp Web, но с ними есть риск получить бан, так что как минимум особенно ценный номер телефона я бы таким в любом случае не доверил.
    Ответ написан
    Комментировать
  • Не запускается проект Github. Прошу помощи?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно не клонировать скрипт, а скачать его архивом, нажав Code-Download ZIP.

    Скрипт можно отредактировать локально, git для этого не нужен.

    В 18 строке падает из-за того, что скрипт берёт сенсор с индексом 1 (при нумерации с нуля), а массив сенсоров на этом компьютере имеет длину меньше 2, возможно даже, что нужные сенсоры ядро не понимает и список пустой. Вообще, скрипт, судя по этому месту, какой-то ацкий говнокод, который сломается просто от изменения порядка вывода сенсоров в модуле psutil. Фу на его автора.

    От себя советую избрать путь настоящего джедая: всё то же самое можно получать стандартными командами:

    Информация по процессорам: lscpu
    Информация по процессам: top или более красиво htop (выход у обоих по кнопке q)
    Информация по памяти: free -h
    Информация по сенсорам (температура, вентиляторы и всё такое): sensors
    Информация по месту на дисках: df -h
    Информация по блочным устройствам дисков: lsblk

    Доустанавливать надо будет только пакеты htop и lm-sensors.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Передавать нужную информацию в callback_data. Например, можно передавать add:артикул, который в обработчике парсить и по нему определять, что же именно добавить.
    Ответ написан
    2 комментария
  • Как запретить программе доступ в интернет?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    1. Фильтровать по владельцу: iptables -m owner -h

    2. Использовать cgroups и фильтровать по ним: iptables -m cgroup -h

    3. Использовать отдельный network namespace без доступа в интернет: ip help netns

    4. Использовать docker с none-сетью: docker run -it --net=none my_awesome_image_for_application
    Ответ написан
    1 комментарий
  • AIOGRAM - как отправить альбом с контентом из переменных?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Когда имеешь дело с функцией, которая хочет объект file, можно использовать io.StringIO ил io.BytesIO.

    Например:

    media.attach_photo(io.BytesIO(requests.get('http://foo/bar.jpg').content), 'Foo Bar')
    Ответ написан
    Комментировать
  • Как исправить эту ошибку? IndentationError: unindent does not match any outer indentation level?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Отступы в 3 и 4 строках разные, должны быть одинаковы. Почитай любой учебник по python для начинающих, там популярно объясняют, почему отступы в python так важны.
    Ответ написан
    Комментировать
  • Что написать в except ,чтоб программа не вылетала при неправильном вводе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Программа в случае ошибки не просто упадёт, а выкинет исключение. Его надо будет поймать и обработать.

    Например:

    try:
      int("1")
      int("-1")
      int("+1")
      int("hello")
    except ValueError as e:
      print (f"ValueError occured: {e}")


    Тут случится ValueError в последнем приведении к int, использование try ... except позволит его поймать, обработать и продолжить дальнейшую работу программы.
    Ответ написан
    Комментировать
  • Можно ли выйти сразу из всех функций?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Подобный вопрос: Прерывание рекурсии python 3?

    Однако это плохой способ, говорящий о плохой архитектуре программы. Исключения лучше использовать для ловли исключительных ситуаций, а подобные задачи решать иначе. Например, возвращать из функций результат или хотя бы признак успешного выполнения, который проверять на всех уровнях и передавать выше. А лучше подумать над тем, чтобы программа была по-другому устроена, в зависимости от задачи.
    Ответ написан
    2 комментария
  • Сallback_data. Python. Ошибка TypeError: send_message() got an unexpected keyword argument 'callback_data'?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    callback_data - свойство inline-кнопки, а не сообщения. Поэтому работать это и не может.

    keyboard = types.InlineKeyboardMarkup()
    keyboard.add(types.InlineKeyboardButton(text="Кнопка 1", callback_data="button1"))
    keyboard.add(types.InlineKeyboardButton(text="Кнопка 2", callback_data="button2"))
    bot.send_message(message.chat.id, "Нажми на кнопку - получишь результат", reply_markup=keyboard)
    
    @bot.callback_query_handler(func=lambda call: True)
    def button_callback(call):
      bot.send_message(call.message.chat.id, f"Ваша кнопка {call.data}")
    Ответ написан
    Комментировать
  • Почему не получается отправить сообщение пользователю?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В ошибке же всё написано - text должен быть строкой. Скорее всего, courses[course] - не строка.
    Ответ написан
    Комментировать
  • Как переслать сообщение от бота другому пользователю aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    call.message - это сообщение, с которого пришёл callback, разумеется, оно и есть "предыдущее". Нужно отправить новое сообщение с помощью send_message, этот метод вернёт это отправленное сообщение, дальше именно его и надо пересылать.
    Ответ написан
    Комментировать
  • Просмотр забытого пароля в Winscp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Предлагаю попробовать echo "%*"
    Ответ написан
  • Не видно InlineKeyboardMarkup. Что я сделал не правильно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если сначала отправлять сообщение, а только потом цеплять к нему клавиатуру, то клавиатура не будет отправлена.

    Вот тут:

    // внутри мы вызваем execute, который отправляет сообщение
    SendMessage sms = sendMsg(update.getMessage(), per);
    // к уже отправленному объекту сообщения мы цепляем клавиатуру
    sms.setReplyMarkup(getinlineKeyboardMarkup());
    // дальше с переменной sms мы ничего не делаем
    Ответ написан
    Комментировать
  • Как обработать исключение в потоке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как-нибудь так:

    web_urls = [...]
    attempts = 5
    for url in web_urls:
      for attempt in range(0,attempts):
        r = None
        try:
           r = requests.get(url)
        except requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout:
           if attempt < attempts-1:
             sleep(5)
           else:
             print (f"Oops request failed and no more attempts for {url}")
        if r:
          break


    Не надо ловить except без конкретизации ошибки и даже без вывода её. В крайнем случае надо её словить и показать, чтобы хоть было известно, что она происходила:

    try:
      ...
    except Exception as e:
      print (e) # а ещё лучше использовать модуль traceback
    Ответ написан
    Комментировать
  • Что хранится на файле gshadow и зачем редактировать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    man gshadow всё объясняет.
    Ответ написан
  • Как правильно изменить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    trending.text - это текст. Думаю, имелось в виду trending.json()
    Ответ написан
  • Как взять данные с двух таблиц?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Условие id=id2=ctx.author.id в зависимости от используемой базы может иметь как непредсказуемый эффект, так и вообще возвращать ошибку, потому что id=id2 возвращает булевое значение (true или false), которое затем сравнивается с ctx.author.id, что явно не планировалось. Вместо этого надо сделать два условия: id=id2 AND id=ctx.author.id. А ещё лучше переместить id=id2 в условие JOIN (таблица1 JOIN таблица2 ON условие)

    Далее, при работе с базой лучше использовать строки с плейсхолдерами, к этому следует приучать себя заранее, чтобы избегать рисков SQL-инъекций:

    cursor.execute("SELECT * FROM cars WHERE user_id=?", (current_user_id,))


    (В зависимости от базы данных плейсхолдер может быть не ?, как в sqlite3, а %s или что-то ещё)

    Далее, следует разумно выбирать имена полей в таблицах, чтобы их назначение было более понятным, а то что это за id и id2? Например:

    users:
    - id: id пользователя
    - name: имя пользователя
    - birth_date: дата рождения

    cars:
    - id: id автомобиля
    - owner_id: id пользователя-владельца (из таблицы users)
    - reg_number: гос. регистрационный номер
    - model: модель автомобиля

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

    cursor.execute("SELECT users.id AS user_id, users.name, cars.id AS car_id, cars.model FROM users JOIN cars ON users.id=cars.owner_id WHERE users.id=?", (ctx.author.id,))


    Запись (ctx.author.id,) с запятой в скобках нужна для того, чтобы вместо одного значения в функцию был передан tuple из одного значения. В python (1,2,3) означет tuple из трёх значений, но с одним значением такой синтаксис не прокатывает, (1) даёт то же, что и просто 1 без скобок, чтобы это обойти, надо поставить запятую (1,)
    Ответ написан
    Комментировать
  • Django & PostgreSQL MemoryError + не правильная работа скрипта?

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

    Как минимум следует начать хотя бы с такого:

    try:
      ...
    except Exception as e:
      print (e)


    Сейчас же, возможно, случается Exception, но мы этого даже не знаем.

    Далее, не стоит использовать ORM вперемешку с обычными запросами. Это тоже источник потенциальных проблем, ведь ORM может кэшировать данные, в том числе ещё не сохранённые. Возможно, до вызова save случился Exception, данные в кэше отличаются от данных в базе, но при прямом запросе в базу мы получим не то же самое, что получили бы из кэша.

    Вот такие мелочи могут создавать проблемы, которые при этом вообще нигде даже не отражается. И это ещё повезло, что эффект такой заметный. А если бы эффект проявлялся в одном случае из тысячи? Как бы его потом ловить и что отвечать пользователям, с которых списали лишних денег?
    Ответ написан
    Комментировать
  • У меня есть for который создает json файлы как сделать так что бы они создавались в нужной папке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    TARGET_DIR = "path/to/directory"
    
    for i in range(0, dlinaspiska):
      filename = os.path.join(TARGET_DIR, akki[i]+".json")
      with open(filename, "w") as outfile:
        json.dump(...)
    Ответ написан
    Комментировать