Задать вопрос
  • В чем разница multithreading, multiprocessing и асинхронности?

    @Zanak
    Почитал ответы коллег, и решил вставить свои 5 копеек:
    - multiprocessing. каждая задача - это полноценный процесс ОС. процессы могут быть одинаковые, или абсолютно разные. для взаимодействия между процессами используются сокеты (про udp тактично промолчим). сокеты бывают 2 видов, сетевые и unix (юникс сокеты, естественно, присутствуют на юникс системах, под windows возможно присутствует аналогичный механизм IPC, но я не в теме, поэтому не стану сбивать вас с толку). принципиальное отличие для сокетов - это то, что через юникс сокеты взаимодействие возможно только в пределах одной машины, для сетевых сокетов такого ограничения нет.
    - multithreading. главное отличие от процессов - нельзя создать самостоятельный поток, всегда сначала стартует процесс, который это делает. с точки зрения планировщика ОС отличие потоков от процессов весьма небольшое - процессы стартуют каждый в своем адресном пространстве, со своим стеком и дескрипторами. все потоки, делят адресное пространство с родителем и другими потоками. из плюсов - взаимодействие между потоками максимально быстрое, его возможности ограничены только фантазией автора программы. из минусов - взаимодействие между потоками возможно только в рамках одной программы, взаимодействие со внешним миром не отличается от случая множества процессов, из за того, что все данные доступны всем потокам сразу, приходится использовать специальные техники программирования с участием блокировок.
    - асинхрон. асинхронное програмирование - это есть ни что иное, как кооперативная многозадачность. всегда есть диспетчер, который умеет переключать асинхронные задачи. в некоторых новомодных языках, вроде go, компилятор неявно вставляет вызовы диспетчера, чтобы горутины могли исполнятся паралельно. в языках, где поддержка асинхронности появилась позже, чем сам язык приходится в явном виде указывать вызываем мы синхронный или асинхронный код. при вызове асинхронного кода происходит вызов планировщика, который добавляет запрошенную функцию в очередь и производит переключение на другую задачу. иногда приходится в явном виде обращаться к диспетчеру, если, например, наша асинхронная задача будет исполняться заведомо долго.
    Ответ написан
    Комментировать
  • Как найти все возможные комбинации чисел от 1 до n-1 чтобы их сумма была равна n?

    @Zanak
    Такой вариант вроде работает:
    package main
    
    import "fmt"
    
    func sum(s []int) int {
    	result := 0
    	for _, v := range s {
    		result = result + v
    	}
    	return result
    }
    
    func main() {
    	n := 10000
    	var stack []int
    	p := n - 1
    	for p > 0 {
    		stack = append(stack, p)
    		for j := p - 1; j > 0; j-- {
    			stack = append(stack, j)
    			cur := sum(stack)
    			if cur < n {
    				continue
    			} else if cur == n {
    				fmt.Printf("%++v\n", stack)
    			}
    			stack = stack[:len(stack)-1]
    		}
    		stack = nil
    		p--
    	}
    }


    Прошу прощения, на node не пишу.
    Ответ написан
  • Как указать кодировку при возвращении ответа с сайта?

    @Zanak
    А кодировку своих исходников указываете? Лучше скрипты держать в кодировке utf8, которая является "родной", для 3 ветки питона.
    В заголовок ответа сервера с погодой можно попробовать посмотреть, какую кодировку он указывает, и попробовать перекодировать (но сначала попробуйте просто указать кодировку своих скриптов, иногда хватает этого)?
    Ответ написан
    3 комментария
  • Есть ли какойто подход к программированию называемый Api First?

    @Zanak
    Такое возможно, если речь о сервисах. Пишете спеку для swagger-а, с помощью их тула генерируете болванку сервиса, допиливаете реализацию в ручную (я не помню, генератор заполняет обработчики кодом, или оставляет их пустыми). Правда это работает только при создании сервиса с нуля, поддерживать существующий код вам все равно придется руками :)
    Для приложений первичны, скорее всего, данные, с которыми вы работаете, чем методы их использования. Поэтому, для приложений, такой подход к разработке лучше не использовать, как мне кажется.
    Ответ написан
    Комментировать
  • Почему из-за Popen.wait() подпроцесс работает некоректно?

    @Zanak
    1. У вас компилится windows-gui приложение. Попробуйте явно посмотреть в сторону -m параметра для g++ и добавить правильное значение в ваш cmd сценарий. Форточек под рукой нет, подробнее сказать не могу.
    2. Эта функция вроде как запускает вашу команду с указанными параметрами и ждет завершения, разве нет? (Это по поводу ожидания завершения)
    Ответ написан
    Комментировать
  • Как сделать имена переменных (полей) более читаемыми?

    @Zanak
    Если вопрос еще актуален: не делайте то, что вы описывали в водной части вопроса. Включение отношений объектов в их именование - это есть плохая идея, потому что рефакторинг иерархии классов может привести, при таком подходе к именованию, к изменению имен и содержимого методов, напрямую этим рефакторингом незатронутых. Это особо актуально в случае скриптовых языков, где модули могут подгружаться в процессе исполнения, и импорт библиотеки происходит ни при каждом запуске приложения. Хорошо если вы тщательно покрываете свой код тестами, но даже они могут не спасти.
    Для именования таблиц лучше использовать имена существительные английского языка в единственном числе. Для удобства, можно соединять несколько слов с помощью символа '_'. Например: user, user_profile, user_acl, для хранения учетки пользователя, его профиля и прав соответственно. Если вы расширяете чужой проект, допустимо использовать префикс, чтобы визуально контролировать, какие таблицы добавили вы, а какие существовали изначально: например - my_user_additional_info. Такой подход в достаточной мере самодокументирует ваш проект и упрощает вашим возможным коллегам его поддержку.
    С именованием классов и переменных подход похожий. camelCase или snake_case, или даже PascalCase, это дело вкуса, по большому счету. Да, у многих, если не всех, языков есть свой стиль форматирования кода, но следовать ему или нет, это ваш выбор. Я ограничусь советом: придерживайтесь выбранного стиля оформления текста, хотя бы до конца проекта.
    Ответ написан
    1 комментарий
  • Как использовать переменную из функции другого файла?

    @Zanak
    > global var
    Это значит, что вы хотите использовать глобальную переменную, но это не объявление переменной как таковой. Вне функции bar вам надо объявить эту переменную, тогда в функции вы сможете ее инициализировать.
    Ответ написан
    Комментировать
  • Почему FLASK render_template может искажать форматирование передаваемого в качестве параметра HTML-файла?

    @Zanak
    Лучше бы увидеть вашу вьюху, потому что странно, в том виде, как вы описываете, проблем быть не должно.
    Вот чего гугл предложил на запрос "python flask render_template plain html": раз, два, три, ну и четыре.
    Ответ написан
    Комментировать
  • Какой фреймворк для создания клиент-серверного приложения выбрать?

    @Zanak
    А при чем здесь rest?
    1. у вас сервис, запущенный на рабочей станции, должен лить картинки на сервер. если вам обязательно хочется использовать http, используйте http.client, как вариант.
    2. как вариант, можно запилить свой клиент/сервер для доставки скриншотов в админку. можно обойтись и штатными модулями.
    3. а вот смотрелку, того что вам станции насыпали, можно запилить на чем угодно, например на django.
    Ответ написан
    Комментировать
  • Почему Flask часто падает на сервере разработки, production но не выводит ошибок traceback?

    @Zanak
    Первейший совет: воспользуйтесь поиском, в данном случае может помочь поиск по "flask debug on", или подобным критериям.
    Обычно включение отладки и изучение логов помогает.
    Можно попробовать посоветовать мониторить использование памяти. Не уверен на сто процентов, но в одном из проектов у меня процесс по тихому сыпался, когда утыкался в память, и оптимизация по этому поводу помогла решить проблему.
    Если сервер сидит за apache/nginx, загляните в их логи, иногда бывает полезно.
    Более содержательных идей вряд ли смогу предложить, не видя код.
    Ответ написан
  • Зачем в классе-наследнике вызывать инициализацию класса-родителя в Python?

    @Zanak
    Во первых, разве вызов super не должен выглядеть так:
    super(Example, self).__init__()?
    Когда мы переопределяем метод в потомке класса, то мы можем заново реализовать всю работу этого метода, и тогда вызов super не нужен вовсе.
    Если мы хотим только немного изменить поведение метода, то нам остается в подходящем месте встроить вызов метода родителя, сообщив среде исполнения родителя какого типа мы ищем (в вашем случае Example) и ссылку на текущий экземпляр (это self).
    Теперь собственно ответ на ваш вопрос: инициализация класса родителя может быть сложным процессом, потому что свойства предка сами могут быть объектами, которые важно правильно построить и инициализировать, и если вы не готовы делать это сами, в каждом случае, когда создаете нового наследника, то вы можете вызвать super.
    Только вызывайте его правильно. :)
    Ответ написан
    1 комментарий
  • Что означает за странное (namespace)?

    @Zanak
    Подозреваю, что здесь, в пункте 6.4.1 и таится ответ на ваш вопрос.
    Ответ написан
    4 комментария
  • Flask 400 error?

    @Zanak
    jsonify не спасет отца русской демократии? :)
    Ответ написан
    Комментировать
  • Вывод данных в Flask?

    @Zanak
    1. Не очень понял, зачем вы использовали g. Просто для накопления данных в процессе обработки хватило бы и обычной переменной, а для хранения данных между запросами она не применима (Смотрите замечание на этот счет).
    2. Если вы сами ловите исключение, то и обрабатывать его лучше полностью, с указанием шаблона и кода ответа. На вашу проблему это не влияет, но это просто хорошая привычка, не делать ни чего, или доделывать до конца.
    3. Что подразумевает return внутри блока with? Если объявить переменную аккумулятор значений из файлов выше цикла по файлам, и вместо g.data_local ... и return ... написать код отправки прочитанного значения в накопитель, например как здесь, а потом передать содержимое аккумулятора в шаблон, под именем peopls, не получится именно тот эффект, которого вы и добивались?

    Пара мыслей помимо вашего кода:
    Какова дальнейшая судьба файлов, которые вы уже обработали, вы будете их читать опять, при следующей итерации? Если файлы будут добавляться достаточно часто, то каждый следующий запрос будет работать дольше предыдущего. Может стоит еще раз подумать?
    В зависимости от объема файлов и/или их количества, в особо тяжелых случаях, вы можете упереться в лимит времени ответа. Чинится это легко, но помнить об этом стоит.
    Ответ написан
    Комментировать
  • Как перенаправить url с одного приложения в другое?

    @Zanak
    В одной вкладке откройте страницу, на которую вам не удается перейти, в другой страницу, на которой стоит ссылка. Сравните, какая она есть, и какой должна быть. Возможно, что какая-то переменная не определена в контексте шаблона, и ссылка собирается некорректно. Если так, то проблема решится, как только вы отдадите шаблону все данные.
    Если вы собираете ссылки вручную, то можно поправить код, чтобы она стала верной, но это неправильный подход.
    Не слушайте вредных советов, используйте url в шаблонах и reverse в контролере, вместо ручной сборки ссылок. Это избавить вас от лишней работы, если вы решитесь сменить настройки вашего приложения, или переиспользовать его в другом проекте.
    Ответ написан
    Комментировать
  • Как добавить perl скрипт в python проект?

    @Zanak
    Конвертеров с perl на python нет, потому что эти языки достаточно разные. В простых случаях возможен подстрочный перевод, но это все равно должен делать человек.
    Наиболее правильный путь - не прикручивать верблюда к змее, а перенести все на один язык. Как минимум, это избавит вас от необходимости иметь 2 языка в системе со всеми зависимостями, которые этот винегрет требует. Perl далеко не так сложен, как принято о нем думать и книг по этому языку в сети полно, в том числе и на русском языке. Если вы знакомы с php, то на "освоится с различиями", достаточно для понимания происходящего, у вас уйдет часа 4 - 5. А дальше все упирается в скорость вашего кодинга на питоне.
    Если все таки идти по сложному пути, то нужны подробности по поводу perl части:
    - если задача запустить, дождаться окончания и продолжить работу, os.system вам поможет
    - если это сервис, который нужно запустить и потом с ним пообщаться из питона, то запускаться он должен как самостоятельный процесс, и здесь надо смотреть в сторону subprocess, например. этот же модуль позволит прибраться за собой, и завершить perl часть по окончании работы
    - если нужно запустить скрипт, и пообщаться с ним через его stdin/stdout, то смотрите на subprocess.Popen
    Ответ написан
    Комментировать
  • Данные в jquery-ui.autocomplete приходят, а список неотображается, ни кто не встречался с такой проблемой?

    @Zanak Автор вопроса
    Вопрос снят.
    Помогло явное указание z-index для контрола, к которому привязывается автокомплитер. Под пингвином все работало и без этого, а под M$ не пошло. Жаль, что я не разглядел этого в ворохе слоев раньше.
    Всем спасибо за внимание.
    Ответ написан
    Комментировать
  • Почему этот код не работает, и его нельзя убить с помощью ctrl+z?

    @Zanak
    у вас косяк в коде сервера вы listen и accept потеряли.
    Попробуйте почитать вот это.
    Ответ написан
  • Делаю граббер с помощью curl, практически всё работает. Но определенные ссылки не открывает?

    @Zanak
    Параметры разве не должны собираться с помощью "&"?
    Я бы еще посмотрел на эту функцию, для подготовки параметров перед отправкой.
    Ответ написан
    Комментировать
  • Циклы. While, do while, for, чем отличаются?

    @Zanak
    Как - то, почитал я ответы коллег, и остался разочарован. Понятно, что вопрос не простой, а очень простой, но можно и по аккуратнее в изложении. В общем, мои 5 копеек.
    Любой цикл - это кусок кода, который обычно называют телом цикла, и который мы желаем выполнить несколько раз. Количество повторений может быть заданно заранее, например: цикл от 0 до 10, зависеть от данных, например: для каждого элемента массива или зависеть от значения, которое мы в теле цикла вычисляем, например: пока f(x) > 0 выполнять. По крайней мере, во всех известных мне языках программирования, есть оператор досрочного выхода из цикла.
    while. Цикл с предварительным условием. Выполняется пока условие истинно. Проверка происходит до исполнения тела цикла. Если условие изначально ложно, то тело не выполнится ни разу. Если условие ни когда не станет ложным, то мы получим бесконечный цикл. Распространенные ошибки новичков, при использовании этого цикла:
    - условие не зависит от переменных, которые изменяются в теле цикла, и оно всегда получается истинным
    - условие ни когда не станет ложным, в силу его свойств, например: X * X >= 0 всегда верно
    Пример на php:
    $i = 1;
    while ($i <= 10) {
        echo $i;
        $i++;
    }

    do ... while. Цикл с постусловием. Отличие от предыдущего в том, что тело цикла исполняется хотя бы один раз, и после этого происходит проверка условия выхода из цикла. К типичным ошибкам предыдущего вида циклов добавляется то, что этот цикл гарантированно исполняется один раз, что не всегда желательно.
    В этом примере цикл отработает один раз, не смотря на то, что условие ложно:
    $i = 0;
    do {
        echo $i;
    } while ($i > 0);

    for. Чаще всего этот оператор описывает цикл с фиксированным количеством повторений. Вот так он может выглядеть, например, для php:
    for ($i = 1; $i <= 10; $i++) {
        echo $i;
    }

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