• Как выгрузить данные с Canvas-графика?

    @nirvimel
    Там в теле cfnindex есть такой кусок.
    <script class="code" type="text/javascript">
        //<![CDATA[
        $(document).ready(function () {
            $.jqplot._noToImageButton = true;
            var graph = ...

    Вот в этом graph все исходные данные.

    Ну а с растрового Canvas, конечно, прочесть ничего невозможно, после того как график уже отрендерен.
    Ответ написан
    Комментировать
  • Ошибка при работе с dll (NameError: name 'WinDLL' is not defined) как это побороть?

    @nirvimel
    Дело в том, что ctypes, которая занимается подгрузкой динамических библиотек, не полностью кроссплатформенная. Как говорит документация, функция WinDLL существует только в ctypes под Windows. Из Python под Linux вы не сможете загрузить динамическую библиотеку, скомпилированную под Windows.
    Ответ написан
    6 комментариев
  • Кривой %26request_uri. Как победить?

    @nirvimel
    return 301 https://$host$request_uri;
    Ответ написан
    Комментировать
  • Как работают партнерские системы?

    @nirvimel
    Используя обычный прокси, можно надурить систему.

    Не так то просто на самом деле:
    1. 99% всех открытых прокси попадают в базы типа MaxMind и по ним легко определяются.
    2. Одного факта клика недостаточно для "засчета" парехода. На принимающей площадке может стоять анализатор пользовательской активности. Обмануть один скрипт, считающий клики - легко. Обмануть комплексную систему по анализу пользовательской активности - гораздо сложнее.
    3. Принимающая площадка может вести подсчет конверсии и при падении конверсии на определенном классе трафика (для этого применяется специальный эвристический классифиватор), информировать об этом партнерку. Партнерка, сопоставив трафик с источником, сразу забанит накрутчика.
    Ответ написан
    Комментировать
  • Как достичь анонимности на VDS сервере?

    @nirvimel
    У хостера полно возможности смотреть в вашу виртуальную машину без "вшивания" чего-либо туда. Машины под гипервизором для администратора выглядят примерно как сеансы разных пользователей в одной ОС, файловая система полностью открыта, доступ к оперативке тоже несложно получить.
    А образы берутся оригинальные (для OpenVZ только отделяется ядро) их нет смысла патчить.

    root уже удалил

    Прекрасно. Можно уже начинать переустанавливать.
    Ответ написан
    Комментировать
  • Отфильтровать шум в данных?

    @nirvimel
    Для этого существует Фильтр Калмана.

    Наглядный пример возможностей фильтра — получение оптимальных, непрерывно обновляемых оценок положения и скорости некоторого объекта по результатам временно́го ряда неточных измерений его местоположения.

    Фильтр Калмана — это, наверное, самый популярный алгоритм фильтрации, используемый во многих областях науки и техники. Благодаря своей простоте и эффективности его можно встретить в GPS-приемниках, обработчиках показаний датчиков, при реализации систем управления и т.д.

    Последняя цитата отсюда. А эта статья окончательно снимает все вопросы.
    Ответ написан
  • Как проксировать запрос на динамический url?

    @nirvimel
    http {
        server {
            listen *:80
            resolver 8.8.8.8;
            location ~ /path/to/example/(.*) {
                 try_files $1 /path/to/proxy/$1
            }
            location ~ /path/to/proxy/(.*) {
                proxy_pass http://$1;
            }
        }
    }

    Можете проверить: 127.0.0.1/path/to/example/google.com (но там сразу идет 301 редирект на HTTPS).

    UPD: Довавил возможность отдачи локальной статики. Сам еще не тестировал это.
    Ответ написан
    5 комментариев
  • Где можно взять базу характеристик телефонов/планшетов/ноутбуков в CSV/XML формате с картинками?

    @nirvimel
    Заказать на freelansim.ru парсинг Яндекс.Маркета с выгрузкой в CSV/XML и выкачиванием картинок.
    Ответ написан
    Комментировать
  • Как на Ассемблере наиболее простым методом вывести хоть что-то в консоль?

    @nirvimel
    Для начала вам надо определиться под какую архитектуру процессора и под какую ОС вы пишите. 16-битный код для DOS (похоже вы это имели в виду в своем примере) будет собираться и работать под Windows, но это не будет Windows-приложением.

    Тут представлены примеры хеллоу-вордов под разные ОС. Несмотря на то, что транслятор другой, несложно переписать под tasm.
    Ответ написан
    4 комментария
  • Как уникализировать текст?

    @nirvimel
    Автоматические уникализаторы? Какая ностальгия... Но вы опоздали с этим лет на десять.
    Ответ написан
  • Что почитать чтобы научиться писать на Python 3 сразу правильно?

    @nirvimel
    Мне в свое время понравился Марк Лутц в плане идиоматичности.
    Еще в последнее время много хвалят Майкла Доусона.
    Ответ написан
    4 комментария
  • Какой ORM для Java поддерживает sqlite из коробки?

    @nirvimel
    ORM и драйвер (клиент СУБД) - это несколько разные вещи и у них разные задачи. В ORM (с правильной архитектурой) не интегрируют драйвера. Поддержка той или иной СУБД со стороны ORM ограничивается поддержкой специфических особенностями SQL-синтаксиса и специфических фичей конкретной СУБД.
    Наличие самих драйверов требуется для большинства ORM.
    Если использование JDBC-драйвера по каким-то причинам неприемлемо, то остается вариант - отказаться от полноценной ORM и пользоваться альтернативными клиентами (не JDBC-совместимыми), типа sqlite4java.
    Ответ написан
    2 комментария
  • Python как убрать сообщение при открытие браузер через модуль webbrowser?

    @nirvimel
    Если был запрошен ввод из консоли, то консоль будет ожидать ввода до тех пор пока не будет нажат Enter, и не важно что в этот момент сыплется в консоль из других потоков. Это, конечно, сбивает с толку, но не влияет на ввод. Можно спокойно продолжать набирать текст, не обращая внимания на всю эту грязь, на ввод попадет только то что введено с клавиатуры. Но если хочется сделать как-то по-эстетичнее, то можно дождаться вывода, выдержать паузу, перевести строку и читать raw_input:
    import time
    webbrowser.open_new(self.url)
    time.sleep(2)  # можете сами подобрать это значение
    print("\n")
    self.code = raw_input("Code: ")
    Ответ написан
    Комментировать
  • Что будет за публикацию уязвимости/бага в публику?

    @nirvimel
    Есть способ красиво разрулить ситуацию. Для этого нужно составить грамотный disclaimer, добавить его к лицензии сверху, добавить его к описанию на Макрете (или любой площадке, на которой происходит публикация) сверху, даже если это несколько противоречит маркетинговому подходу, и добавить в само приложение всплывающее окно с этим текстом крупным шрифтом, чтобы окно нельзя было закрыть раньше чем через N (допустим N=5) секунд и чтобы функционал приложения становился доступным только после того как юзер кликнет по кнопке "Принимаю условия".
    В самом disclaimer указать, что пользователь лично несет полную ответственность за любые последствия применения данного ПО и возможный ущерб третьей стороне... В общем, гуглите "as is, disclaimer" и переводите.

    Сам провайдер, конечно, не оставит попыток любыми путями давить на вас и на плащадки, которые размещают у себя ваш софт. Будьте готовы, что ваше приложение очень быстро вылетит с Маркета. Но если вы оформите все грамотно и сами не будите пользоваться собственным софтом ;) то по закону предъявить вам будет фактически нечего. Хотя возможны попытки с их стороны, но в основном - это просто запугивание.

    Если вы решите этим заняться, то вам лучше подтянуть юридическую грамотность или найти человека, который хорошо разбирается в этих вопросах.
    Ответ написан
    Комментировать
  • Какая опасность в динамическом подключении скрипта?

    @nirvimel
    Если теги не фильтруются и спец.символы не экранируются, то возможен XSS.

    Надо экранировать символы, например, так по-простому, или специальными библиотеками, типа этой.
    Ответ написан
    2 комментария
  • Парс выдачи Google, как обойти блокировку?

    @nirvimel
    1. Заголовки Accept и Accept-Language зависят от User-Agent. Вы меняете User-Agent, и Гугл может фиксировать это расхождение. Попробуйте для начала вместо getUseragent() задать константную строку. Потом, если вам так нужно менять User-Agent, то посмотрите как это делает Random Agent Spoofer, он согласут все заголовки с фейковым User-Agent, возможно придется лезть в его исходники, поэтому проще с константной строкой.
    2. Попробуйте еще убрать ru-RU из Accept-Language. Это не означает, что пропадут русскоязычные результаты в выдаче или будут проблемы с кодировкой. У меня вообще вся система и браузер не локализованы, это не мешает гуглить по-русски.
    3. https://www.google.ru/search?q=q&num=100 такие запросы шлют только боты. В браузере при поиске с главной страницы Гугала идет запрос огромной длинны с десятком параметров, в том числе, какие-то уникальные хэши. Попробуйте сначала запросить главную, принять и записать все cookies, выдрать из формы поиска url, по которому уйдет запрос, добавьте туда q=blabla и посылайте новый запрос со всеми cookie. Кстати, на каждый запрос приходят новые cookie и их бы неплохо использовать в следующем запросе, как бы это происходило в реальном браузере, это увеличит время/количество_запросов до бана.
    4. Не запрашивайте сразу num=100, вам так проще парсить, а Гуглу так проще банить тех, кто парсит. Уберите этот параметр и выкачивайте SERP по одной странице. Между запросами делайте паузы в несколько секунд как серфил бы живой человек. При этом возможно параллельно работать с другим запросом из другой сессии с другим набором cookies и User-Agent, как будто несколько человек сидят с одного IP из-за NAT. Но, вообще, выборка SERP глубже одной-двух страниц сильно увеличивают подозрение в ваш адрес и приближают капчу, постарайтесь по возможности вообще отказаться от выборки 100 результатов ради того чтобы парсер работал хоть как-то.
    5. Перед тем как делать все это, запустите Wireshark и сравните в нем вживую два запроса: один из браузера, другой от вашего скрипта в его текущей реализации, возможно какие-то различия бросятся в глаза сразу.
    6. Даже при соблюдении всех условий, бан неизбежен рано или поздно, это зависит от объемов трафика, который вы создаете с одного IP. С этим уже ничего не сделать. Спасет только большой пул проксей.
    Ответ написан
    4 комментария
  • Глобальный импорт модулей в Python?

    @nirvimel
    Python не PHP. А глобальное пространство имен не помойка. Каждое имя должно попадать в глобальное пространство явным образом: либо через определение функции/класса, либо через импорт конкретного имени в заголовке этого же модуля, а не где-то в совершенно другом месте. Чтобы взглянув только на заголовок можно было сразу понять на что опирается и от чего зависит этот модуль. Чтобы вызов format_c() выбрасывал ошибку, если вы не писали никакой функции format_c, вместо того чтобы тихо вызывать где-то случайно заимпортированную os.low_level.dangerous.format_c

    Но для любителей помоек существует вариант понаимпортировать в отдельный модуль разные имена отовсюду, а в остальных модулях заменить всю секцию импорта на ничего не говорящую строку:
    from miscellaneous_imports_module import *
    Ответ написан
    1 комментарий
  • Как найти количество вхождений слова в тексте веб-страницы с помощью Python 3?

    @nirvimel
    from collections import Counter
    import re
    
    from lxml.html import fromstring
    from lxml.html.clean import Cleaner
    import requests
    
    
    def extract_text(node):
        """
        Extract text without markup from node
        """
    
        def extract_text_gen(node):
            if node.text:
                yield node.text.strip()
            for child in node.iterchildren():
                yield from extract_text_gen(child)
                if child.tail:
                    yield child.tail.strip()
    
        return ' '.join((s for s in extract_text_gen(node) if s))
    
    
    def count_words(text):
        return Counter((s for s in re.split(r'\s', text) if s))
    
    
    html = requests.get('https://toster.ru/q/276749').content.decode('utf-8')
    root = fromstring(html)
    Cleaner()(root)
    text = extract_text(root.body)
    words_count = count_words(extract_text(root))
    
    print('\n'.join(('"%s": %i' % (word, count) for word, count in words_count.most_common())))

    Функция extract_text взята из одного моего проекта, слегка адаптирована и упрощена.
    Ответ написан
    3 комментария
  • Есть ли у Тостера RSS?

    @nirvimel
    Открываете исходник главной страницы, нажимаете Ctrl+F, вводите application/rss+xml, там будет адрес вашей ленты. Адрес, естественно, уникальный.
    Ответ написан
    2 комментария
  • Можно ли писать server-side на нескольких языках одновременно?

    @nirvimel
    Это имеет смысл только если у вас в проекте на скриптовом языке есть критичный по производительности участок кода, который скрипт не тянет, и вам нужно переписать этот кусок на компилируемом языке чтобы скомпилировать в нативный код.

    Для этого используются комбинации: Python+Cython, Python+C/C++.
    Про Python+Go в продакшн я пока не слышал, но из того что я знаю о Go, если от способен компилироваться и работать на скоростях Си, то такая комбинация имеет смысл.

    Если да, то объясните, как это будет выглядеть и что для этого нужно.

    Со стороны Go - экспорт библиотечных функций в формате, позволяющем вызывать их из Си-кода (не знаю как это практически делается на Go или у него все экспортируемые функции имеют нативный формат вызова).
    Со стороны Python - написание биндинга через cffi. Только отладка такого самописного биндинга - большое приключение. При малейшей ошибке в описании интерфейса начнутся очень странные падения с segfault, ИЧХ иногда не в момент вызова а в произвольный момент после завершения вызова. Поэтому интерфейс надо стараться делать максимально компактным и прозрачным.
    Ответ написан
    Комментировать