Профиль пользователя заблокирован сроком «навсегда» без указания причины
  • Что почитать по созданию RESTful API новичку ?

    @MikhailEdoshin
    Кстати, я обычно еще всегда ищу и читаю критиков интересующей меня технологии — как правило, там оказывается очень полезная информация, которую от сторонников вы не услышите. Основное это то, что нестандартные для CRUD операции все скопом пойдут теми же POST запросами; что вызов функций получается, так сказать, гетерогенный — часть параметров берется из URL, а часть — из самого запроса; также часть результатов можно вернуть стандартными кодами HTTP, а для части приходится придумывать что-то еще.

    Иногда построенная логическая модель может быть неудобной в реальном использовании — как, например, выразить в REST, запрос типа «найти всех пользователей, интересы которых пересекаются с интересами текущего пользователя»? То есть, субъективно, разработать REST API сложнее, чем C-подобное API. Ну и по мелочам — нет поддержки транзакций, но это для простых сервисов не так важно.

    Пара критических заметок (на английском): 1, 2.
    Ответ написан
    Комментировать
  • Расскажите про западные фриланс-биржи с точки зрения работодалеля?

    @MikhailEdoshin
    eLance в сравнении с oDesk крайне запутанная и бестолковая. У меня, например, проект отменен, нужно вернуть заказчику предоплату, так никак не выходит — уже и в поддержку писал, все не можем толку дать.
    Ответ написан
  • Использование Win32 версии Poppler-qt4?

    @MikhailEdoshin
    То есть вы собираете poppler как статическую библиотеку, затем линкуете ваш проект, статическую Qt и получившийся статический poppler, и при запуске он у вас вылетает, требуя какую-то DLL?

    Если так, то посмотрите через dumpbin /imports (справка), какие DLL импортирует ваш собранный проект. Если там есть какая-то DLL, посмотрите лог сборки — там, соответственно, тоже должна быть статическая обертка для этой DLL. Или, если там ничего нет, может быть в исходниках poppler'а — MS позволяет указать библиотеку на уровне исходника с помощью pragma comment (справка). В любом случае эта статическая обертка должна быть где-то в окрестностях, иначе бы проект не собрался. Вам нужно ее отключить в настройках проекта — явно, или, если она прописана в исходниках, то через /NODEFAULTLIB:<name>.
    Ответ написан
  • Максимальное уменьшение веса Qt'шных библиотек

    @MikhailEdoshin
    Советуют еще отключать exceptions и сжимать код UPX'ом.
    Ответ написан
    3 комментария
  • Рендеринг PDF-документа в Win32\Qt\C++?

    @MikhailEdoshin
    Не знаю насчет Qt, но для C есть библиотеки, правда, только под GPL: xpdf или MuPDF.
    Ответ написан
    Комментировать
  • Xcode и номер версии iPhone SDK в путях - как с этим жить правильно?

    @MikhailEdoshin
    Насколько я понимаю, нормальным образом это задается ключом gcc -miphoneos-version-min либо IPHONEOS_DEPLOYMENT_TARGET См. man gcc :)
    Ответ написан
  • Какие могут быть аргументы «за» и «против» логотипа и типографики недавнего творения студии Лебедева?

    @MikhailEdoshin
    В этом логотипе чувствуется невидимая рука заказчика :)

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

    Вообще же логотип не обязан быть шедевром :) Иногда это получается, но не часто, каждый логотип шедевром не сделаешь; главное — чтобы был.
    Ответ написан
    1 комментарий
  • Безопасность и конфиденциальность

    @MikhailEdoshin
    Конечно. «Метод Гутмана»! Не знаю, что за метод, но звучит серьезно :)
    Ответ написан
    Комментировать
  • Разбиение базы данных КЛАДР

    @MikhailEdoshin
    Что значит «для сайта по торговле»? Как используется адрес в вашей системе?
    Ответ написан
  • Python & Closed Source?

    @MikhailEdoshin
    Вот FAQ по лицензии Python. Вкратце — да, код открывать необязательно, но нужно сохранять копирайты в коде и приложить копию питоновской лицензии; при упоминании Python в документации использовать ® и указать, что это знак Python Software Foundation.

    Общепринятой лицензии на closed-source freeware нет, пишите от себя :) Ну или вот тут предлагают использовать CC-BY-NC, хотя обычно CC для ПО не используется.
    Ответ написан
    1 комментарий
  • Генерация простого числа заданного размера?

    @MikhailEdoshin
    Вот сниппет непосредственно из реализации RSA:

    def rmspp(number, attempts=28):
        """
        rmspp(n, attempts=28) -> True if n appears to be primary, else False
        rmspp: Rabin-Miller Strong Pseudoprime Test
        http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html
        """
        if number < 2:
            return False
        if number == 2:
            return True
        if number % 2 == 0:
            return False
        # Given an odd integer n, let n = 2**r*s+1, with s odd... 
        s = number - 1
        r = 0
        while s % 2 == 0:
            r += 1
            s /= 2
        while attempts:
            # ... choose a random integer a with 1 ≤ a ≤ n-1
            a = randint(1, number-1)
            # Unless a**s % n ≠ 1 ...
            if mod_exp(a, s, number) != 1:
                # ... and a**((2**j)*s) % n ≠ -1 for some 0 ≤ j ≤ r-1 
                for j in range(0, r):
                    if mod_exp(a, (2**j)*s, number) == number-1:
                        break
                else:
                    return False
            attempts -= 1
            continue
        # A prime will pass the test for all a.
        return True
    
    def mod_exp(base, exponent, modulus):
        """
        mod_exp(b, e, m) -> value of b**e % m
        Calculate modular exponentation using right-to-left binary method.
        http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method
        """
        result = 1L
        while exponent > 0:
            if (exponent & 1) == 1:
                result = (result * base) % modulus
            exponent >>= 1
            base = (base * base) % modulus
        return result

    Вызывается он внутри генерации ключей (с дополнительными оптимизациями) примерно так:

    def keys(bits):
        """
        keys(bits) -> (public, private)
        Generate public and private RSA keys of the given size.
        """
        # Pragma: use a fixed e, the fourth Fermat prime (0b10000000000000001)
        e = 2**16+1
        while True:
            # Generate two large prime numbers p and q, n = pq and φ = (p-1)(q-1)
            s = bits / 2
            mask = 0b11 << (s - 2) | 0b1 # two highest and the lowest bit
            while True:
                p = getrandbits(s) | mask
                # Pragma: check p % e here to guarantee that φ and e are coprimes
                if p % e != 1 and rmspp(p): 
                    break
            s = bits - s
            mask = 0b11 << (s - 2) | 0b1 # same as above, but maybe different s
            while True:
                q = getrandbits(s) | mask
                if q != p and q % e != 1 and rmspp(q): 
                    break
            n = p * q
            phi = (p - 1) * (q - 1)
            # Pragma: e is chosen already and is relative prime to φ
            # Compute d, a modular multiplicative inverse to e (i.e. e*d % φ = 1)
            d = mmi(e, phi)
            if d: # if not, the process will repeat
                break
        return (n, e), (n, d)
    
    ef mmi(a, m):
        """
        mmi(a, m) -> x, such as ax % m = 1
        mmi is a Modular Multiplicative Inverse
        See http://en.wikipedia.org/wiki/Modular_multiplicative_inverse
        """
        gcd, x, q = egcd(a, m)
        if gcd != 1:
            # The a and m are not coprimes, so the inverse doesn't exist
            return None
        else:
            return (x + m) % m
    
    def egcd(a, b):
        """
        egcd(a, b) -> d, x, y, such as d == gcd(a, b) == ax + by
        egcd is an Extended Greatest Common Divisor
        http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
        """
        if b == 0:
            return (a, 1, 0)
        else:
            d, x, y = egcd(b, a % b)
            return d, y, x - y * (a / b)

    Насчет «доли вероятности» — насколько я помню, в алгоритме Миллера-Рабина при увеличении числа попыток вероятность ложного срабатывания легко сделать сколь угодно малой (например, меньше чем верояность отказа железа :), и, кроме того, насколько я помню, конкретно в случае с RSA полученные числа будут еще раз проверены при расчете modular multiplicative inverse, а его невозможно будет получить, если число не простое (приведенная функция keys() в таком случае продолжает цикл генерации).
    Ответ написан
    2 комментария
  • Несколько вопросов знатокам Python?

    @MikhailEdoshin
    Я не эксперт, но, насколько понимаю 1) это интерпретаторы, компилятор один — Cython; 2а) автоматического распараллеливания нет, там вообще глобальный lock на интерпретатор; 2б) ленивые вычисления, в принципе, можно сделать с генераторами; в целом, на многоядерных процессорах Python автоматом не ускорится, а то и замедлится.
    Ответ написан
  • А вы используете нижнее подчеркивание для именования глобальных переменных?

    @MikhailEdoshin
    У меня глобальные переменные называются длинными внятными именами, а локальные — короткими, часто однобуквенными.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы пустые узлы в xml не отображались?

    @MikhailEdoshin
    Если узлы выбираются XPath'ом, можно применять шаблон только к узлам с текстом

    /path/to/node[text()]

    или, если у него есть подэлементы, и берется все значение

    /path/to/node[string(.)]

    или, если шаблон применяется в ходе обхода дерева, а не через select или for-each, то можно, соответственно, в паттерне указать:

    <xsl:template match="node[text()]">
       ...
    </xsl:template>

    или, если вы создаете новые узлы, и далее apply-templates, а потом оказывается, что ничего не вышло и элемент в результате пустой, то можно сначала apply-templates внутри переменной, а затем проверить, получилось ли что-нибудь:

    <xsl:variable name="contents">
      <xsl:apply-templates />
    </xsl:variable>
    <xsl:if test="string($contents)">
      <MyElement>
        <xsl:copy-of select="$contents" />
      </MyElement>
    </xsl:variable>
    Ответ написан
    2 комментария
  • Кто что думает об этом?

    @MikhailEdoshin
    Информация Первого канала вся целиком взята вот из этого документа. В котором говорится, что информатор X поведал специальному агенту Y, что неназванный расследователь ВВС США рассказал, что в Нью-Мехико и т. д. Живописные фотографии, скорее всего — это уже знаменитый фактчекинг Первого канала. Хотя всю папку я не просматривал.
    Ответ написан
  • Сервис генерирования PDF из языков разметки?

    @MikhailEdoshin
    Есть такой Prince XML, но он HTML/XML + CSS>
    Ответ написан
    Комментировать
  • Разобраться с XPath?

    @MikhailEdoshin
    Если я правильно понимаю, можно сначала отсортировать по двум критериям, а затем взять три первых значения. Основная трудность — position() в отсортированной выборке. Вот подходящее решение.
    Ответ написан
    1 комментарий
  • Как создать package для LaTeX, в котором были бы прописаны кастомные (нарисованные) символы (иероглифы)?

    @MikhailEdoshin
    Поставить пакет и посмотреть исходники? (Use the source, Luke!)
    Ответ написан
    Комментировать
  • Почему все подражают Лебедеву?

    @MikhailEdoshin
    Не обращайте внимания на Лебедева. Люди, подражающие Лебедеву, подражают ему оттого, что не владеют предметом, и не могут сами сказать, что лучше, а что хуже, потому и ищут вроде бы успешный во всех смыслах образец. Раз вас он не устраивает — это даже хорошо, слушайте себя.

    Родной стиль Лебедева — вау-дизайн, то есть нечто необычное, изумляющее, но, кстати, быстро преходящее. Любимый прием — каламбур (луковица с подписью «Look!», копилка в виде бомбы — кстати, пример дурного вкуса, «Фен Кихот», прищепки-летучие мыши и т. п.). В дизайне интерфейсов это все только мешает, поэтому лично я бы лебедевские работы тут за образец не брал, ну или относился бы критически. Лично мне лебедевский стиль не близок, и если уж брать с них пример, так в том, что они выдают на-гора работу за работой, и шрифт нарисуют, если нужно, и фотографии руками доработают, чтобы смотрелись (не бесплатно, конечно, но тем не менее), и портфолио у них загляденье, мне бы такое.

    [Кстати, Лебедев уже настолько популярен, что ему приписывают вообще всё. Например, многие полагают, что именно он делал интерфейс «Альфа-Клик», хотя, скорее всего, это не так.]
    Ответ написан
    Комментировать