Задать вопрос
  • Как лучше поступить в данный момент?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Обьяснить довольно просто. Давите финансами.
    А насчет обучения думайте. Лучше конечно заочка и работа в оутсорс фирме. За 3-4 года поднимите свой уровень до мидла.
    В итоге через 3-4 года вы будете иметь

    * опыт работы и подтвержденные проекты
    * диплом
    * подушка по деньгам
    * какие то связи с однокашниками
    * возможно у вас в институте будут программы обмена студентами
    Ответ написан
    Комментировать
  • Что такое и зачем lpNumberOfBytesWritten в WINAPI функции WriteFile?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Дык английским же по белому написано - long pointer на переменную, в которой вернётся количество записанных байт.
    Ответ написан
    1 комментарий
  • Когда требуется использовать await при вызове async функции?

    Vindicar
    @Vindicar
    RTFM!
    Следует различать вызов асинхронной функции и её выполнение.
    В твоём случае, вызов work(p) завершится немедленно (без входа в тело функции), и вернёт объект Future.
    Этот объект описывает выполняемую асинхронную операцию (ввод-вывод, выполнение функции и т.п.).
    Затем следует запланировать выполнение этого объекта в рамках цикла реактора (loop в т ерминах asyncio).
    Для этого можно использовать два способа. Если ты находишься в синхронном коде, ты должен использовать loop.create_task() (или более старую функцию, loop.ensure_future()).
    Если ты находишься в асинхронном коде, то твоя текущая функция уже завёрнута в свой собственный Future, и уже выполняется в рамках цикла реактора. Тогда ты можешь использовать await для того, чтобы "уступить место" вызываемой функции - запланировать её выполнение в рамках того же цикла, что и вызывающая функция, а вызывающую функцию приостановить до завершения выполнения вызываемой. Либо, если тебе не требуется дожидаться результата выполнения вызываемой функции, можешь также использовать первый способ.

    Таким образом, когда ты "вызываешь асинхронную функцию через await", ты на самом деле получаешь future-объект и тут же планируешь его выполнение.
    Т.е.
    X = await foo()
    будет тем же самым что
    future_X = foo()
    #future_X можно хранить, но если он будет удалён без выполнения - это даст ошибку never awaited
    X = await future_X
    Ответ написан
    Комментировать
  • Существуют ли коммутаторы с возможностью изляции отдельных портов друг от друга?

    Да. Эта фича называется vlan.
    Должна быть во всех управляемых коммутаторах.
    Но как конкретно это реализовать - не подскажу.
    Ответ написан
  • Как сделать uptime, чтобы типа таймер шёл после запуска скрипта бота и показывал сколько времени работал бот discord py?

    Vindicar
    @Vindicar
    RTFM!
    Делать постоянно тикающий счётчик неэффективно и неудобно.
    Лучше просто при запуске бота сохрани текущее время в переменную.
    Когда у тебя запрашивают аптайм (т.е. в обработчике команды !uptime), вычти из текущего времени сохраненное в переменной - получишь интервал времени между ними. Это и будет аптайм. Останется только его отформатировать красиво.
    За подробностями смотри модуль datetime, типы данных datetime и timedelta.
    Ответ написан
    Комментировать
  • SyntaxError, как исправить?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Ну, во-первых в куске кода, который вы приложили, этой ошибки нет.
    Во-вторых, async - зарезервированное слово, не стоит его использовать не по назначению
    Ответ написан
    6 комментариев
  • Что происходит на рынке труда в айти?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    В программировании очень большой процент самостоятельной творческой работы и умению работать над собой, чтобы повышать свою квалификацию.
    Это требует определенных привычек, возможно склада ума. И проблема в том, что эти привычки к тому возрасту когда начинаешь работать обычно уже сформированы. Бесповоротно.
    Поэтому курсы могут дать какие-то знания, но если ты не тот человек, осилить профессию и адекватную работу будет крайне сложно. Разговоры о выгорании - 90% это когда человек не расположенный к профессии поиздевался над собой сперва на курсах, потом на какой-то работе, а потом надоело. Потому что душа к такому образу жизни не лежит. Да, конечно есть когда человек работает на износ, но опять же адекватный человек вовремя должен обратить на это внимание.

    А насчет легкости - нет, это совсем не легко. И если 10 лет назад было гораздо проще, сейчас стало в 10 раз сложнее. Требования повысились, конкуренция среди джуниоров повысилась.

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

    Vindicar
    @Vindicar
    RTFM!
    Это многопроцессность, а не многопоточность. Разница ОЧЕНЬ значительная, так как у разных процессов разные адресные пространства, и данные между ними приходится пересылать с сериализацией через pickle.

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

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Часто собеседую людей. Действительно толковых - единицы...
    Найти хоть более-менее разбирающегося в вопросе очень тяжело - и это я не лезу в высокие материи типа тонкостей использования семафоров в ядре линукс (как когда-то меня самого спрашивали при собеседовании на позицию разработчика python %) ), а спрашиваю про самые базовые понятия, с учетом того что если человек толковый и понимает то что сам говорит - то в остальном сам разберется...
    После курсов не помню никого кто бы смог пройти собеседование и заинтересовать.
    Так что про легкость входа в IT - это обычный маркетинг.
    Ответ написан
    3 комментария
  • Что происходит на рынке труда в айти?

    Zoominger
    @Zoominger
    System Integrator
    Существует ли реальная проблема нагруженности рынка труда людьми с курсов?

    Нет. Работал много где и мотаюсь по разным сферам, но из 3-4 сотен айтишников я не видел ни одного, кто заканчивал бы какие-то курсы и перешёл после этого в IT. Курсики - налог на глупость.
    Ответ написан
  • Во время произношения ассистент говорит "текст"None, как можно исправить?

    Vindicar
    @Vindicar
    RTFM!
    Что за ерунда у тебя в коде творится? Поучи азы Питона сначала, потом уже бросайся помощников писать...

    say_message("Здравствуйте, хозяин!" and "Рад снова вас видеть!")
    Как по твоему, что вот этот and должен значить? На самом деле, у тебя ВСЕГДА будет произноситься только второе выражение. and - это логический оператор в первую очередь. Его поведение для не-логических значений весьма специфическое.

    say_message("Как пожелаете"+str(right_mouse_control()))
    Оставляя за кадром вопрос "зачем", что возвращает функция right_mouse_control()? Она должна возвращать какой-то текст для произношения? Если должна, она явно этого не делает. Если не должна, то зачем ты засовываешь её возвращаемое значение в строку? Почему просто её не вызвать, вне рамок say_message()?
    То же самое для остальных вариантов ниже.

    Ну и простыня elif как вишенка на торте, да.

    EDIT: покажу, как можно это улучшить. Код сложный, но зато легко расширяется.
    Сделаем класс, который будет рулить списком известных команд и сопоставленными им фразами.
    Чтобы не пришлось повторяться, сделаем так, чтобы для добавления новой команды достаточно было
    написать функцию и задекорировать её. Пример будет ниже.
    class VoiceCommandList: #класс управляет списком голосовых команд
      def __init__(self):
        self.actions = list() #список известных классу команд
      
      def on(self, condition): #декоратор, подписывает функцию на голосовую команду
        if isinstance(condition, str):
          condition = condition.lower()
          predicate = lambda text: condition in text #если условие - строка, она должна входить в текст
        elif callable(condition):
          predicate = condition #если условие - функция, она должна вернуть истину для текста
        else: #ни то ни другое - ошибка
          raise TypeError('Condition must be either string or function!')
        #эта функция - декоратор, она будет помечать функции-команды.
        #она описана именно внутри метода on()!
        def decorator(command_func):
          self.actions.append( (predicate, command_func) )
          return command_func
        return decorator
      
      def run_command(self, text): #функция получает строку, определяет и вызывает соотв. её команду
        text = text.lower()
        for predicate, command in self.actions:
          if predicate(text): #текст соответствует известной команде
            try:
              response = command(text) #пытаемся выполнить команду
              if response is None: #если команда не сообщила нам, что ответить
                response = "Команда выполнена" 
            except Exception as err: #не получилось
              response = "Ошибка при выполнении команды"
              print(err)
            if response: #если есть какой-то ответ
              say_message(response) #то произносим его
            break #выполняем не более одной команды за раз
        else: #этот else относится к for, не к if! Если не нашли ни одной похожей команды
          say_message("Неизвестная команда")

    А теперь примеры использования класса. Мы можем добавлять команды, описав функции. Нет нужды править длинную простыню if-elif-else
    vcl = VoiceCommandList() #экземпляр списка команд
    
    #опишем реакцию на простую строку типа "привет".
    @vcl.on('привет') #если передаём в декоратор строку - это означает, что строка должна содержаться в тексте
    def hello(text): #функция-команда принимает аргумент - сказанный пользователем текст
      return "Доброе время суток" #она должна вернуть текст, который скажет бот
    
    @vcl.on('открой оперу')
    def start_opera(text):
      operaopen() #выполняем действие
      return "Браузер запущен" #возвращаем текст ответа
    
    @vcl.on('напиши')
    def write_message(text):
      print(text)
      #если ничего не вернём, будет отклик по умолчанию
    
    @vcl.on(lambda text: ('влево' in text) and ('вправо' in text)) #можно делать сложные условия!
    def what(text):
      return "Так влево или вправо?"

    Ну а чтобы скормить боту распознанную строку:
    vcl.run_command('привет') #сюда можно подставить выхлоп распознавателя речи
    Ответ написан
    8 комментариев
  • Как преодолевается потеря мотивации в ИТ?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    - Жениться
    - Взять ипотеку
    - Родить парочку детей
    (вовсе не обязательно в такой последовательности :) )
    После всего оного мотивации будет - выше крыши! :)
    Ответ написан
  • Где учится созданию ботов на python?

    Zoominger
    @Zoominger Куратор тега Python
    System Integrator
    Нигде. Читаете книжку по Пистону, читаете модуль для Telegram. Пишете.
    Ответ написан
    Комментировать
  • Нужно ли 40-летнему джуну уметь максимально много?

    @Neonoviiwolf
    Flutter developer
    До скок не учи, без опыта работы вы всегда будете джуном. Да и как ток спросят чуть сложнее основ, вы сразу завалитесь по любой выбранной вами теме
    Ответ написан
    Комментировать
  • Почему вызов функции вызывает ошибку?

    Vindicar
    @Vindicar
    RTFM!
    > on_press = BoxOneP()
    Ты присваиваешь параметр on_press результат вызова функции BoxOneP. Которая возвращает None.

    Может, всё-таки имелось ввиду просто "on_press=BoxOneP"?

    И да, что значит "ломает приложение"? Текст ошибки со стектрейсом с студию.
    Ответ написан
    2 комментария
  • Почему не работает цикл?

    @dmshar
    А что вы хотели сказать фразой (y*y < a) <= (y <= 8) ?? Тут слева проверяется менше-ли квадрат y значения а , и значение в скобках принимает ЛОГИЧЕСКОЕ значение True или False. Аналогично проверяется левая скобка. В результате получается загадочное выражение типа True<=False. Что-бы это означало?
    А со второй скобкой - еще интереснее. Результат аналогичного выражения - по итогу ЛОГИЧЕСКОЕ значение - сравнивается с 0, по сути со значением False. Это для чего?
    Ответ написан
    2 комментария
  • Почему код бота не работает на сервере?

    Vindicar
    @Vindicar
    RTFM!
    > ImageFont.truetype('arial.ttf', size=20)
    А файл со шрифтом присутствует и доступен боту?
    > f'{path}\\user_card.png'
    os.path.join() и pathlib для кого придумали? Под линуксом разделитель каталогов не \ а /.
    Ответ написан
    5 комментариев
  • Почему request.user равен AnonymousUser?

    fox_12
    @fox_12 Куратор тега Django
    Расставляю биты, управляю заряженными частицами
    Если посмотрите у себя в settings.MIDDLEWARE,
    то увидите к примеру django.contrib.sessions.middleware.SessionMiddleware
    которая берет из кук сессионную куку, и добавляет данные сессии к запросу:

    session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
            request.session = self.SessionStore(session_key)


    а затем там же django.contrib.auth.middleware.AuthenticationMiddleware, в котором если покопаться - то можно найти как получается пользователь из сессии, которую мы добавили к запросу в предыдущем middleware. Я просто не буду перечислять все шаги - иначе это будет тема отдельного длинного поста.
    Просто походите по MIDDLEWARE и AUTHENTICATION_BACKENDS - да посмотрите что откуда берется. У вас может быть некий свой набор...
    Поэтому если у вас в куке не прилетел параметр сессионной куки - тупо в request.COOKIES нет параметра settings.SESSION_COOKIE_NAME который по дефолту называется sessionid- то и пользователю взяться неоткуда.
    Поэтому копайте точнее что там вам прилетает. Если возможности сохранять сессионную куку нет - то можно к примеру в урл редиректа добавлять некий хеш, по которому можно получать пользователя, написав свой middleware если требуется...
    Ответ написан
    5 комментариев