Задать вопрос
  • Нужен ли python для системных администраторов?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    Когда я и коллеги использовали python вместо баш?
    Когда потребовалось написать бекапилку конфигов на 8k сетевых устройст по snmp.
    Когда надо было набросать простой веб-интерфейс для дежурной смены для примитивного up/down и смену description на этих устройствах.
    Когда надо было проинтегрировать nagios-мониторилку с внешей сторонней базой данных.
    Когда на 600 виртуалок необходимо было поставить разные софтины, перечень и версии которых хранились во внешнем xml-файле
    Когда с увесистой пачки серверов понадобилось провести инвентаризацию типа sfp-модулей

    К чему я это? Если вам хватает bash, радуйтесь и используйте его. Когда будет надо, вы сами придете к python.

    На чистом баше вы замучаетесь делать веб-интерфейс к чему-либо, организовывать взаимодействие с внешними системами/программами, отличными от чистого linux (web, snmp, sql, email, ftp не разовое обращение), обрабатывать вводные данные к системе в форматах сложнее csv (html, xml, json), обрабатывать файлы в нестандартных кодировках, использовать нетекстовые переменные в скриптах (арифметика, дроби, списки, файлы). Боль начнется даже просто тогда, когда появятся файлы с названиями с нестандартными символами (?$!*\+alt-символы), а еще и в левой кодировке (привет mount ftp/samba/sshfs/ntfs и даже вложения к письмам). А еще больнее станет, когда размер своих скриптов превысит хотя бы 500 строк.

    И уже как бонус идет то, что python есть из коробки в deb/rhel дистрибутивах, многие системные утилиты написаны уже на нем. Плагин к apt/yum проще всего сделать на python, даже можно не парясь писать стартап скрипты к сервисам.
    Ответ написан
    Комментировать
  • Почему Python используют для написания нейронных сетей, а Ruby/Php/Perl нет?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Я бы мог сейчас начать перечислять длинный список преимуществ Python перед остальными языками и разжечь лютый холивар, но не буду. Самое главное преимущество Python перед другими языками - это предельно простое взаимодействие между кодом на Python и кодом на C\C++. Это даёт возможность писать простую и изящную логику в скриптах, а тяжёлые вычисления выносить в нативный код.
    Ответ написан
    Комментировать
  • Почему Python используют для написания нейронных сетей, а Ruby/Php/Perl нет?

    Astrohas
    @Astrohas
    Python/Django Developer
    Python славится тем что душить своих жертв перед проглатыванием

    .
    А если без шуток, то питон предоставляет нужные для этого вещи в удобном виде. Тут вам и функциональное программирование, императивное программирование, классы, мета-классы и тд. Так же немаловажно наличие крутых научных библиотек типа всяких numpy, scipy всякие оранджи.
    Ответ написан
    1 комментарий
  • Почему Python используют для написания нейронных сетей, а Ruby/Php/Perl нет?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    потому что Питон - это Cи с человеческим лицом, а что может быть быстрее Си ?
    Ответ написан
    3 комментария
  • Как обуздать Django messages?

    winordie
    @winordie
    Лучшая документация -- исходники
    Давайте посмотрим как работает framework messages.

    https://github.com/django/django/blob/master/djang...
    def messages(request):
        return {
            'messages': get_messages(request),
            'DEFAULT_MESSAGE_LEVELS': DEFAULT_LEVELS,
        }
    ...
    def get_messages(request):
        if hasattr(request, '_messages'):
            return request._messages
        else:
            return []

    Так messages попадают на страницу. Т.е. они берутся из request._messages. Как же они туда попадают?

    https://github.com/django/django/blob/master/djang...
    class MessageMiddleware(MiddlewareMixin):
        def process_request(self, request):
            request._messages = default_storage(request)
    ...
    def default_storage(request):
        return import_string(settings.MESSAGE_STORAGE)(request)
    ...
    MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'

    Значит в request._messages у нас лежит FallbackStorage(request)

    Перейдем к нашему коду
    messages.error(request, 'Ваш диапазон дат занят для данного объекта.')

    Что тут происходит? Посмотрим:
    https://github.com/django/django/blob/master/djang...
    def error(request, message, extra_tags='', fail_silently=False):
        add_message(request, constants.ERROR, message, extra_tags=extra_tags,
                    fail_silently=fail_silently)
    ...
    def add_message(request, level, message, extra_tags='', fail_silently=False):
        if not isinstance(request, HttpRequest):
            raise TypeError("add_message() argument must be an HttpRequest object, "
                            "not '%s'." % request.__class__.__name__)
        if hasattr(request, '_messages'):
            return request._messages.add(level, message, extra_tags)  # *** THIS ***
        if not fail_silently:
            raise MessageFailure('You cannot add messages without installing '
                        'django.contrib.messages.middleware.MessageMiddleware')

    Ага, вызывается метод add знакомого нам объекта FallbackStorage.
    Ему передается в качестве параметров:
    - level = constants.ERROR = 40
    - message = 'Ваш диапазон дат занят для данного объекта.'
    - extra_tags = ''

    Посмотрим на этот метод
    https://github.com/django/django/blob/master/djang...
    def add(self, level, message, extra_tags=''):
            if not message:
                return
            level = int(level)
            if level < self.level:
                return
            # Add the message.
            self.added_new = True
            message = Message(level, message, extra_tags=extra_tags)
            self._queued_messages.append(message)
    ...
    def _get_level(self):
            if not hasattr(self, '_level'):
                self._level = getattr(settings, 'MESSAGE_LEVEL', constants.INFO)
            return self._level

    Из этого кода можно сделать вывод что сообщение попадает в очередь сообщений если его уровень более или равен тому который задан в settings.MESSAGE_LEVEL (по умолчанию = contants.INFO = 20)

    Таким образом чтобы добавлялись только наши сообщения необходимо:
    1) в settings.py установить
    # settings.py
    ...
    MY_SUPER_ERROR = 80
    MESSAGE_LEVEL = MY_SUPER_ERROR
    ...

    2) Во вью писать
    if not available_cars:
            carstoshow = None
            messages.add_message(request, settings.MY_SUPER_ERROR, 'Ваш диапазон дат занят для данного объекта.')
            return redirect('car_detail', pk=car_used_id)
    Ответ написан
    1 комментарий
  • Redis vs SQLite vs PostgreSQL

    CKOPOBAPKuH
    @CKOPOBAPKuH
    Молоток vs Кувалда vs Отвёртка

    Я решил выяснить, какой из инструментов лучше. Представил одинаковую задачу — ударять себя по большому пальцу ноги. Отвёртку решил держать за ручку и ударять наконечником, так как неудобно держать за наконечник и ударять ручкой. Для молотка и кувалды это одинаковые схемы. Запросы: ударить по большому пальцу и измерить время, сколько болит.

    Результат: если ударить больно, то палец болит. В чём же тогда прелесть отвёртки? Понимаю, что она подходит для узконаправленных задач, например, только откручивание или закручивание, т.е. для ограниченных задач. В остальном одни минусы: и держать неудобно, и площадь поражения невелика, и по пальцу я попал только с третьего раза.

    PS: Что вы используете для надёжного перманентного отбивания пальцев? Холивар классический русский молоток vs молоток из икеи можно опустить, разницы между ними практически не будет.
    Ответ написан
    4 комментария
  • Что использовать, multithreading или multiprocessing?

    planc
    @planc
    multithreading - для операций ввода/вывода
    multiprocessing - для вычислений
    Ответ написан
    Комментировать
  • Как правильно завершить работу потоков по KeyboardInterrupt?

    tumbler
    @tumbler Куратор тега Python
    бекенд-разработчик на python
    https://docs.python.org/3/library/threading.html
    A thread can be flagged as a “daemon thread”. The significance of this flag is that the entire Python program exits when only daemon threads are left. The initial value is inherited from the creating thread. The flag can be set through the daemon property or the daemon constructor argument.

    Если обработка KeyboardInterrupt сама по себе не нужна, а хотите чтобы процесс по Ctrl+C завершался - объявите все потоки демонами.
    Ответ написан
    8 комментариев
  • Как работает __new__ в приведенном коде?

    Bobsans
    @Bobsans
    Full-Stack Developer
    __new__ из object'а вызвался бы в любом случае. Это и есть создание экземпляра объекта. Просто в данном примере мы его переопределили и вызываем super() для выполнения кода из метода __new__ родителя.
    В примере в __new__ передается cls. cls - это тип объекта, который необходимо создать.
    То же самое можно сделать и так:
    def __new__(cls):
        if cls.instance is None:
            cls.instance = object.__new__(cls)
        return cls.instance

    Или так:
    class ClassA:
       pass
    
    instance = object.__new__(ClassA) # <ClassA object at 0x0....>
    Ответ написан
    Комментировать
  • Ресурс для изучения паттернов проектирования на Python?

    un1t
    @un1t
    Марк Саммерфилд "Python на практике"
    Ответ написан
    Комментировать
  • Как связать сущности Like, Topic, Comment так, чтобы лайки можно было ставить и Topic, и Comment?

    usdglander
    @usdglander
    Yipee-ki-yay
    Ну а в чём проблема?
    Таблица связи likes
    entity - Имя сущности
    entity_id - id записи из соответствующей таблицы
    user_id - id пользователя, поставившего лайк

    или
    entity - Имя сущности
    entity_id - id записи из соответствующей таблицы
    count - количество лайков

    зависит от условий.
    Ответ написан
    Комментировать
  • Как настроить доступ по ssh только к определенной папке?

    semenenko88
    @semenenko88
    Системный администратор
    1) Создать пользователя
    2) Дать этому пользователю доступ только к определенной папке
    3) По ssh подключаться этим пользователем

    Или вам нужно чтобы локально этот пользователь имел доступ ко всему, а по ssh только к чему-то одному?
    Ответ написан
    1 комментарий
  • Как выглядит "прокачанный" аккаунт ГитХаб?

    27cm
    @27cm
    TODO: Написать статус
    Примеры:
    https://github.com/pepelsbey
    https://github.com/Samdark
    https://github.com/mdo

    Как заинтересовать работодателя:
    1. Аватарка. Да, она должна быть. Ещё лучше, если это будет ваша фотография. Если видишь в профиле дефолтную аватарку, возникает ощущение, что GitHub у человека всего лишь для галочки.
    2. Контактный email.
    3. Полоска активности должна быть зеленой (см. примеры выше), но в меру — не нужно стремиться окрасить каждую клеточку, отдыхать тоже нужно. Если заходишь в профиль, а салатовые клеточки изредка были год назад или наоборот появились только две недели назад, то страница работодателя не заинтересует.
    4. Ссылка на персональный сайт.
    5. Наличие собственных public репозиториев. Работодатель хочет увидеть ваш код, поэтому очень желательно наличие в них свежих коммитов. Каким должен быть отличный репозиторий на GitHub — тема для отдельного вопроса, тут напишу кратко: README, понятная структура, тесты, звезды.
    6. Наличие вклада в Open Source проекты. Мне доводилось встречать профили, в которых были выполнены все пункты выше, но тем не менее их владельцы были очень слабыми разработчиками. Наличие вклада в крупные проекты с открытым исходным кодом — это однозначно вин. Очень желательно, чтобы он у вас был.
    7. Stars, Followers, Following. Всё это тоже было бы неплохо завести. Если у вас много фолловеров на GitHub, значит скорее всего вы из себя что-то представляете в мире Open Source, раз другим интересно следить за вами.

    P.S.: Хороший профиль на github сам может выступать в роли резюме. Очень часто хедхантеры через него и выходят на тебя.
    Ответ написан
    4 комментария
  • Как снизить потери концентрации внимания?

    vitali1995
    @vitali1995
    Медитация 5-15 минут в день. Концентрация внимания на область лба, граничащую с переносицей. Этот трюк подгоняет кровь к той части префронтальной коры, которая отвечает за внимание и волю, что способствует её развитию. Оказывается, никакой мистики :)
    Ответ написан
    Комментировать