• Можно ли как-то разблокировать профиль Windows программно из python?

    NeiroNx
    @NeiroNx
    Программист
    Нужен драйвер виртуальной клавиатуры, потому что после dll.LockWorkStation() начинает работать другой контекст, в который keyboard.send('enter') никогда не попадет - по причинам безопасности. А если использовать драйвер - то он будет виден системе как клавиатура, а не как передача команд в текущий пользовательский контекст.
    Ответ написан
    9 комментариев
  • Почему это так работает?

    @OlegPyatakov
    pyatakov.com
    Во-первых, global deque - это не про многопоточность, а про видимость переменных.

    Во-вторых, ошибка на самом деле есть в этой части кода:
    if r not in deque:
          deque.append(r);

    Потенциальная ошибка может появиться во в этом месте, если будет гонка между потоками. Если добавить в этом месте минимальный time.sleep (или другую "затратную" по времени операцию), то все сразу начинает ломаться. Сходу не готов сказать, почему без time.sleep в немодифицированном случае не происходит ошибки (вероятно связано с работой рантайма и GIL). Тем не менее то, что поток не уйдет в сон в этом месте, не гарантируется рантаймом и закладываться на это нельзя.

    Чтобы увидеть ошибку, немного я немного модифицировал скрипт: добавил sleep и увеличил количество потоков). У меня в таком виде получается, что добавляется 170 чисел против 101 уникальных.
    import threading;
    import random;
    import collections;
    
    from time import sleep
    
    NUM_THREADS = 50;
    COUNT_FOR_EACH_THREAD = 10;
    threads = [];
    deque = collections.deque();
    
    
    def threadProc():
      for i in range(0, COUNT_FOR_EACH_THREAD):
        r = random.randint(0, 100);
        if r not in deque:
          sleep(0.01)
          deque.append(r);
    
    
    for i in range(0, NUM_THREADS):
      thread = threading.Thread(target = threadProc);
      threads.append(thread);
      thread.start();
      
    for i in range(0, NUM_THREADS):
      threads[i].join();
    
    print(deque);
    print(len(deque))
    print(len(set(deque)))


    PS. В Python нет смысла оканчивать строки ";".
    Ответ написан
    1 комментарий
  • Что отвечает за установку дефолтных значений в поля?

    @BorisKorobkov Куратор тега MySQL
    Web developer
    1. Правильный способ
    ALTER TABLE `user` ALTER COLUMN `name` SET DEFAULT ''

    https://dev.mysql.com/doc/refman/5.7/en/alter-tabl...

    2. Способ для говнокодеров
    Установить нестрогий режим.
    https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
    Ответ написан
    6 комментариев
  • Что значит этот значок в AndroidStudio?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Это не ошибка в вашем коде. Просто студия не смогла показать превью картинки.
    Ответ написан
    1 комментарий
  • Возможно ли начать работу программистом в 18 лет?

    xSkyFoXx
    @xSkyFoXx
    Если ваша базовая мотивация - набраться опыта и вы достаточно самомотивированы, чтобы что-то разрабатывать в свободное время, лучше 1-2 года поработайте для удовольствия и опыта. Помоги своим родителям или друзьям эмигрировать их бизнес в online, напишите клон чего-то, что вам нравится, попробуйте побыть полезным какому-то open source проекты.
    Если же ваша мотивация деньги (всякое в жизни бывает), тогда у меня для вас плохие новости. Лучше всего в таком случаи идти официантом, разнорабочим, строителем. Зарабатывать будете значительно больше со старта. Но, как мы все прекрасно понимаем, будущие перспективы с учётом выбора IT становятся крайне туманными.
    Мой личный опыт:
    1-2 курс - собственные лабораторные и задания для других студентов "за еду"
    3-4 - чужие курсовые проекты и и мелкий freelance
    5 - part time
    6 - full time
    Ответ написан
    1 комментарий
  • Как сделать HttpServletRequest доступным из другого потока?

    timych
    @timych
    Не очень понял - вам нужен context path вашего приложения или полный URL?
    Если первое, то можно например сделать такой листенер :
    @WebListener
    public class MyApplicationLifeCicleListener implements ServletContextListener {
    	@Override
    	public void contextInitialized(ServletContextEvent event) {
                  // cохраняем куда-нибудь путь
    		System.out.println(event.getServletContext().getContextPath());
    	}
    
    	@Override
    	public void contextDestroyed(ServletContextEvent event) {
    	}
    }


    Если второе то как вариант такой костыль - делаем реквест-листенер

    @WebListener
    public class MyRequestListener extends RequestContextListener {
    
    	@Override
    	public void requestInitialized(ServletRequestEvent requestEvent) {
    		super.requestInitialized(requestEvent);
    		if (requestEvent.getServletRequest() instanceof HttpServletRequest) {
                            // cохраняем путь
    			String url = ((HttpServletRequest) requestEvent.getServletRequest()).getRequestURL().toString();
    			System.out.println(url);
    		}
    	}
    }

    И в первом и втором случае вам придется либо завести статическую переменную (можно прямо в листенере) для записи url. Либо класс-синглтон, который вам вернет нужное значение.
    Но это конечно же костыль, так как для того чтобы к примеру получить URL во втором случае, нужно дождаться хотябы одного реквеста. Да и урл в зависимости от ресурса будет меняться.

    А что вам мешает пользоваться HttpServletRequest в родном потоке?
    И почему вы не знаете свой URL? (Можно его в какой-нибудь конфиг прописать)
    У вас REST сервис или сервлеты?
    Ответ написан
    Комментировать