• Альтернатива Excel для рисования таблиц?

    @rostislav-zp
    может не совсем по теме,но этот урок мне очень помог(Рисуем графики Highcharts (Highstock) по данным из MySQL ) unboxit.ru/blog/63-risuem-grafiki-highcharts-highs...
    а вообще еще это прочитайте
    https://habr.com/ru/post/246907/
    Ответ написан
    Комментировать
  • Можно ли использовать Raspberry Pi как небольшой домашний сервер для небольших задач?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Потянуть-то потянет, даже докер там развернёте. Но по памяти будет тесненько и ввод/вывод на флешку или что вы там подключите через USB будет довольно медленным.
    Но нафига вся эта машинерия - не ясно.
    Понятно, если бы мутили какой-нибудь умный дом и нужна локальная админка.
    Понятно, если на малинке поднять самопальный NAS (хотя медленный же...), понятно если торрентокачалку с DLNA, чтобы киношки через смарт-тв локально смотреть.

    Сервер на поиграться тоже можно, но сейчас VDS на лоу-костере обойдётся в 150-170р/мес (одно ядро, гиг оперативы и 20 гигов диска). При этом на ней белый айпишник, вы на ней поднимите в контейнерах VPN, телеграм-прокси, по ssh откуда угодно туда ходить можно и не возиться с NAT'ами домашнего провайдера.
    Занимаетесь вебом - иметь постоянную виртуалку для экспериментов, ИМХО, маст хев.
    Ответ написан
    Комментировать
  • Python для начинающих: Какой учебник посоветуете для создания GUI?

    Гайд https://www.riverbankcomputing.com/static/Docs/PyQt5/
    Здесь много хороших уроков python-3.ru/page/into-pyqt5
    Отличная книга zetcode.com/gui/pyqt5
    Большое количество примеров: 1.pyqtforlinguists.appspot.com/book.pdf
    Ответ написан
    Комментировать
  • Как объединить два словаря?

    Как объединить два словаря?

    dict1 = {"a":"b"}
    dict2 = {"c":"d"}
    dict3 = {**dict1, **dict2}

    Результат:
    dict3 = {'a': 'b', 'c': 'd'}
    Ответ написан
    Комментировать
  • Как осуществить связь счетчика RS485 с базой данных?

    Oxyd
    @Oxyd
    Linux enthusiast
    Да, есть интерфейсы проброса RS-232 / RS-485 по Ethernet. Самый известный производитель -- Moxa. Разумеется к одному порту 485 можно подключать несколько усройств. А вот, собственно, всякоразные конвертеры в Ethernet.
    Ответ написан
    3 комментария
  • Как передать logging из импортированных модулей в основную программу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Чтобы правильно использовать модуль logging, нужно во всех своих модулях содавать логгеры следующим образом:
    import logging
    log = logging.getLogger(__name__)

    В модулях, которые не запускаются сами по себе, никакого другого кода инициализации и настройки логирования не требуется.
    Если вы в своём модуле желаете различать два или более вида логов, то можно сделать как-то так:
    log = logging.getLogger(__name__)
    class MyModel:
        log = logging.getLogger(__name__ + '.MyModel')
        # ...

    В этом случае для этого класса будет свой логгер со своим именем.
    Также логгер можно создавать в метаклассе давать ему имя класса автиоматически, тогда каждый потомок будет иметь свой логгер со своим именем.
    Однако все эти логгеры ничего не знают о файлах и потоках, куда будут попадать их логи. Все фильтрации и перенаправления будут делаться в единой конфигурации логгирования в основной программе.

    В главном запускаемом файле кроме обычного создания логгера как во всех модулях будет ещё и инициализация и настройка системы логирования.
    В самом простом виде это что-то вроде такого:
    if __name__ == '__main__':
        logging.basicConfig(stream=sys.stderr, level='INFO', format='%(asctime)s %(levelname)-7s %(message)s')

    Тут говорится, что все логи уровня >= INFO будут в указанном формате направлены в stderr.

    В более сложном случае вы можете загрузить настройку логирования из конфигурационного файла или описать кодом:
    if __name__ == '__main__':
        # У вас может быть несколько разных способов форматировать код для разных мест:
        formatter_simple = Formatter(u'%(relativeCreated)08d %(levelname)-7s %(message)s')
        formatter_complex = Formatter(u'%(asctime)s %(levelname)-7s [%(filename)21s:%(lineno)-4d] %(message)s')
        # Несколько разных хендлеров для перехвата нужного вида сообщений и отправки в правильное место:
        handler_null      = logging.NullHandler()
        handler_screen    = handler(fmt=formatter_simple, stream=sys.stderr)
        handler_main_file = handler(
            fmt=formatter_complex,
            cls=logging.handlers.TimedRotatingFileHandler,
            when='midnight',
            backupCount=5,
            encoding='utf-8',
            filename=local_path('log/server.log'),
        )
        handler_errors_file = handler(
            fmt=formatter_complex,
            cls=logging.handlers.TimedRotatingFileHandler,
            when='midnight',
            backupCount=5,
            encoding='utf-8',
            filename=local_path('log/errors.log'),
            level='ERROR',
        )
        # А потом описываем сами логгеры:
        #   это корневой логер, пропускает все сообщения через себя насквозь и в то же отдаёт их своим хендлерам
        log_root       = logger(None, level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
        #   этот логер перехватывает логи торнадо-приложения, пропускает через себя и отдаёт хендлерам:
        log_app        = logger('tornado.application', level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
        #   этот собирает логи событий модели уровня выше или равного INFO (не отладочные) 
        #     и отдаёт соответствующим хендлерам, дальше для обработки свои сообщения не пускает
        log_events     = logger('app.model.events',     level='INFO',  propagate=0, handlers=[handler_errors_file, handler_events_file])
        #   этот логер съедает и отдаёт спец-хендлеру (он не показан выше, но должен быть) все логи http доступа
        log_websrv     = logger('tornado.access',                    level='DEBUG', propagate=0, handlers=[handler_websrv_file])
        #    этот логер глотает и гасит за ненадобностью все логи, которые генерит библиотека PIL при работе с PNG-файлами
        log_pil        = logger('PIL.PngImagePlugin',                level='INFO',  propagate=0, handlers=[handler_null])

    Если сообщение не перехвачено и не остановлено специфичным логером, оно улетает корневому логеру.
    Ну примерно как-то так.
    Само собой всю эту настройку лучше вынести в отдельный модуль и запускать при старте главного файла.
    Логеры вроде log_pil, log_websrv и прочих сохранены в отдельные переменные, но по факту в коде эти переменные нигде не используются. Их можно и не присваивать вовсе. В модуле логирования все логгеры регистрируются глобально в списке и поэтому в каждом модуле не требуется ничего импортировать, достаточно создать логгер по имени. По этому имени логер ищется среди созданных или автоматом создаётся новый. Имена логгеров используют точечную нотацию, и по ступеням имени их удобно фильтровать.

    Такой подход имеет свои недостатки (синглтон, неявное описание, толерантность к ошибкам), достоинства его весомы: отсутствие ада зависимостей (когда непросто или невозможно определить ациклический порядок создания логеров), гибкость настройки, изоляция (возможность перекрытия и фильтрации не влезая в код логирования).

    P.S.
    Старайтесь не использовать CamelCase в именовании файлов проекта. Не смотря на то, что негласное это правило часто нарушается даже популярными библиотеками, всё же это часто создаёт лишнюю неразбериху и проблемы.
    В частности много геморроя можно поиметь переименовав файл сменив лишь регистр символа под контролем версий при работе с репозиторием на разных файловых системах. В винде, к примеру, регистр в именах сохраняется, но системой не различается, а в линукс различается. Таким образом винда не увидит переименования, а линукс увидит. Это может породить адский треш.
    Ответ написан
    Комментировать
  • Обход блокировки юзера (Ошибка 403: bot was blocked by the user)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    try:
      ...
    except telebot.apihelper.ApiException:
      ...
    Ответ написан
    Комментировать
  • Как конвертировать дату в нормальный формат?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Ну если прям 100% всегда одинаковый вариант у всех дат, то можно и захардкодить:
    In [1]: from datetime import datetime
    
    In [2]: date_inp = 'Mon, 02 Mar 2020 13:30:00 +0300'
    
    In [3]: date_obj = datetime.strptime(date_inp, '%a, %d %b %Y %H:%M:%S %z')
    
    In [4]: date_outp = date_obj.strftime('%Y-%m-%d')
    
    In [5]: date_outp
    Out[5]: '2020-03-02'

    Ну лучше чет типа dateparser.
    Ответ написан
    2 комментария
  • Где лучше всего пройти курсы по Python?

    Выбирайте. Все три варианта бесплатные:
    Ответ написан
    4 комментария
  • Как можно модернизировать?

    @anerev
    Собрав самых известных хакеров континента все пришли к выводу что ваш код совершенен. Не хотели бы вы устроится в google ?
    Ответ написан
    1 комментарий
  • Почему появляется ошибка permission denied?

    merryjane
    @merryjane
    Системный администратор
    Залогиньтесь под проблемным пользователем:
    su -l apache -s /bin/bash
    и проверьте руками есть ли у него права на чтение:
    cat /var/www/ssl/server.crt
    Ответ написан
    Комментировать
  • Как в Python 3.6.5 вывезти список с нумерацией?

    planc
    @planc
    items = ['молоко', 'сыр', 'творог', 'кефир', 'яблоко']
    for i, item in enumerate(items):
        print(i + 1, item)
    Ответ написан
    Комментировать
  • Как запустить этот regex на Python?

    tumbler
    @tumbler Куратор тега Python
    бекенд-разработчик на python
    results является списком, его нельзя плюсануть к строке.
    Ответ написан
    6 комментариев
  • Можно ли на bash стелать табличку из выходных данных?

    @q2digger
    никого не трогаю, починяю примус
    ~  cat file.txt
    1
    one
    2
    two
    3
    tree
     ~  awk '{printf "%s" (NR%2==0?RS:FS),$1}' file.txt
    1 one
    2 two
    3 tree
     ~ 
    Ответ написан
    7 комментариев
  • Какие сейчас есть хорошие IDE для Linux c отладкой?

    DevMan
    @DevMan
    pycharm, wing ide.
    Ответ написан
    Комментировать
  • Как подключится к VPN L2TP серверу (Mikrotik) за NAT если все порты открыты?

    @Scorpiored88 Автор вопроса
    Это личися правкой реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent , а именно добавлениям туда параметра AssumeUDPEncapsulationContextOnSendRule со значениям 1 или 2.
    И не забываем после этого перегрузить ПК
    Ответ написан
    Комментировать
  • Как работать с работающим контейнером Docker?

    @Kroid
    В работающий демоном контейнер залезть можно:
    docker exec -it container_name /bin/bash
    Этим мы запустим bash процесс внутри контейнера и подключимся к нему. Выйти из контейнера через команду exit.
    Ответ написан
    Комментировать