Задать вопрос
  • Файлы Python в один исполняемый?

    @Mingun
    Я в свое время отказался от py2exe, т.к. он создавал какую-то зависимость на DLL студии, и даже забирание указуемых DependencyWalker-ом файлов не помогало -- созданный экзешник не собирался запускаться, жалуясь на отсутствие этих DLL. Я использовал PyInstaller, он, к тому же, поддерживает 3-й питон и DependencyWalker не показывал каких-либо зависимостей.
    Ответ написан
    2 комментария
  • Как генерировать код из XML?

    @Mingun
    Если нужно генерировать код чтения/записи XML (по типу XmlBeans для Java), то можете посмотреть на www.codesynthesis.com/products/xsd/. Хотя как тут написали в комментариях, вопрос непонятен.
    Ответ написан
    Комментировать
  • В каком языке программирования легче всего писать тесты?

    @Mingun
    Мне кажется, Jasmine для JavaScript идеально подойдет. Тест выглядит так (кусок теста из проекта PEGjs):
    describe("compiler pass |generateBytecode|", function() {
      var pass = PEG.compiler.passes.generate.generateBytecode;
    
      function bytecodeDetails(bytecode) {
        return {
          rules: [{ bytecode: bytecode }]
        };
      }
      describe("for rule", function() {
        it("generates correct bytecode", function() {
          // Функция toChangeAST -- специально написанное расширение.
          // Так можно написать любую тестирующую функцию
          expect(pass).toChangeAST('start = "a"', bytecodeDetails([
            14, 0, 2, 2, 18, 0, 19, 1   // <expression>
          ]));
        });
      });
    });

    Из удобств -- тесты можно запускать как под Node.js, так и в браузере, выглядит удобно.
    Ответ написан
    Комментировать
  • Что за ошибка 0x000007B у программы, написанной в QtCreator на C++, запускаемой на другом компьютере?

    @Mingun
    Скорее всего несовместимость в версиях DLL -- на другой машине подхватывается библиотека другой версии. Для начала стоит посмотреть Dependency Walker-ом, что программа тащит за собой.
    Ответ написан
    Комментировать
  • Как отследить появление смарт-карты в кард-ридере по протоколу PC/SC?

    @Mingun Автор вопроса
    Разобрался. Необходимо с каждым витком ожидания заносить в dwCurrentState значение из dwEventState. Правда, понять, из-за чего были глюки с возвращаемым значением, не удалось. Короче, такой код работает:
    // Начальное состояние dwCurrentState будет SCARD_STATE_UNAWARE, т.к. числом это значение 0.
    SCARD_READERSTATE reader = {0};
    reader.szName = ...;
    do {
        LONG st = SCardGetStatusChange(hContext, INFINITE, &reader, 1);
        // Делаем новое состояние текущим.
        reader.dwCurrentState = reader.dwEventState;
        // прочие дела.
        ...
    } while (true);

    Цикл лучше сделать даже для одиночного ожидания, т.к. первый раз он наверняка провернется вхолостую -- т.к. первый вызов сразу заполнит текущее состояние, а второй уже будет ждать изменений.
    Ответ написан
    Комментировать
  • Как получить ATR со смарткарты по протоколу PC/SC?

    @Mingun Автор вопроса
    Так, вопрос отменяется. Не обратил внимание, что можно получать различные атрибуты, в том числе ATR, либо специальной функцией:
    LONG rv;
    SCARDCONTEXT hContext;
    SCARDHANDLE hCard;
    DWORD dwActiveProtocol;
    unsigned char *pbAttr;
    DWORD dwAttrLen;
    ...
    rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
    rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
             SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol);
    dwAttrLen = SCARD_AUTOALLOCATE;
    // Вот как раз получение ATR в pbAttr.
    rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, (unsigned char *)&pbAttr, &dwAttrLen);

    либо вместе с прочим статусом:
    SCARDCONTEXT hContext;
    SCARDHANDLE hCard;
    DWORD dwActiveProtocol;
    DWORD dwState, dwProtocol, dwAtrLen, dwReaderLen;
    BYTE pbAtr[MAX_ATR_SIZE];
    ...
    rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
    rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
             SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
    ...
    dwAtrLen = sizeof(pbAtr);
    rv = SCardStatus(hCard, NULL, &dwReaderLen, &dwState, &dwProtocol, pbAtr, &dwAtrLen);

    Аббревиатура Atr в названии у меня прочно проассоциировалась с атрибутами, а не ATR :)
    Ответ написан
    Комментировать