• Как обрабатывать ошибки на JVM быстрее

      Существуют различные способы обработки ошибок в языках программирования:


      • стандартные для многих языков исключения (Java, Scala и прочий JVM, python и многие другие)
      • коды статуса или флаги (Go, bash)
      • различные алгебраические структуры данных, значениями которых могут быть как успешные результаты так и описания ошибок (Scala, haskell и другие функциональные языки)

      Исключения используются очень широко, с другой стороны о них часто говорят, что они медленные. Но и противники функционального подхода часто апеллируют к производительности.


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


      Сразу отбросим использование кодов и флагов, так как этот подход не принят в JVM языках и по моему мнению слишком подвержен ошибкам (прошу прощения за каламбур). Поэтому будем сравнивать исключения и разные виды АТД. Кроме того АТД можно рассматривать как использование кодов ошибок в функциональном стиле.


      UPDATE: к сравнению добавлены исключения без стек-трейсов

      Читать дальше →
    • Приглашаем на Waves Blockchain Hackathon

        Waves Platform — одна из крупнейших в мире блокчейн-платформ, она входит в первую двадцатку блокчейн-компаний мира. В декабре Waves проводит хакатон для разработчиков: приглашаем познакомиться с экосистемой продуктов, командой проекта и присоединиться к блокчейн-сообществу.


        Читать дальше →
      • Читаете ли вы Scaladoc для «очевидных» методов коллекций? Или почему лениться не всегда хорошо

          Если вы не знаете, чем отличаются


          someMap.map{ case (k, v) => k -> foo(v)}

          и


          someMap.mapValues(foo)

          кроме синтаксиса или сомневаетесь/не знаете, к каким плохим последствиям это отличие может привести и причем тут identity, то это статья для вас.


          В противном случае — поучаствуйте в опросе, расположенном в конце статьи.

          Я заинтригован
          • +22
          • 1,5k
          • 6
        • Тестирование белого ящика

            Разработка программ высокого качества подразумевает, что программа и её части подвергаются тестированию. Классическое модульное (unit) тестирование подразумевает разбиение большой программы на маленькие блоки, удобные для тестов. Либо, если разработка тестов происходит параллельно с разработкой кода или тесты разрабатываются до программы (TDD — test driven development), то программа изначально разрабатыватся небольшими блоками, подходящими под требования тестов.


            Одной из разновидностей модульного тестирования можно считать propery-based testing (такой подход реализован, например, в библиотеках QuickCheck, ScalaCheck). Этот подход основан на нахождении универсальных свойств, которые должны быть справедливы для любых входных данных. Например, сериализация с последующей десериализацией должна давать такой же объект. Или, повторная сортировка не должна менять порядок элементов в списке. Для проверки таких универсальных свойств в вышеупомянутых библиотеках поддерживается механизм генерации случайных входных данных. Особенно хорошо такой подход работает для программ, основанных на математических законах, которые служат универсальными свойствами, справедливыми для широкого класса программ. Есть даже библиотека готовых математических свойств — discipline — позволяющая проверить выполнение этих свойств в новых программах (хороший пример повторного использования тестов).


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


            Под катом описаны несколько подходов к тестированию сложных программ с одним входом с разной степенью сложности (вовлеченности) и разной степенью покрытия.

            Читать дальше →
          • ShadowCloud — универсальный облачный клиент

            В настоящее время многие компании предоставляют сервис облачного хранилища, но каждая имеет свой проприетарный клиент и их функционал, как правило, оставляет желать лучшего.
            Существующие альтернативы мне не подошли в силу многих причин, поэтому я решил сделать собственный универсальный клиент — shadowcloud


            Как-то так он выглядит:


            image


            Что умеет


            • Прямая загрузка (без использования локального диска) в Google Drive, Яндекс Диск (WebDAV), Облако Mail.Ru, Dropbox
            • Полное шифрование по умолчанию, большой выбор алгоритмов и настроек
            • Защищённая паролем база данных
            • Чексуммы и дедупликация
            • Убирает ограничение на размер файла
            • Репликация или разбиение файлов по разным хранилищам
            • Стриминг медиа без ограничений
            • Создаёт превью и извлекает метаданные и текст документов
            • Версионирование файлов и всей структуры директорий
            • Markdown заметки, подсветка кода
            • Быстрое сохранение веб-страниц со встроенными ресурсами
            • Кэширование файлов в памяти
            • Использование в виде локального диска с помощью FUSE (требуется winfsp)
            • Открытый исходный код, почти каждый аспект настраивается через shadowcloud.conf
            Читать дальше →
          • Apache Ignite + Apache Spark Data Frames: вместе веселее

              Привет, Хабр! Меня зовут Николай Ижиков, я работаю в компании «Сбербанк Технологии» в команде развития Open Source решений. За плечами 15 лет коммерческой разработки на Java. Я коммитер Apache Ignite и контрибьютор Apache Kafka.

              Под катом вас ожидает видео и текстовая версия моего доклада на Apache Ignite Meetup о том, как использовать Apache Ignite вместе с Apache Spark и какие возможности мы для этого реализовали.


              Читать дальше →
              • +19
              • 2,9k
              • 3
            • Cassandra Sink для Spark Structured Streaming

              Пару месяцев назад я начала изучать Spark, и в какой-то момент столкнулась с проблемой сохранения вычислений Structured Streaming в базе данных Cassandra.

              В данном посте я привожу простой пример создания и использования Cassandra Sink для Spark Structured Streaming. Я надеюсь, что пост будет полезен тем, кто недавно начал работать со Spark Structured Streaming и задается вопросом, как выгружать результаты вычислений в базу данных.

              Идея приложения очень проста — получить и распарсить сообщения из кафки, выполнить простые трансформации в спарке и сохранить результаты в кассандре.
              Читать дальше →
            • Зачем человеку Scala?

              • Перевод
              Здравствуйте, коллеги.

              Не так давно мы допечатали книгу Одерски, Спуна и Веннерса о Scala 2.12. Ведь до Scala 3 еще далеко.


              Автор сегодняшней статьи — Адам Уорски, сооснователь компании «SoftwareMill» и опытный Scala-разработчик. У него получилось интересное резюме сильных сторон современного языка Scala, которое мы и предлагаем вашему вниманию.
              Читать дальше →
            • Akka антипаттерны: слишком много акторов

              image

              По akka мало материалов на Хабре. Решил перевести некоторые антипаттерны, описанные Мануэлем в своем блоге. Они действительно могут быть неочевидны людям впервые столкнувшимся с фреймворком.
              Читать дальше →
              • +11
              • 3,7k
              • 4
            • Chisel — (не совсем) новый подход к разработке цифровой логики


              С развитием микроэлектроники, rtl дизайны становились все больше и больше. Реюзабилити кода на verilog доставляет массу неудобств, даже с использованием generate, макросов и фишек system verilog. Chisel же, дает возможность применить всю мощь объектного и функционального программирования к разработке rtl, что является достаточно долгожданным шагом, который может наполнить свежим воздухом легкие разработчиков ASIC и FPGA.


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

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

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