• Как решить проблему с использованием сокетов в python?

    @nirvimel
    Я понял в чем суть проблемы только по одному описанию, еще не успев заглянуть в код (редко такое происходит). Вы понимаете в чем смысл единственного параметра у recv? Для чего вы передаете туда константу 1024? Это объем в байтах, который читается из сокета за один вызов. Сокет - это не очередь передаваемых пакетов, а поток байт, который наполняется с одной стороны через send и вычерпывается с другой через recv (флаг socket.SOCK_STREAM символизирует это). Если в некоторых случаях recv возвращает в точности тот же пакет фрагмент данных, который был передан за один вызов send, то только потому, что в потоке в этот момент нет других данных.
    Следовательно, если логика вашего клиент-сервера подразумевает обмен пакетами, то всю разбивку на пакеты вы должны реализовывать самостоятельно. Например, в заголовке каждого пакета передавать его длину, а после прочтения этого заголовка, читать из сокета ровно заданное количество байт.
    Все это издержки работы с голым TCP. Для решения как раз этих проблем и существуют специальные пакетные протоколы и библиотеки для работы с ними. Можете попробовать, например, ZeroMQ (через PyZMQ), если вас интересует именно обмен пакетами ( то есть "сообщениями" в терминах ZeroMQ) и нет желания писать этот велосипед самостоятельно.
    Ответ написан
    Комментировать
  • Почему нет коптеров на горючем топливе?

    @nirvimel
    Вся проблема в массе и габаритах. Для электродвигателей такой проблемы не существует - микроскопический движок от бесшумного куллера - (грубо говоря) просто сильно уменьшенная копия электропривода электромобиля. Для поршневых двигателей все иначе - давление в цилиндре должно быть достаточно большим, следовательно стенки цилиндра должны быть достаточно крепкими, следовательно достаточно массивными. Поэтому создание миниатюрных (и легких) поршневых двигателей представляет собой серьезную инженерную проблему. На практике такие движки оказываются или слишком неэкономичными, или слишком дорогими (при использовании сверхпрочных материалов).
    Вот, например, почти придел миниатюризации для массового производства - 25 см2. Стоит обратить внимание на массу - 730 грамм, и на цену - $195. Теперь вспомним, что двигатель - всего лишь одна из многих деталей летательного аппарата и попытаемся представить во сколько может стоить целый БпЛА с этим двигателем с учетом типичных соотношений цен (моделей) воздушных (и наземных) транспортных средств и их двигателей.
    Ответ написан
    3 комментария
  • Ошибка сегментирования?

    @nirvimel
    Первый момент: То, что где-то возникает ошибка сегментирования - само по себе не говорит ни о чем. Так код не анализируется (и тем более, генераторы так не пишутся). Нужно под отладчиком рассматривать эту ошибку детально: в каком месте, откуда шел вызов, что там со стеком, что с указателями. и.т.д.

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

    Третий момент: Что такое сопроцессор. Далее по ссылкам.

    P.S.: Почему не LLVM? Зачем еще один велосипед?
    Ответ написан
  • Продали программу - год прошел - как брать оплату со старых клиентов?

    @nirvimel
    Все просто - на поддержку клиента составляется отдельный договор. Ценник фиксированный, но поддержка ограничена как по времени (квартал/полгода/год), так и по объему рабочих часов, включенных в стоимость. По истечении договорного периода поддержка истекает даже если фактически часы не выработаны. Можно предоставлять клиентам незначительные скидки на последующие договора поддержки в случае, если предоплаченные часы фактически выработаны меньше чем на 50% или 25%, это не сильно бьет по прибыли, но производит важный психологический эффект на клиента. Если все предоплаченные часы выработаны раньше срока истечения договора (хоть сразу в первый день), то клиенту продается еще один пакет предоплаченных часов на тех же условиях за ту же сумму (или с незначительной скидкой). Обычно клиент сам заинтересован в возобновлении договора, если часы закончились раньше чем были решены все его проблемы, но психологически важно решить хотя бы часть проблем и показать важность и ценность поддержки.
    За сдельный объем работ (например, прикрутить в программу какую-нибудь новую фичу) часы назначаются условно и списываются из предоплаченного объема.
    Старые версии не должны обслуживаться по истечению предоплаченного периода поддержки, но обновление можно сделать бесплатным для тех, кто заключает новый договор на поддержку и закупает новый пакет предоплаченных часов. Часть клиентов будут покупать поддержку только для получения свежих обновлений, если реальная поддержка им и не нужна.
    И последнее: никакого квантования времени по получасам и никаких ценников порядка 250 руб. и 300 руб., не нужно даже обсуждать с клиентом сколько копеек стоит та или другая мелочь, надо сразу отойти от этого и выйти на другой порядок цифр, например: "9487 рублей (без НДС) и вы задубите о проблемах на ЦЕЛЫЙ ГОД" - заманчивое предложение для любого руководителя. А непосредственно сотруднику, который собственно и получает поддержку, можно упомянуть про ограниченный объем предоплаченных часов в пакете поддержки (в договоре это тоже прописано, но полный текст договора читает не руководитель, а юрист (или даже бухгалтер), которой мало разбирается в теме). В случае возникновения вопросов при досрочном исчерпании предоплаченных часов и возобновлении договора в течении года, можно сослаться на то, что с их сотрудником этот вопрос был оговорен... и.т.д., нужно уметь подобные ситуации разруливать без "потери" клиента.
    Ответ написан
    3 комментария
  • Получение почты + небольшой backend + небольшое API: чего использовать?

    @nirvimel
    Twisted, Tornado

    Ничего из этого. Поясню: Во-первых, у обоих собственные нестандартные реализации IMAP (к Tornado в принципе возможно прикрутить стандартную), это было бы не критично, если бы не прекрасные варианты обойтись стандартной imaplib/IMAPClient. Во-вторых, сами фреймворки: Twisted уже несколько outdated, интерес к нему постепенно угасает, Tornado вроде еще держится за счет своих фанатов, но он тоже слишком специфичен и на данный момент почти не дает уникальных преимуществ (на момент начала его разработки его преимущества были довольно уникальны).

    Для любых задач с асинхронным вводом/выводом я советую выбирать из (в порядке приоритета):
    1. Asyncio (python >= 3.4).
    2. Gevent.
    3. Стандартные потоки threading. Их минус в том, что не все I/O вызовы отпускают GIL на время исполнения (особенно это касается python 2), для каждой конкретной задачи приходится писать собственный бенчмарк, чтобы доказать/опровергнуть реальную асинхронность и эквивалентность (в плане производительности) эталонной реализации, например, на gevent.
    Ответ написан
    1 комментарий
  • Эмулирование объема RAM?

    @nirvimel
    На Windows (я подозреваю, в вопросе речь о ней) программно получить объем памяти можно только через две API-функции GetPhysicallyInstalledSystemMemory или
    GlobalMemoryStatusEx.
    • Если требуется всего один раз обмануть один инсталлятор, то легче всего запустить его под отладчиком на паузе, найти точки входа этих функций в Kernel32.dll, повесить на их вызов брекпоинты, запустить на исполнение, поймать сам вызов, вручную подправить возвращаемое значение (в случае с GlobalMemoryStatusEx подправить структуру в памяти по адресу, передаваемому через параметр) и продолжить исполнение, этого должно быть достаточно.
    • Если требуется многократная воспроизводимость данного процесса или исполнение на другой машине, тогда потребуется написать патч к этому инсталлятору, подправляющий таблицу импорта Kernel32.dll и вставляющий на соответствующие места адреса перехватывающих функций (в общем, это довольно обширная тема, раскрыть ее можно только в двух-трех томах текста).
    Ответ написан
    Комментировать
  • Существует ли TOR API?

    @nirvimel
    Вручную это делается так:
    (echo authenticate '""'; echo signal newnym; echo quit) | nc localhost 9051
    How to change tor exit node programmatically

    Для автоматизации этого существуют библиотеки:
    1. на Python (еще одна и еще одна).
    2. на PHP.
    3. на Java.
    4. на Go (еще одна).
    Ответ написан
    3 комментария
  • Поиск сдвига одного изображения относительно другого?

    @nirvimel
    Про OpenCV не подскажу, но я бы написал это вручную. Идея простая: Задаем функцию которая проверяет истинность (точнее обратное ей значение, типа "ложность") гипотезы что второе изображение является первым изображением, сдвинутым по осям ровно на значения X, Y. Эта функция рассчитывается (например) как сумма квадратов разностей значений соответствующих пикселов первого изображения и второго, сдвинутого на -X, -Y. Имея такую функцию дальше просто находим ее минимум методом градиентного спуска (начальные значения X=0, Y=0), полученные X, Y и будут рассчитанными значениями смещения второго изображения от первого.
    С поворотом все аналогично, только добавляется еще одна одна переменная - градус поворота. Но функция проверки гипотезы становится значительно тяжелее в вычислительном плане: на каждый пиксел пойдет минимум одна тригонометрическая функция (относительно тяжелая для CPU), плюс этим обламывается SIMD оптимизация, которая дает многократное ускорение для первого варианта без поворота.
    Ответ написан
    1 комментарий
  • Есть ли учебники по программированию (JS, PHP и пр.) в таком же музыкально-развлекательном формате?

    @nirvimel
    Глядя на этих плясунов, я понял смысл всех массовых танцев в мире: все это - не доведенные до завершения, попытки исполнения bogosort.
    Ответ написан
    Комментировать
  • Какую выбрать формулу для вычисления рейтинга?

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

    Можно предложить альтернативный вариант сортировки: три поля, первое - победы, второе - поражения с отрицательным знаком (выше окажутся игроки с меньшим числом поражений), третье - ничьи.
    Но первый вариант лично мне кажется более сбалансированным.
    Ответ написан
    Комментировать
  • Как защититься от инсайдеров?

    @nirvimel
    Бюджет: 0 рублей

    Как защититься от инсайдеров?

    Во имя справедливости я бы вынес из этой конторы все до последнего *.doc и предложил бы любому конкуренту, кто готов вложить в защиту от инсайдеров чуть больше чем ноль рублей.
    Ответ написан
    4 комментария
  • Где получить курс валют?

    @nirvimel
    Во-первых, на разных биржах разные курсы (на самом деле актуальные курсы между фиатными валютами формируются и существуют тоже только в пределах бирж).
    Во-вторых, если вас интересует предельная точность курса на текущий момент времени, то вы должны понять такую вещь как спред, и то, почему цену последней сделки (так технически берется значение курса) нельзя рассматривать как цену по которой в данный момент мгновенно можно продать/купить неограниченный объем валюты.

    Публичное API (доступно без регистрации) имеют основные крипто-биржи: Bitfinex, Bitstamp и BTC-e.
    Ответ написан
    Комментировать
  • Как подключиться через ssh с помощью пароля?

    @nirvimel
    В /etc/ssh/sshd_config поменять:
    PasswordAuthentication no
    на:
    PasswordAuthentication yes
    Ответ написан
    Комментировать
  • Как решить проблему с данной архитектурой Базы данных?

    @nirvimel
    1. Если characteristic_value привязано к subject_model, characteristic_name (почему бы не назваьть эту таблицу просто characteristics, ведь там может храниться еще что-то кроме имени) можно не привязывать к subject. Этим достигается независимость характеристик от субъекта и отсутствие дублей среди характеристик.
    2. Что-бы при назначении значения характеристики модели можно было производить проверку на то, возможна ли вообще такая характеристика для субъекта, нужно ввести кросс-таблицу subject_characteristics (характеристики субъектов), которая бы имела внешние ключи к subject и characteristic_name, то есть many-to-many зависимость между ними, через отдельную кросс-таблицу.
    3. У вас всего два фиксированных уровня иерархии. Что, если на практике потребуется больше? Вы, кажется, стремитесь создать гибкую/универсальную систему. Тогда вам нужна динамическая иерархия категорий.
    4. Если view служит для представления, то внешний ключ к нему в characrteristic_name не нужен, так как логически характеристика, как единица учета, не подчинена представлению данных. Опять же лучше ввести many-to-many зависимость между характеристиками и представлениями, реализованную через кросс-таблицу. Подсистема представлений при этом остается полностью независимой ото основной структуры данных (ее можно убрать не нарушая структуру).


    P.S.: Интересно, в каком это смысле дрель (инструмент) может быть субъектом.
    Ответ написан
    3 комментария
  • В какой программе можно смоделировать физику?

    @nirvimel
    Смотря какую область физики. Обычно под симуляцией "физики" понимают симуляцию механики, с этим на сегодняшний день проблем практически нет - куча великолепного софта решает эту задачу. Другое дело, что для симуляции всех аспектов работы поршневого или турбореактивного двигателя (какой кстати у вас?) одной механики явно недостаточно. Чтобы смоделировать и рассчитать движения топлива по топливным цепям нужна симуляция гидродинамики, газодинамики и термодинамики. А под такую совокупность задач готового софта практически нет. Теоретически все эти прикладные области можно обобщить и симулировать через молекулярную кинетику (все законы динамики любых сред выводятся через молекулярную кинетику), но тут начинается уже совсем другой порядок вычислительных мощностей: одна секунда в молекулярно кинетическом симуляторе (например, процесс горения топлива в реактивном двигателе) может вычисляться часами на суперкомпьютерах или годами на домашних десктопах.
    Ответ написан
    1 комментарий
  • Что происходит, если не закрыть подключение к БД?

    @nirvimel
    Каждое подключение к СУБД - это открытый сокет (TCP, IPC, или UNIX-сокет), плюс на обеих сторонах (клиент и сервер) структуры данных, в которых хранится состояние этого соединения, и (самое главное) кеши данных, которые могут вырастать до довольно больших размеров (например, если там застряли результаты всех выборок данных, выполненных через это соединение, такой вариант возможен). Но это не самое страшное. Гораздо хуже то, что в конфигах почти любой СУБД обозначен лимит активных подключений, после достижения которого сервер перестает принимать новые подключения. И этот лимит задан с расчетом на то, чтобы сервер справлялся с соответствующим количеством реально активных (то есть относительно нагруженных) подключений, не зависал при этом и не вычерпывал бы всю память при попытке выполнить запросы от всех подключений одновременно. Соответственно этот лимит задан довольно низко и не рассчитан на то, чтобы зависшие подключения накапливались десятками тысяч.
    Но есть и приятная новость: короткоживущим процессам (типа скриптов на веб-сервере), можно не заботится о закрытии соединений вообще, потому что при уничтожении процесса в любом случае закрываются все открытые дескрипторы в том числе и сокеты, а при разрыве одной стороны сокета, автоматически закрывается и другая, все функции висящие в ожидании на этом сокете, вылетают с ошибкой, сервер безусловно рассчитан на это, он сразу освобождает все выделенные ресурсы, относящиеся к соединению, сокет которого оказался разорван.
    Следует иметь в виду, что в зависимости от реализации веб-сервера сам процесс может и не уничтожаться по завершению работы скрипта.
    Ответ написан
    Комментировать
  • Формула расшифровки px из size?

    @nirvimel
    Нужно как минимум прочитать заголовок PNG (а точнее IHDR chunk, который идет первым), в нем указаны ширина и высота в пикселах. Без доступа к содержимому файла это определить невозможно.
    Ответ написан
    4 комментария
  • Как сделать парсер на python учитывая что переход по страницам осуществяется на javascript?

    @nirvimel
    В данном случае достаточно установить печенку AmListSearch в значение PageNumber=N, запросить станицу по этому же адресу и получить в ответе список, открытый сразу со страницы N.
    Например:
    $ curl --cookie "AmListSearch=PageNumber=12" https://bankrot.fedresurs.ru/ArbitrManagersList.aspx > bankrot.html
    $ firefox bankrot.html

    А вообще, в подобных случаях следует действовать по примерно такому алгоритму:
    1. Через FireBug (или встроенную панель разработчика Tools->Web_Developer->Network) отловить исходящий HTTP-запрос на действие, вызывающее подгрузку AJAX-контента.
    2. Определить через какой параметр передается переменная (номер страницы, например). Это может оказаться не только параметр GET-запроса, но и поле POST-формы, или печенка, или даже произвольный кастомный HTTP-заголовок.
    3. Определить формат и структуру ответа. Это может быть произвольный HTML-фрагмент (чаще всего), или целый HTML-документ, или XML, или JSON (самый правильныйЪ вариант с точки зрения разработки), или вообще произвольный текстовый формат, который парсится скриптом после получения (именно такой бредовый формат имеем в данном случае, я даже не стал его разглядывать, сразу попробовал обходные пути и нашел же один).
    4. Написать скрипт, который формирует запросы, подобные тем, что уходят со страницы, и парсит ответы.
    Ответ написан
    1 комментарий
  • Какой язык выбрать для программирования микроконтроллеров?

    @nirvimel
    На самом деле тут нет никакого выбора. Для работы JVM требуются полноценная операционная система (не RTOS), десятки/сотни мегабайт оперативки и CPU соответствующей архитектуры (выбор совсем не большой). На борту МК могут отказаться десятки сотни килобайт RAM, ни с чем не совместимая архитектура и полное отсутствие ОС или очень легкая RTOS.
    Существует только один язык высокого уровня, пригодный для разработки под МК почти любых архитектур - это C (теоретически еще и C++, но его библиотеки обычно слишком тяжелые и требуют поддержки со стороны ОС (которой просто нет), плюс его любовь к использованию кучи и динамической памяти делает непредсказуемым расход памяти в рантайме, что неприемлемо при крайне ограниченных ее объемах).
    Ответ написан
    Комментировать
  • Можно ли удалить файла лога logging?

    @nirvimel
    Зависит от ОС. На Linux удаляемый файл, открытый на запись в другом процессе, физически не удаляется, а только перестает быть виден, но через открытый дескриптор продолжает писаться (и даже читаться! при наличии флага "r"). На Windows все зависит от эксклюзивной блокировки при открытии на запись: при ее наличии будет отказ при удалении, при ее отсутствии удаление пройдет успешно, дескриптор, открытый на запись, станет невалидным и все последующие операции на нем будут давать отказ (кидать исключение).
    Ответ написан
    Комментировать