Задать вопрос
  • Как парсить большие(>25GB) файлы(логи активности) и ранжировать полученную информацию, какие технологии лучше использовать?

    iximiuz
    @iximiuz
    Вот ответ на ваш вопрос. Основная идея:
    файл лога -> парсер -> logstash -> elastic search -> kibana
    Ответ написан
    Комментировать
  • Как вносить правки в dist-packages в Питоне?

    iximiuz
    @iximiuz
    Вам точно нужно исправить системный модуль? Может быть лучше создать virtual environment, установить в него все требуемые зависимости (или на крайний случай разрешить использовать системные, а установить только этот модуль) и пропатчить его? А после этого использовать python из виртуального окружения в своем проекте.

    P.S. pull request на GitHub (если возможно) сделайте в любом случае.
    Ответ написан
    2 комментария
  • С чего начать написание парсера?

    iximiuz
    @iximiuz
    Отличная и мощнейшая библиотека для парсинга сайтов на Python - это scrapy.

    В то же время, есть два "интересных" проекта - zenrus.ru и ruszen.ru. И где-то я видел статью, что как минимум одному из них, сделанному на коленке, было очень трудно справляться с неожиданно выросшей нагрузкой. Я бы порекомендовал вам использовать какой-либо бродкастинг для оповещения всех подключенных клиентов об изменении курса - что-то вроде websocket.
    Ответ написан
    Комментировать
  • Какое самое перспективное направление?

    iximiuz
    @iximiuz
    Попробуйте пройти пару коротких курсов. Начать можно вот с этого. В процессе поймете, что нравится, а что нет.
    Ответ написан
    Комментировать
  • Путаница в git с историей коммитов, как отменить два коммита и merge?

    iximiuz
    @iximiuz
    То, что вам нужно, называется rewrite history. Опасно для выполнения в конкурентной среде, т.е. если одновременно с вами кто-то еще может сделать pull или push в удаленный репозиторий. См. здесь. Грубо говоря, нужно было сделать git push --force, а не git pull + git commit --amend + git push. Но все еще поправимо, git может все!
    Ответ написан
    Комментировать
  • Как из адреса забрать access_token?

    iximiuz
    @iximiuz
    Вы должны изменить параметр response_type=token на response_type=code в своем запросе. После этого на указанный redirect_uri придет запрос с параметром code. Используя этот code можно получить access_token, сделав запрос с вашего сервера ("из контроллера"), на сервер ВК. Подробнее тут.
    Ответ написан
    3 комментария
  • Как обмениваться данными между скриптами (Python)?

    iximiuz
    @iximiuz
    То, что вы ищете, называется IPC. В частности для Python можно посмотреть здесь.

    Для того, чтобы обеспечить взаимодействие нескольких независимых скриптов, можно воспользоваться следующим подходом: открываете pipe в обоих процессах. Первый скрипт выполнил действие - сделал запись в канал и начинает блокирующее чтение из канала. Второй скрипт получил сообщение из канала - выполнил действие, сделал запись в канал, разблокировав первый скрипт. Сам же снова подвис на чтении из канала. И так далее. Вместо pipe можно использовать socket, shared memory и пр. Как правильно было подмечено товарищем bobrovskyserg, в общем случае IPC - это про взаимодействие разнородных процессов, они не обязательно должны все (или хотя бы один) быть написаны на Python.
    Ответ написан
    7 комментариев
  • Какой российский ВУЗ на данный момент лучший в сфере IT?

    iximiuz
    @iximiuz
    Попытайте счастье в получении образования заграницей или:
    udacity
    edx
    coursera
    Ответ написан
  • Как удобней передать в шаблонизатор кучу аргуметов?

    iximiuz
    @iximiuz
    Сделайте так:
    tpl_params = {...}  # сколько угодно строк, заполняющих dict.
    return render_template("index.html", **tpl_params)

    А вообще... Есть такая практика - не передавать в шаблон море переменных. Кажется в Rails, если пишешь код в RubyMine, даже предупреждения будут, если передал в шаблон больше 1 или 2 объектов. Есть такой паттерн - View Object. Это про то, что нужно собрать все данные, требуемые текущей страницей, в один более или менее согласованный (по интерфейсу) объект и передать в шаблон именно его. При таком подходе код становится чище, и проще писать тесты на шаблонизацию.
    Ответ написан
    Комментировать
  • Как определить наименьшее уникальное значение в словаре?

    iximiuz
    @iximiuz
    Необходимо стараться написать общий алгоритм решения задачи, а не перебрать допустимые варианты. Это можно делать даже без использования конкретного языка программирования, пользуясь лишь логическими утверждениями. Например: для начала подсчитаем количество вхождений каждого из значений в словаре (см. counter в коде). Затем выберем наименьшее уникальное значение. Для этого необходимо отфильтровать массив уникальных, затем отсортировать его по возрастанию и взять первый элемент (см. lowest_unique = (sorted([k for k in counter if counter[k] == 1]) or [None])[0]). Теперь необходимо найти ключ в начальном словаре, соответствующий найденному минимальному значению. Можно, конечно, перебрать все ключи в словаре и проверить их значения, но это долго. Если же сделать отражение начального словаря (переворот, flip), то заданное значение ключа можно будет найти простейшим обращением flipped_dict[lowest_unique]. Делаем переворот: flipped_dict = dict(zip(initial_dict.values(), initial_dict.keys())).

    Полная версия кода:
    initial_dict = {'Foo': 23, 'Bar': 26, 'Baz': 45, 'Bang': 23}
    flipped_dict = dict(zip(initial_dict.values(), initial_dict.keys()))  
    # print(flipped_dict)
    # {26: 'Bar', 45: 'Baz', 23: 'Foo'}
    
    counter = {}
    for k in initial_dict:
    	val = initial_dict[k]
    	counter[val] = counter.get(val, 0) + 1
     # print(counter)  
     # {26: 1, 45: 1, 23: 2}
    
    lowest_unique = (sorted([k for k in counter if counter[k] == 1]) or [None])[0]
    if lowest_unique is None:
    	print("Not found!")
    else:
    	print("Found [%s]->[%s]" % (flipped_dict[lowest_unique], lowest_unique))
    Ответ написан
  • Где найти самое простое объяснение Dependency Injection паттерна?

    iximiuz
    @iximiuz
    Мартин Фаулер круто пишет обо всех паттернах. Про DI можно почитать тут. Вообще у него отличный блог. И он же автор книги P of EAA. Правда русский ее перевод крайне не рекомендую читать, можно только запутаться, так что читайте в оригинале.

    Если хотите разобраться с паттернами, то самая простая (и при этом дельная!) книга - это Фриман&Фриман. Ее можно читать и на русском.

    Применительно к PHP - вот лучшая книга про шаблоны (и не только), которую я видел PHP. Объекты, шаблоны и методики программирования от Мэт Зандстра.

    Порядок прочтения рекомендую следующий: Фриман&Фриман, затем Мэт Зандстра, и на десерт Фаулера P of EAA.

    UPD:
    Важно отличать паттерн Dependency Injection от Dependency Injection Container.
    Простейший пример внедрения зависимости:
    interface IEngine {}
     
    class V8Engine implements IEngine {}
     
    class Car {
      public function __constructor(IEngine $engine) {
        $this->engine = $engine;
      }
    }
     
    $car = new Car(new V8Engine());

    Простейший пример игнорирования явного внедрения (для такого кода трудно писать unit-тесты, его труднее понимать и править):
    class V8Engine {}
    
    class Car {
      public function __constructor() {
        $this->engine = new V8Engine();
      }
    }
    
    $car = new Car();

    Отличный (и легковесный) пример DIC - это pimple:
    // define some services
    $container['session_storage'] = function ($c) {
        return new SessionStorage('SESSION_ID');
    };
    
    $container['session'] = function ($c) {
        return new Session($c['session_storage']);
    };

    Советую прочитать и понять его исходники, чтобы убедиться, что в DIC (во всяком случае для PHP) нет никакой магии. Первая версия была всего ~100 строк. Необходимо также отметить, что класс Session использует шаблон Dependency Injection, явно определяя свою зависимость от SessionStorage. А контейнер делает лишь правильную связку.

    И да, контейнер сам по себе можно использовать как service locator, если к нему, например, есть глобальный доступ. Но это очень плохая практика, потому что если что-то обращается к сервис локатору, то формально оно начинает зависеть сразу от всех компонентов системы.
    Ответ написан
    4 комментария
  • Какие есть интерактивные площадки для изучения Haskell наподобие Codeacademy.com?

    iximiuz
    @iximiuz
    HackerRank прекрасен. Всегда интересные задачи. Правда там нет теории по самому языку, но зато можно оттачивать полученные теоретические навыки.
    Ответ написан
    Комментировать
  • Хотейки и вопросы по проектированию классов?

    iximiuz
    @iximiuz
    По первому пункту налицо нарушение закона Деметры. Вероятнее всего нужно по-другому поделить ответственность между классами, чтобы не возникала необходимость делать длинные цепочки вызовов.

    По поводу второго пункта. PHP и так вполне себе DDL язык. Если нужно хранить данные, то можно спокойно их хранить в специальных PHP файлах, содержащих один массив, например. И инклюдить их в нужном месте. Все эти замесы с ini-файлами (и еще того хуже xml-файлами) пошли от компилируемых языков, особенно из Java, когда описать конфиги непосредственно в Java-коде с возможностью их изменения без перекомпиляции всей программы достаточно проблематично.
    Ответ написан
    2 комментария
  • Как оптимизировать код на Python (поиск в строке)?

    iximiuz
    @iximiuz
    Если количество уникальных word не слишком велико, то можно сделать "index" по ним. Тогда последующий поиск такой же подстроки будет происходить за O(1), а не за O(n) как это происходит с оператором in. Минус - оверхед по памяти на индекс.

    def in_checker(word, s):
        if not hasattr(in_checker, '_index'):
            in_checker._index = {}
        if word not in in_checker._index:
            in_checker._index[word] = word in s
        return in_checker._index[word]
    
    in_checker('abc', 'tttrrrabcwww');  # O(n)
    in_checker('abc', 'tttrrrabcwww');  # O(1)
    Ответ написан
    4 комментария
  • PostgreSQL, как ускорить проверку наличия уникального значения в столбце?

    iximiuz
    @iximiuz
    У вас доступ фактически по ключу, храните в key-value хранилище просто, например в Redis.
    Ответ написан
  • Как эффективно вставить очень много строк в memory table MySQL?

    iximiuz
    @iximiuz
    Попробуйте сначала сформировать файл с данными, необходимыми для вставки, а затем вызвать LOAD DATA INFILE. Это очень быстрый способ залить большое количество данных в таблицу MySQL. С другой стороны возможно стоит использовать другое хранилище, или вынести эту операцию из пользовательского запроса в асинхронную очередь.
    Ответ написан
    Комментировать
  • Можно ли в php поставить "указатель" на участок памяти?

    iximiuz
    @iximiuz
    Начиная с версии 2.8 Redis поддерживает notifications. Подробнее тут. Вкратце - можно подписаться скриптом на выполнение команды SET над заданным ключом (т.е. фактически изменение значения). В остальном redis также отлично подходит для замены memcache.
    Ответ написан
    Комментировать
  • Какой язык программирования выбрать?

    iximiuz
    @iximiuz
    Python или JS. А PHP ни в коем случае, как стартовый язык. Он дает слишком искаженное понимание бекграунда веб-разработки из-за особенностей работы интерпретатора (изолирование окружение скрипта, reset интерпретатора между запросами). При этом Python, JS, Ruby и скорее всего Java, хотя на последней у меня нет опыта, в плане веб-разработки выглядят очень похожими. Общие принципы построения и запуска приложений, многопоточность, асинхронность (как возможность). В PHP ничего этого нет, там все выглядит куда более линейным и упрощенным. Пересесть с Python или Ruby на PHP (при необходимости!) будет элементарной задачей, а вот обратное - не верно, слишком много новых концепций нужно будет освоить.

    И никаких фреймворков в начале обучения! Программист на Django звучит также ужасно, как программист на jQuery. Это как клеймо. Программист - это прежде всего понимание общих принципов разработки, а уже потом языки, фреймворки и пр. Так что прежде всего необходимо разобраться с wsgi. Написать пару своих скриптов, обрабатывающих запросы. Проверить, как работает эта кухня. Потом можно начать использовать flask.

    P.S. Доп. плюсы Python, JS и пр. - область их использования не ограничена вебом. Возможно в будущем вы будете этому рады, когда решите вместо сайтов программировать боевых роботов или попробовать себя в машинном обучении или еще где-нибудь.
    Ответ написан
    4 комментария