• Map-Reduce на примере MongoDB

    В последнее время набирает популярность семейство подходов и методологий обработки данных, объединенных общими названиями Big Data и NoSQL. Одной из моделей вычислений, применяемых к большим объемам данных, является технология Map-Reduce, разработанная в недрах компании Google. В этом посте я постараюсь рассказать о том, как эта модель реализована в нереляционной СУБД MongoDB.

    Что касается будущего нереляционных баз вообще и технологии Map-Reduce в частности, то на эту тему можно спорить до бесконечности, и пост совершенно не об этом. В любом случае, знакомство с альтернативными традиционным СУБД способами обработки данных является полезным для общего развития любого программиста, так же как, к примеру, знакомство с функциональными языками программирования может оказаться полезным и для программистов, работающих исключительно с императивными языками.

    Нереляционная СУБД MongoDB представляет данные в виде коллекций из документов в формате JSON и предоставляет разные способы обработки этих данных. В том числе, присутствует собственная реализация модели Map-Reduce. О том, насколько целесообразно применять именно эту реализацию в практических целях, будет сказано ниже, а пока ограничимся тем, что для ознакомления с самой парадигмой Map-Reduce эта реализация подходит как нельзя лучше.

    Итак, что же такого особенного в Map-Reduce?
    Читать дальше →
    • +54
    • 55.8k
    • 8
  • Корпоративная АТС на базе Asterisk

    Предпосылки

    В жизни любой крупной развивающейся компании рано или поздно встаёт вопрос о расширении возможностей телефонной станции и переходе от классической телефонии к IP.

    Далёкой весной 2011 и перед нашей компанией встал такой вопрос, т. к. внешние и внутренние линии требуют постоянного расширения, а количество портов на старом Panasonic KX-TA624 было задано статично и расширению не подлежало. Открытие офисов в других городах и внедрение единой службы по работе с клиентами в других городах так же подталкивало к качественным переменам.

    Техническое задание

    Конечный продукт должен иметь следующие характеристики:
    1) иметь большое количество (в нашем случае не менее 100) внешних и внутренних линий и быть готовым к расширению;
    2) уметь приветствовать пользователей в рабочее время и сообщать о том, что они позвонили в нерабочее время, когда никого нет на месте;
    3) таймауты переадресации при не ответе/занятости/недоступности должны настраиваться индивидуально;
    4) должны быть предусмотрены очереди. Очередь — группа номеров, распределение звонков внутри которой происходит по определенным правилам;
    5) записывать лог сообщений (как текстовый, так и аудио);
    6) иметь гибкую политику распределения прав на внешние звонки. Должны быть предусмотрены пользователи, которые могут звонить только на внутренние номера; на городские номера; на любые номера;
    7) в зависимости от времени суток, звонить на тот или иной номер.
    Читать дальше →
  • Использование Google Cloud Speech API v2 в Asterisk для распознавания русской речи

    Добрый вечер, коллеги. Недавно возникла необходимость добавить систему голосовых заявок в нашу ticket-систему. Но не всегда удобно каждый раз прослушивать голосовой файл, поэтому возникла идея добавить к этому систему автоматического распознавания голоса, к тому же в будущем она бы пригодилась в других проектах. В ходе этой работы были испробованы два варианта API наиболее популярных систем распознавания речи от google и yandex. В конечном итоге выбор пал на первый вариант. К сожалению, не нашел подробной информации об этом в интернете, поэтому решил поделиться полученным опытом. Если интересно, что из этого получилось добро пожаловать под кат.
    Читать дальше →
  • Русский нейросетевой чатбот

      О чатботах, использующих нейронные сети я уже писал некоторое время назад. Сегодня я расскажу о том как я попробовал сделать полномасштабный русскоязычный вариант.



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

      Читать дальше →
    • Как работает реляционная БД

      • Translation
      • Tutorial
      Реляционные базы данных (РБД) используются повсюду. Они бывают самых разных видов, от маленьких и полезных SQLite до мощных Teradata. Но в то же время существует очень немного статей, объясняющих принцип действия и устройство реляционных баз данных. Да и те, что есть — довольно поверхностные, без особых подробностей. Зато по более «модным» направлениям (большие данные, NoSQL или JS) написано гораздо больше статей, причём куда более глубоких. Вероятно, такая ситуация сложилась из-за того, что реляционные БД — вещь «старая» и слишком скучная, чтобы разбирать её вне университетских программ, исследовательских работ и книг.

      На самом деле, мало кто действительно понимает, как работают реляционные БД. А многие разработчики очень не любят, когда они чего-то не понимают. Если реляционные БД используют порядка 40 лет, значит тому есть причина. РБД — штука очень интересная, поскольку в ее основе лежат полезные и широко используемые понятия. Если вы хотели бы разобраться в том, как работают РБД, то эта статья для вас.
      Читать дальше →
    • Несколько интересностей и полезностей для веб-разработчика #23

        Доброго времени суток, уважаемые хабравчане. За последнее время я увидел несколько интересных и полезных инструментов/библиотек/событий, которыми хочу поделиться с Хабром.

        Basket.js



        Basket немного похож на RequireJS, только с его помощью все подключаемые скрипты и стили кешируются в localStorage. Тесты Google и Bing демонстрируют улучшение производительности при использовании локального хранилища по сравнению с обычным браузерным кешем. Проект изначально появился как эксперимент, который полностью оправдал результаты этих тестов.
        basket
            .require({ url: 'missing.js' })
            .then(function () {
                // Success
            }, function (error) {
                // There was an error fetching the script
                console.log(error);
            });
        


        Читать дальше →
      • Боевой сервер для Django-приложения: Ubuntu Server 10.04 LTS + django 1.4 + nginx + gunicorn

        Многие учебные пособия по разработке на Django раскрывают как быстро получить работающий отладочный сервер (python manage.py runserver), а вопрос развертывания в боевом режиме часто остается нераскрытым или освещаются далеко не самые простые и эффективные методы.
        Ниже я расскажу о об одном из способов развернуть сайт на Django в боевом режиме, начиная от выбора хостинга, заканчивая развертыванием веб-сервера. Таким образом статья может быть полезна тем, кто освоил разработку на базе Django, но не имеет опыта развертывания серверов. Мой способ один из многих, но он достаточно прост, эффективен в работе и легок в поддержке. Используем VPS-хостинг, Ubuntu 10.04, nginx, gunicorn.

        Читать дальше →
      • Титаник на Kaggle: вы не дочитаете этот пост до конца

          Привет, хабр!

          #{Data Science для новичков}

          Меня зовут Глеб Морозов, мы с Вами уже знакомы по предыдущим статьям. По многочисленным просьбам продолжаю описывать опыт своего участия в образовательных проектах MLClass.ru (кстати, кто еще не успел — до конца еще можно получить материалы прошедших курсов — это, наверное, самый краткий и максимально практичный курс по анализу данных, который можно себе представить).

          Данная работа описывает мою попытку создать модель для предсказания выживших пассажиров «Титаника». Основная задача — тренировка в использовании инструментов применяемых в Data Science для анализа данных и презентации результатов исследования, поэтому данная статья будет очень и очень длинной. Основное внимание уделено исследовательскому анализу (exploratory research) и работе по созданию и выбору предикторов (feature engineering). Модель создаётся в рамках соревнования Titanic: Machine Learning from Disaster проходящего на сайте Kaggle. В своей работе я буду использовать язык «R».
          Читать дальше →
          • +28
          • 57.9k
          • 5
        • HackerSIM: подделка любого телефонного номера. CTF по социальной инженерии

            «Народ не должен бояться своего правительства, правительство должно бояться своего народа»
            «Privacy is ultimately more important than our fear of bad things happening, like terrorism.»


            Уверены ли вы, что вам звонит тот, за кого себя выдает? Даже если высвечивается знакомый номер.

            Недавно я обзавелся "хакерской симкой всевластия". Которая помимо лютой анонимности имеет фичу — подделка номера. Расскажу как это происходит.

            Чак на своем телефоне, куда вставлена HackerSIM, набирает команду *150*НомерАлисы# и через секунду получает подтверждение, что номер успешно «подделан». Затем Чак звонит со своего телефона Бобу. Телефон Боба принимает вызов, и на нем высвечивается, что ему звонит… Алиса. Profit.

            Далее события разворачиваются в зависимости от социнженерного (или чревовещательного) таланта Чака.

            Я начал разыгрывать своих хороших знакомых.
            Читать дальше →
          • Как написать пост с формулами: markdown + LaTeX

            • Tutorial
            Привет! На Хабре периодически появляются статьи, где авторы хотят вставить математические формулы: inline_formula, inline_formula или даже


            У некоторых это получается, у некоторых — с трудом. parpalak сделал web-сервис для вставки svg формул, и это очень круто. Я хочу дополнить его небольшим скриптом, с которым вставка многих формул сведется к одной команде.

            Читать дальше →
          • Простой алгоритм для поиска всех совпадающих под-текстов в двух текстах

              По долгу службы мне часто нужно находить все пересечения между текстами (например, все цитаты из одного текста в другом). Я достаточно долго искал стандартное решение, которое бы позволило бы это делать, но найти его мне так и не удалось — обычно решается какая-то совсем или немного другая задача. Например, класс SequenceMatcher из difflib в стандартной библиотеке Питона находит самую длинную общую подпоследовательность в двух последовательностях hashable элементов, а потом рекурсивно повторяет поиск слева и справа от нее. Если в одном из текстов будет более короткая подпоследовательность, которая содержится внутри уже найденной (например, если кусок длинной цитаты где-то был повторен еще раз), он ее пропустит. Кроме того, когда я загнал в него «Войну и мир» и «Анну Каренину» в виде списков слов и попросил для начала найти самую длинную подпоследовательность, он задумался на семь минут; когда я попросил все совпадающие блоки, он ушел и не вернулся (в документации обещают среднее линейное время, но что-то в прозе Льва Толстого, по-видимому, вызывает к жизни worst-case квадратичное).

              В конечном итоге я придумал свой алгоритм, тем самым наверняка изобретя велосипед, который надеюсь увидеть в комментариях. Алгоритм делает ровно то, что мне нужно: находит все совпадающие последовательности слов в двух текстах (за исключением тех, что в обоих текстах входят в состав более крупных совпадающих последовательностей) и сравнивает «Войну и мир» с «Анной Карениной» за минуту.

              Читать дальше →
            • «pip -t» — простая альтернатива virtualenv

              • Translation

              TL;DR


              Чтобы просто установить и изолировать зависимости проекта, virtualenv часто оказывается слишком тяжелым решением. Предлагаем простую альтернативу:
              1. добавить ./.pip в переменную окружения PYTHONPATH,
              2. установить пакеты локально с помощью pip install -t .pip,
              3. запускать python из папки проекта.

              Читать дальше →
            • HTML и SVG: создаём интерактивную карту

              • Tutorial
              Давайте создадим интерактивную карту. Чего-нибудь. Что значит интерактивную? Ну, она должна взаимодействовать с пользователем и с данными на веб-странице, на которой она расположена. Думаю, этого достаточно, чтобы считать её интерактивной.

              Что же, и возьмём мы SVG. Почему? Да потому что с ним легко работать человеку, знакомому с HTML. SVG — это векторный формат, основанный на XML. То есть у SVG-рисунка есть своя DOM, к различным элементам можно применять CSS-правила и управлять старым добрым JavaScript'ом.

              Что же, начнём?
              Читать дальше →
            • Управляем бесколлекторными двигателями, господа

              Привет Хабровчане!
              Решил я рассказать «всему свету» о проблеме, с которой столкнулся при постройке своего проекта, и как мне удалось её решить.

              А речь сегодня пойдет о бесколлекторных двигателях, о регуляторах хода и как ими управлять.
              Что же такое бесколлекторный двигатель, я не буду долго расписывать (сами можете посмотреть Wiki), а скажу в 2х словах, это 3х фазный двигатель постоянного тока.

              И приводится в движение сие чудо благодаря специальному регулятору, который последовательно переключает обмотки с определенной частотой.
              Управляя частотой переключения обмоток мы управляем скоростью вращения ротора.
              Ну что же, надеюсь тут все понято, идем дальше.
              Читать дальше →
            • Шпаргалка по mongodb: e-commerce, миграция, часто применяемые операции и немного о транзакциях

              • Tutorial

              Этот пост — небольшая шпаргалка по mongodb и немного длинных запросов с парой рецептов. Иногда бывает удобно когда какие-то мелочи собраны в одном месте, надеюсь, каждый, кто интересуется mongodb, найдет для себя что-то полезное.


              Не хотелось бы, чтобы пост воспринимался в ключе холиваров на тему SQL vs. NOSQL И так понятно что везде есть свои плюсы и минусы, в данном случае это просто где-то немного справки, где-то немного примеров из того, с чем приходилось сталкиваться. Примеры на mongo shell и на python.


              1. Миграция в на новые версии в mongodb
              2. Запросы сравнения и логические
              3. Полнотекстовый поиск в Mongodb, regexp, индексы и пр.
              4. Атомарные операторы (модифицирующие данные )
              5. Немного о транзакциях в Mongodb
              6. Агрегационный фреймворк и JOIN-ы в Mongodb
              7. Примеры
              8. Небольшая песочница на Python

              Читать дальше
            • Финансы в Excel+VBA. Калькулятор опционов по модели Блэка-Шоулза

              Статья адресована и будет полезна в первую очередь тем, кто начал изучать опционы и хочет разобраться в их ценообразовании. Ну и во вторую очередь тем, кто ещё не использует инструмент VBA в своих расчётах в екселе, но хочет научиться — вы увидите, как это на самом деле просто.
              Читать дальше →
              • +2
              • 29.6k
              • 4
            • Нефтяные ряды в R

                «Графики цен великолепны, чтобы предсказывать прошлое»
                Питер Линч



                С временными рядами мне как-то не доводилось иметь дело на практике. Я, конечно, читал о них и имел некоторое представление в рамках учебного курса о том, как в общих чертах проводится анализ, но хорошо известно, что то, о чем рассказывают в учебниках по статистике и машинному обучению, не всегда отражает реальное положение дел.
                Читать дальше →
              • 8 вещей, из-за которых не стоит жить в Силиконовой Долине

                  Disclaimer 1: Я живу в долине уже 4 года, где работаю на позиции программиста в главном офисе Google.

                  Disclaimer 2: Я знаю, что иногда долину называют Силиконовой, иногда Кремниевой. Я лично предпочитаю «Силиконовая», хотя оба варианта правильные.

                  Самый важный disclaimer: Все нижеописанное рассказывает только про недостатки — эта статья изначально задумана как односторонняя. В Долине еще куча достоинств, про которые я тут не пишу. И для очень многих (включая меня) эти достоинтсва перевешивают недостатки. Поэтому мы не собираем чемоданы, а остаемся здесь жить.

                  Важный Update: Это односторонняя статья, только про недостатки. В Долине есть достоинства, и о них я тоже писала, просто отдельно. Просто позже ссылку пришлось убрать, как как мой сайт пал жертвой хабраэффекта.

                  Не так давно я писала про поиск работы для программиста в США. И первое место, которое приходит на ум при разговоре о США и программистах — это конечно же Силиконовая Долина. У нее богатая история, есть неоспоримые достоинства, да и зарплаты для программистов там вполне приличные. Но идеальных мест не бывает, и у долины тоже есть свои недостатки. О них сегодня и пойдет речь.

                  Итак, приступим…

                  Цены на недвижимость


                  О цены, сколько в этом слове? Итак, допустим, вы хотите дом в хорошем районе, с хорошими школами. Сколько такой дом стоит? Давайте попробуем найти дом с максимальной ценой в 1 миллион в Palo Alto:

                  Нашелся. Адын штук:



                  Видок у дома как минимум сомнительный:


                  Читать дальше →
                • Поиск жилья без посредников в 21-м веке

                    Полагаю, все мы однажды искали себе жилье. Кто-то — в собственность, большинство, вероятно, в аренду. Все, кто хоть раз пытался найти реальные предложения на досках объявлений, знают — это нереально. Такого количества спама нет, пожалуй, ни в одной другой сфере. После того, как окунешься в этот ад, обычно руки начинают чесаться применить свою IT-шность на благо ближнему. Результатом для меня стал проект Sobnik, о котором я и хочу рассказать.

                    Sobnik — это плагин для Chrome, который помечает посредников на досках объявлений. Пока работает только с Avito.ru, в ближайшем будущем я добавлю Irr.ru и другие крупные доски. Всех, кто сидит на чемоданах и кому не терпится попробовать, прошу в Google Web Store. Под катом я расскажу о технической стороне проекта, о его перспективах и о моих наблюдениях за противником посредниками. Любители критиковать чужой JS-код также велкам, исходник клиентской части плагина доступен на github.

                    Читать дальше →