• Производительность Apache Parquet

    • Перевод

    Плохой пример хорошего теста


    В последнее время в курилках часто возникали дискуссии на тему сравнения производительности различных форматов хранения данных в Apache Hadoop — включая CSV, JSON, Apache Avro и Apache Parquet. Большинство участников сразу отметают текстовые форматы как очевидных аутсайдеров, оставляя главную интригу состязанию между Avro и Parquet.


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


    Как любой уважающий себя инженер, я подумал, что было бы неплохо провести полноценные performance-тесты, чтобы наконец проверить, на чьей стороне правда. Результат сравнения — под катом.


    Apache Parquet Logo

    Читать дальше →
  • Итоги «QIWI Scaladrom Meetup»

    • Tutorial
    QIWI собрала разработчиков на «Scaladrom» 24 марта
    24 марта в 19:00 по МСК в лофте «БАНКА», прошла неформальная встреча Scala-программистов Москвы «QIWI Scaladrom».

    Итоговые видеоматериалы во вложении.

    Читать дальше →
  • Большой JVM-опрос: версии Java, альтернативные JVM-языки, версии Java EE

      image

      С прошлого аналогичного опроса прошло больше года, и пришла пора его повторить и расширить.

      Ретроспектива:
      Какие версии Java вы используете? — 18 февраля 2015
      Какие версии Java вы используете? — 14 февраля 2014

      Опросы под катом
    • Реализация мониторинга и интеграционного тестирования информационной системы с использованием Scalatest. Часть 2

      • Tutorial


      В предыдущей статье Реализация мониторинга и интеграционного тестирования информационной системы с использованием Scalatest мы говорили о создании проекта в Idea и написании простых тестов. В этой части мы рассмотрим некоторые особенности работы фреймворка, а также приемы для решения задач, возникающих в ходе написания тестов.
      Более детально остановимся на специфике запуска тестов, разберем детали формирования отчетов, особенности работы с Selenium, а также обратим внимание на таймауты, ожидания, вызовы команд операционной системы, формирование jar файла с тестами
      Читать дальше →
    • Разбавляем асинхронное программирование функциональным на Scala

      Приветствую! В этой статье будет показано, как, имея на руках обычные Future-ы, сделать в scala подобие корутин и асинхронные stream-ы. Этакий небольшой туториал по функциональному программированию.

      Что это и зачем


      Что такое Future человеческим языком
      Future — это сущность, описывающая результат некоторых вычислений, который мы получим не сразу, но в будущем. Но есть одна особенность: зачастую мы, не зная еще результата, точно знаем, что мы с ним будем делать. Например, мы попросили у сервера какой-то конфиг, и теперь у нас есть Future[Config]. Сам конфиг мы еще не получили, но точно знаем, что, когда получим, то достанем из него адрес и по этому адресу попросим у сервера картинку (config => Future[Image]). И Future[Config] способна изменяться таким образом, чтобы мы вместо конфига и потом картинки могли получить сразу картинку. Сущности, способные комбинироваться таким способом, называются монадами.

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

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

      Применив знания из этой статьи, мы сможем этот процесс описать примерно так:

      Код
      // Про 'FState' - далее, пока же просто примем, что это - такая необычная Future
      def getNextConfig: FState[Config]
      def getTemperature(from: String): FState[Int]
      
      case class State(temperature: Int, sumTemp: Long, count: Int) {
        def isGood = ...
      }
      
      // Как видим, получается единый асинхронный алгоритм с состоянием, 
      // которое извне этого алгоритма не видно
      val handle = 
        while_ ( _.isGood)
        {  for (
              config <- getNextConfig();
              if (config.isDefined);  // пустой конфиг - прекращаем выполнение
              nextValue <- getTemperature(config().source);  // грузим значение температуры
              state <- gets[State];  // тут мы берем текущее состояние
              newState = State(nextValue, state.sumTemp + nextValue, state.count + 1);
              _ <- puts(newState);  // .. и меняем его
              _ <- runInUiThread { drawOnScreen(newState) }
        ) yield() }
      


      Или вот так:

      Код
      val configs: AsyncStream[Config] = ... // получаем откуда-то stream конфигов
      
      def getTemperature(from: String): FState[Int]
      
      case class State(temperature: Int, sumTemp: Long, count: Int)
      
      // Получается то же самое, только вместо зависимости 'getNextConfig'
      // мы, по сути, передаем сами данные - stream из конфигов
      val handle = 
        foreach(configs) {
          config => for (
              nextValue <- getTemperature(config().source);  // грузим значение температуры
              state <- gets[State];  // тут мы берем текущее состояние
              newState = State(nextValue, state.sumTemp + nextValue, state.count + 1);
              _ <- puts(newState);  // .. и меняем его
              _ <- runInUiThread { drawOnScreen(newState) }
          ) yield()  
        }
      


      Всех, кто заинтересовался, прошу под кат.
      Читать дальше →
    • Слежение за обновлениями из MongoDB Oplog в Sharded Cluster используя Scala и Akka Streams

      • Перевод

      Введение


      Эта статья является продолжением предыдущей опубликованной статьи Tailing the MongoDB Replica Set Oplog with Scala and Akka Streams.
      Как мы обсуждали прежде, слежение за обновлениями в MongoDB Sharded Cluster Oplog имеет свои подводные камни по сравнению с Replica Set. Данная статья попытается раскрыть некоторые аспекты темы.
      В блоге команды MongoDB имеются очень хорошие статьи, полностью покрывающие тему слежения за обновлениями из MongoDB Oplog в Sharded Clusters. Вы можете найти их по следующим ссылкам:

      Так же вы можете найти информацию об MongoDB Sharded Cluster в документации.
      Примеры, приведенные в данной статье не следует рассматривать и использовать в продакшн среде. Проект с примерами доступен на github.


      MongoDB Sharded Cluster


      Из документации MongoDB:
      Sharding, или горизонтальное масштабирование, разделение и распределение данных на нескольких серверах или сегментах (shards). Каждый сегмент является независимой базой данных, и в совокупности все сегменты составляют единую локальную базу данных.

      Sharded Collection


      В продакшин среде каждый узел является Replica Set:


      Sharded Cluster Architecture
      Читать дальше →
    • Встречайте IntelliJ IDEA 2016.1

        На прошлой неделе мы выпустили очередное крупное обновление — IntelliJ IDEA 2016.1. Ранее я уже писал подробно о доступных в нем улучшениях, а в этом посте лишь приведу их краткий список, дам ссылки на новые видео, и, конечно, буду рад ответить на ваши вопросы в комментариях.



        Читать дальше →
      • Дружим Scala и Android с помощью Macroid

        imageТак как на работе я пишу на старой доброй Enterprise Java, меня периодически тянет попробовать что-то новое и интересное. Так получилось, что в один момент этим новым и интересным оказалась Scala. И вот однажды, просматривая доклады со Scala Days, я наткнулся на доклад Ника Станченко о библиотеке под названием Macroid, которую он написал. В этой статье я попробую написать маленькое приложение для демонстрации её возможностей и рассказать об основных фишках этой библиотеки. Код приложения целиком доступен на Github.

        Если вам захотелось узнать, как эта библиотека помогает подружить Scala и Android, добро пожаловать под кат.
        Читать дальше →
      • Вспомнить всё: Java-конференция JET. 28 сентября 2015. Отчёт

        Меня зовут Дима и я разработчик. Живу в Минске, люблю посещать зарубежные конференции. Ну вот устал однажды ездить и решил сходить локально. Но выбора было мало. Поэтому вдвоём со своим верным товарищем решили сделать конференцию самостоятельно. Назвали JET. Потому что начинается с J, как и Java, а ещё можно сделать слоган "Let's fly to Java world". Ну что же, как это было?

        Открытие


        Началось все с выступления организаторов, где мы поделились тем, как зарождалась идея конференции. Рассказали о том, как мы прошли путь в 4 месяца подготовки, и что по итогу получилось. А получилось — 3 потока концентрированных знаний, 300 участников и первый кирпичик в фундаменте дома конференции JET.


        Читать дальше →
        • +14
        • 5,1k
        • 4
      • IoC: Еще один вариант реализации для Scala

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

          Одна из проблем при разработке сколь-либо большого проекта — это проблема зависимостей. Состоящая из
          — где взять нужный экземпляр объекта, если он был создан «наверху», а нужен глубоко внутри иерархии вызовов методов?
          — как управлять получением этого экземпляра, чтобы можно было подставлять другие реализации? Прежде всего актуально для тестов
          — как это сделать таким образом, чтобы любой кусок кода можно было запустить без долгой пляски с бубном над настройками фреймворка, реализующего п.1 и п.2?

          Читать дальше →
        • Слежение за обновлениями из MongoDB Replica Set Oplog используя Scala и Akka Streams

          Представляю вашему вниманию перевод статьи Tailing the MongoDB Replica Set Oplog with Scala and Akka Streams.

          Введение


          В этой статье я попробую объяснить, как следить за обновлениями в MongoDB Oplog при помощи Scala драйвера MongoDB и Akka Streams.
          Примеры, приведенные в данной статье не следует рассматривать и использовать в продакшн среде.
          Каждый из нас знает Unix команду tail -f, Tailable Cursor имеет тот же концепт. MongoDB предоставляет возможность использовать эту функцию по умолчанию и не требует дополнительных библиотек и инструментов. Что касается Oplog — это такая же коллекция, как и все остальные и ничего нового не требуется.
          Если вы хотите узнать больше об Oplog и Tailable Cursor, то вы можете найти больше информации в документации MongoDB:

          Проект созданный в данной статье удобно расположился на Github.
          Читать дальше →
        • Как себе выстрелить в ногу в Kotlin

            Совсем недавно вышел релиз Kotlin, а его команда разработчиков предлагала задавать вопросы про язык. Он сейчас на слуху и, возможно, многим хочется его попробовать.
            Пару недель назад тимлид сделал для компании презентацию о том, что в Котлине хорошо. Одним из самых интересных вопросов был «А как в Котлине выстрелить себе в ногу?» Так получилось, что ответил на этот вопрос я.

            Disclaimer:
            Не стоит воспринимать эту статью как «Kotlin — отстой». Хотя я отношусь скорее к категории тех, кому и со Scala хорошо, я считаю, что язык неплохой.
            Все пункты спорные, но раз в год и палка стреляет. Когда-то вы себе прострелите заодно и башку, а когда-то у вас получится выстрелить только в полночь полнолуния, если вы предварительно совершите черный ритуал создания плохого кода.

            Наша команда недавно закончила большой проект на Scala, сейчас делаем проект помельче на Kotlin, поэтому в спойлерах будет сравнение со Scala. Я буду считать, что Nullable в Kotlin — это эквивалент Option, хотя это совсем не так, но, скорее всего, большинство из тех, кто работал с Option, будут вместо него использовать Nullable.

            Читать дальше →
          • Затмение на острове Java или внимательней читайте стэктрейсы

            Я занимаюсь веб-разработкой, на работе мы используем стэк технологий на scala для наших проектов, основу этого стэка составляет Lift framework, также известный как liftweb. Lift использует sbt для управления сборкой и jetty или другой контейнер сервлетов как веб-сервер.

            Однажды мне пришлось поработать из дома, работалось прекрасно, разработческая версия сервера запускалась, все было как обычно. Но на следующий день, когда я вернулся к работе в офисе, при первом же запуске сервера случился полный облом. На экране консоли прямо во время запуска широко раскинулось исключение java.net.ConnectException с текстом Connection timed out: connect и трейсом на 86 строк. К сожалению, не было написано куда именно оно не смогло установить подключение. Поскольку сервер только запускается, единственное соединение, которое он должен пытаться установить — это LISTEN на определенном порту. Но исключение явно не об этом. Мало того, на порту уже отвечали с какой-то ошибкой больше 500.
            Читать дальше →
          • Пишем простой RESTful сервис на kotlin и spring boot

            image

            Введение


            В преддверии выхода языка Kotlin из beta, хочется поделиться своим впечатлением от его использования.

            Kotlin — это новый прекрасный язык от JetBrains (разработчиков IntelliJ Idea) для JVM, Android и браузера, который на первый взгляд выглядит как улучшенная java (или как упрощенная scala). Но это только на первый взгляд, язык не только впитал в себя многие интересные решения от других языков, но и представляет свои оригинальные:

            — optional от swift, nullsafe в kotlin
            — case классы из scala, data class в kotlin
            — замена implicit методам из scala, extension функций
            делегаты
            null safely
            smart cast
            — и многое другое, подробнее можно посмотреть на официальном сайте kotlinlang.

            Для тех кто знаком с java или scala, будет интересно сравнение kotlin & java, kotlin & scala.

            Авторы языка стремятся добиться двух задач:
            — сделать скорость компиляции сравнимой с java
            — язык должен быть достаточно выразительным, и при этом быть простым насколько возможно
            Поэтому, стоит оговориться, что если вы на текущей момент счастливы со scala, с ее «сложностью» и временем компиляции, тогда вам скорее всего не нужен будет kotlin, для всех остальных читать дальше:
            Читать дальше →
          • Data Driven Realtime Rule Engine в Wargaming: сбор данных

              Сфера деятельности нашей компании распространяется далеко за пределы игровой разработки. Параллельно с ней мы ведем десятки внутренних проектов, и Data Driven Realtime Rule Engine (DDRRE) – один из наиболее амбициозных.

              Data Driven Realtime Rule Engine – специальная система, которая при помощи анализа больших массивов данных в режиме реального времени позволяет персонифицировать взаимодействие с игроком через рекомендации, поступающие пользователю исходя из контекста его последнего игрового опыта.

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

              Архитектура DDRRE

              Читать дальше →
            • Scalding: повод перейти с Java на Scala



              В этой статье я расскажу о Twitter Scalding – фреймворке для описания процесса обработки данных в Apache Hadoop. Я начну издалека, с истории фреймворков поверх Hadoop. Потом дам обзор возможностей Scalding. В завершение покажу примеры кода, доступные для понимания тем, кто знает Java, но почти не знаком со Scala.

              Интересно? Поехали!
              Читать дальше →
              • +18
              • 20,5k
              • 5
            • Изучаем английский с Scala на Future и Actor

                Решил тут я подтянуть свой английский язык. В частности, захотелось значительно расширить словарный запас. Я знаю, что существует масса программ, которые в игровой форме помогают это сделать. Загвоздка в том, что я не люблю геймфикацию. Предпочитаю по старинке. Листочек бумаги где таблица со словами, транскрипцией и переводом. И учим его учим. И проверяем свои знания, например, закрывая столбец с переводом. В общем, как я учил это в университете.

                Прослышал я про то, что существует 3000 наиболее часто используемых слов, подобранных на OxfordDictionary сайте. Вот тут этот список слов: www.oxfordlearnersdictionaries.com/wordlist/english/oxford3000/Oxford3000_A-B Ну а перевод на русский я решил брать отсюда: www.translate.ru/dictionary/en-ru Одна только проблема, все находиться на этих сайтах ну совсем не в том формате, который можно распечатать и учить. В итоге родилась идея это все запрограммировать. Но сделать это не как последовательный алгоритм, а все распаралелить. Что бы выкачивание и парсинг всех слов занял не (3000 слов * 2 сайта) / 60 секунд = 100 минут. Это если давать по 1 секунде на выкачивание и распарсивание страницы для извлечения перевода и транскрипции (в реальности думаю это в 3 раза дольше, пока соединение откроем, пока закроем и тд и тп).

                image
                Читать дальше →
              • JavaDay Воронеж 2015: подробности и видео докладов



                  У воронежских Java-разработчиков есть традиция: каждую осень (уже пять лет подряд) они собираются, чтобы поговорить о самом актуальном и поделиться опытом. И каждый год эту встречу организует DataArt. В этом году конференция JavaDay Воронеж прошла в новом формате — камерное событие для опытных программистов, больше ориентированное на практику, чем на теорию. Организаторы решили отказаться от докладов для начинающих разработчиков в пользу технического хардкора. И нашим джавистам, судя по отзывам, такой формат пришелся по душе.
                  Читать дальше →
                • Конец эпохи динамических языков

                  • Перевод
                  • Tutorial
                  Несколько последних месяцев я программирую преимущественно на Scala (по работе) и на Haskell (для души). На этой неделе я, правда, ещё немного пописал на Ruby (по работе) и Clojure (для души).

                  Ruby вывел меня из равновесия почти сразу. Нет, ну ещё в плане «добавить небольшую фичу к уже имеющемуся коду» писать на нём можно. Вы просто добавляете юнит тест, запускаете его на старом коде, делаете правку, запускаете тест снова — вуаля, готово, забирайте. Но замахиваться на что-то большее становится уже слишком сложно.

                  Но вот что касается моего новенького, с иголочки, проекта-любимца на Clojure… О, Clojure! Глоток свежего воздуха! Благодатная земля хорошо скомпонованных функций, иммутабельных структур данных и всего такого. Как прекрасен твой синтаксис и как мудра твоя чувствительность! Вся твоя суть в функциях, принимающих мэпы и возвращающих мэпы. И твой SQL-генератор, и слой доступа к БД, и HTML-парсер, и URL-роутер являют собой одну и ту же завораживающую картину мэпов, гоняемых туда-сюда тактами процессора, прекрасную с своём ритме хорошо собранных швейцарских часов.

                  Вернуться к Clojure после долгого времени это всё равно, что почувствовать себя дома. Это просто окрыляет программиста. Но почему-то в этот раз я ощутил и ещё одно, неожиданное для себя чувство: неопределённость.
                  Читать дальше →
                • Защищенные социальные сети — миф или реальность?

                    В этой статье я хочу рассказать, как я придумал идею web-сервиса защищенных социальных сетей. Как её реализовывал и на каких технологиях. Поделюсь технологическими решениями проблем во время разработки сервиса.

                    image

                    Идея этого проекта у меня появилась после ознакомления с современным положением дел в области шифрования. Я столкнулся в двумя проблемами.

                    С одной стороны, это полная незащищенность пользователей от утечек информации из социальных сетей, мессенджеров и тд. Например Skype или Telegram хранит все переписки у себя на серверах и по требованию правительства предоставляют любые данных из этих переписок. Еще вспоминается, недавний взлом сайта знакомств для супружеских измен Эшли Мэдисон, где уплыли данные пользователей.

                    С другой стороны всем известно, что чем выше уровень защиты, тем менее приятнее пользоваться таким продуктом. Например, что бы подписать и зашифровать емайлы при помощи PGP, требует специальный софт и умение. Используя Telegram, ты обязан устанавливать их мессенджер и светить свою симку и к тому же режим секретного чата, только с одним пользователем, группового режима нет. Также сменив устройство, вы уже не посмотрите, о чем вы чатились ранее в секретом чате.
                    Читать дальше →

                  Самое читаемое