Интересные и полезные программы на java

Интересные и полезные программы на java thumbnail

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

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

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

Содержание статьи:

  • Apache Spark
  • Akka
  • Kafka
  • MongoDB, Redis, Cassandra
  • Scala

Apache Spark — большие данные и машинное обучение в одном фреймворке

Apache Spark — это open-source фреймворк для распределенной обработки больших объемов данных. Он поддерживает работу как с SQL, так и с NoSQL базами данных, потоковые данные (работу с Kafka, Akka и т.д.), а также содержит библиотеку для применения машинного обучения. API спарка доступно для Java, Scala, Python и R.

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

Почему стоит попробовать:

  • open-source проект
  • поддержка различных источников данных
  • можно поработать с машинным обучением
  • распределенная обработка больших данных (кстати, при запуске приложения спарк предоставляет простенький UI, где можно посмотреть разделение задачи между “исполнителями” и время работы запросов).

Что может помешать в изучении:

  • мало хороших примеров кода именно на Java
  • чтобы пользоваться всеми “плюшками” спарка придется повозиться с настройками и установкой нужных зависимостей.

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

Моя история

Когда я училась на 3 курсе университета, многие из моих одногруппников стали активно устраиваться на курсы для программистов, чтобы попасть на работу. Кто-то ушел в веб-разработку, кто-то в мобильную, а еще часть — в Data Science и Machine Learning. Я, минуя этап курсов, в это же время устроилась Java-разработчиком и казалось бы машинное обучение было мне интересно, но оно совсем не совпадало с моей работой, времени свободного почти не было, и эта тема была мной благополучно отложена на “когда-нибудь потом, но не сейчас”.

Но вот прошел год, работу я сменила, занятия в универе закончились и времени стало в разы больше. Да и желание изучать новое заметно выросло. Пришло время выбирать тему для диплома на ближайшие пару месяцев, и тут я вспомнила про машинное обучение. С одной стороны — машинное обучение, с другой — Java-разработка. Как говорится, кто гуглит ищет — тот найдет. И я нашла Apache Spark — тут и большие данные, и стриминг, и ML, — все, что душа пожелает.

Самой большой проблемой было то, что почти весь код, который я находила, был написан или на Scala, или на Python. Конечно, аналогичный код было не сложно и самой “натыкать” на джаве, но полноценный проект (везде почему-то был один и тот же маленький примерчик с обработкой текста) я найти не могла. В целом, с документацией и переносом примеров из Python в Java-код, написать свое приложение для решения задачи о пассажирах Титаника у меня получилось. В итоге мне показалось, что спарк хорош, если нужно обработать действительно большие объемы данных, а в рамках машинного обучения хорошо подходит, если для решения достаточно стандартных, хорошо известных моделей (а не какой-то супермногослойной нейронной сети).

От ненависти до любви к многопоточности один шаг — Akka

Akka — это toolkit (инструментарий, наверное, если по-русски, но как-то не звучит) для создания высоконагруженных, распределенных и отказоустойчивых реактивных систем для Java и Scala.

Акка поддерживает несколько моделей параллельного программирования, но в ее основе лежит параллелизм на основе акторов (“вдохновленный” моделью акторов из языка Erlang, который, кстати, если верить Википедии, используется в RabbitMQ, CouchDB и бэкенде для чата Facebook). Концепция очень простая — все есть Актор.

Весь мир — театр, а люди в нем — акторы.
философия Akka

Взаимодействие между акторами построено на сообщениях и каждый актор в ответ на полученное сообщение может одновременно:

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

Все это происходит асинхронно, гарантии порядка сообщений нет. Часто акторную модель сравнивают с электронной почтой. У каждого актора есть “почтовый ящик”, куда приходят сообщения, на которые он потом может ответить отправителю или, например, сделать рассылку. В общем, надеюсь, вы поняли.

Читайте также:  Взаимосвязь рельефа геологическое строение полезных ископаемых таблица

Достаточно большое преимущество акки состоит в том, что вы программируете в обыкновенной однопоточной среде, не задумываясь о race condition, deadlock и прочих “прелестях” многопоточных приложений. Так что, если обычно упоминания многопоточности вселяют в вас чувство неуверенности и древнего ужаса страха, попробуйте написать небольшое приложение на основе акки — вдруг понравится. Смысла использовать акку в маленьких проектах, наверное, особо нет, ведь она предназначена именно для создания высоконагруженных приложений, но мне кажется, что акка — это хороший повод посмотреть на разработку многопоточных приложений под другим углом.

Кратко, почему может быть интересно:

  • хорошая официальная документация с подробными примерами
  • позволяет создавать высоконагруженные распределенные приложения
  • упрощает работу с многопоточностью
  • разные полезные модули — Akka Streaming, Akka Cluster, Akka HTTP, Akka gRPC.

Что может помешать:

  • сложно найти хорошие примеры использования в реальных приложениях.

Моя история

С аккой я познакомилась, когда пошла на курсы по изучению Scala несколько месяцев назад. У нас было несколько занятий об основах акки, об Akka Http и Akka Persistence. Сначала было все очень просто и понятно, потом чуть-чуть непонятно, а потом вообще непонятно.

В домашке надо было реализовать бинарные деревья из акторов: это было не сложно, но очень интересно, потому что бинарные деревья во время университета я реализовывала и на C++, и на C#, и на Java и даже на Haskell, но это всегда было очень однотипно и просто. А тут это выглядело совсем по-другому и сначала было сложно понять, к чему тут вообще эти акторы и как из них вырастить дерево? Так что акка была интересным опытом и, как я поняла, разработчики на Scala часто используют ее в приложениях, хоть на смену и приходят более новые функциональные подходы.

Kafka — превращение в журнал

Apache Kafka — распределенная платформа передачи и обработки потоков данных. Проект стал невероятно популярным во многом благодаря своим неоспоримым преимуществам: легкость настройки, масштабируемость, высокая пропускная способность и надежность.

Kafka запускается как кластер на одном или нескольких серверах. И для того чтобы координировать работу всех своих брокеров в кластере, Kafka использует дополнительный сервис — ZooKeeper.

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

В Spring Boot достаточно удобная поддержка работы с Kafka (Maven-зависимости: stream-kafka, stream-binder-kafka). Вам потребуется только описать конфигурацию в application.yaml, добавить классы-модели сообщений и их обработчики. К тому же, есть еще модуль spring-kafka-test для удобного тестирования приложений с использованием Kafka.

Почему интересно:

  • удобная интеграция с микросервисами и другими системами
  • концепция журнала сообщений и возможность хранить их определенное время
  • масштабируемость

Что может помешать:

  • не очень легко поставить кафку локально (хорошая статья на эту тему)

Моя история

С кафкой я столкнулась во время работы над проектом по разработке микросервисов для мобильного банкинга. Планировалась работа с потоком сообщений из Kafka. Изначально требования к проекту были не готовы и описания сообщений у меня не было. Поэтому было решено “набросать” схему работы, проверить на тестовых сообщениях любого вида и потом просто заменить на новые по готовому описанию.

Для этого я установила ZooKeeper, Kafka и запустила producer-а сообщений. Оставалось только подключить зависимости для SpringBoot в проект и создать consumer для обработки сообщений. Это оказалось достаточно быстро и просто, все отлично работало и, когда требования уже были готовы, поменять под них решение было делом 5 минут.

В целом работать с кафкой уже при реальном запуске было интересно, но как-то обнаружился один очень забавный “баг“. Во время просмотров логов приложения обнаружилось, что одно и то же сообщение почему-то приходит 3 раза. Такое происходило каждый раз. Ребята из поддержки убеждали, что сообщение точно приходит один раз, и мы все ломали голову. В итоге проблема оказалась вот в чем: когда при обработке сообщения выбрасывалось исключение, срабатывал механизм повторной отправки сообщения, а по дефолту количество попыток равно трем. Поправить это можно либо оборачиванием всего метода обработки сообщений в try-catch, чтобы обрабатывать все выбрасываемые исключения, либо настройкой количества попыток в конфигурации приложения.

Say “No” to SQL — MongoDB, Redis, Cassandra

Традиционными реляционными СУБД уже никого не удивить. Наверняка вам приходилось работать с Oracle, MySQL, PostgreSQL или SQL Server. Но в некоторых приложениях гораздо удобнее использовать другой подход — без жесткой структурированной схемы базы данных. В таких случаях говорят о NoSQL.

Описание схемы данных в NoSQL СУБД можно построить на основе различных структур. Соответственно выделяют 4 типа таких систем: ключ-значение, семейство столбцов, документоориентированная и графовая. Давайте посмотрим на популярные СУБД в рамках этих типов.

MongoDBдокументоориентированная СУБД, которая хранит данные в виде JSON-подобных документов с различной структурой. Если точнее, то для хранения в MongoDB применяется формат, который называется BSON, или binary JSON. BSON позволяет работать с данными быстрее: быстрее выполняется поиск и обработка.

Читайте также:  Полезно ли пить сырые яйца детям

Вместо традиционных таблиц в мире SQL в MongoDB используются коллекции. И если в реляционных БД таблицы хранят однотипные жестко структурированные объекты, то в коллекции могут содержать самые разные объекты, имеющие различную структуру и набор свойств.

Из интересного:

  • полезные инструменты — визуализация данных (MongoDB Charts), GUI для работы и запросов (MongoDB Compass)
  • есть официальные драйверы для многих языков программирования
  • удобный язык запросов
  • кроссплатформенность

Redis — это хранилище данных с открытым исходным кодом для структур данных вида «ключ-значение». Используется как для баз данных, так и для реализации кэшей, брокеров сообщений. Хранит базу данных в оперативной памяти, что позволяет достигать высокой скорости обработки.

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

Cassandra — распределённая NoSQL СУБД, рассчитанная на создание высокомасштабируемых и надёжных хранилищ огромных массивов данных, представленных в виде хэша. Использует модель хранения данных на базе семейства столбцов, что позволяет организовать хранение хэшей с несколькими уровнями вложенности. Cassandra используется для сервисов Apple, GitHub, Netflix, Reddit.

Преимуществом Cassandra является отказоустойчивость. Данные автоматически реплицируются на несколько узлов для ее обеспечения, при этом неисправные узлы можно заменить без простоев.

Интересное в NoSQL системах:

  • подход, отличный от традиционных реляционных СУБД
  • другие языки или способы построения запросов (например, CQL — язык запросов для Cassandra)
  • различные способы хранения данных

Я не работала с такими системами, поэтому информация выше не очень подробная. Но мне давно интересна эта тема, поэтому решила упомянуть ее в списке.

F[u]n with Scala

Scala — мультипарадигменный язык программирования, сочетающий возможности объектно-ориентированного и функционального программирования. Основной “фишкой” этого языка является типобезопасность и возможность обнаруживать большое количество ошибок на этапе компиляции.

Еще одной удобной особенностью является наличие REPL (Read Evaluate Print and Loop), что позволяет быстро запускать и проверять выражения или кусочки кода. Скалисты очень любят говорить о том, что они побороли главную проблему Java-программ — обработку null и соответственно отсутствие непредвиденных NPE.

Плюс функционального программирования в том, что в нем все по-другому (не так, как в ООП). Вам придется поломать голову даже чтобы написать простой цикл или сделать динамическую конкатенацию строк. Разработка на скале постоянно подталкивает вас к улучшению своего кода и стремлению сделать его более лаконичным и безопасным.

Интересное:

  • принципы функционального программирования
  • совместимость с Java
  • во многих случаях конструкции проще, чем в Java
  • язык набирает популярность и многие разработчики переходят с Java на Scala
  • хорошее коммьюнити

Из минусов:

  • Intellij Idea все еще не идеально работает с Scala, часто возникают проблемы с import и implicit
  • иногда не хватает хорошей документации и примеров (для библиотек)
  • достаточно сложен для понимания

Моя история

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

Чуть позже подвернулась возможность пойти на курсы по изучению Scala, которые я успешно закончила, реализовала свой небольшой проект и устроилась в эту же компанию в качестве Junior Scala Engineer (это произошло совсем недавно, кстати).

Впечатления от Scala у меня в целом положительные, идеи и подходы показались мне достаточно полезными и здравыми. Я думаю, знакомство с базовыми принципами этого языка программирования в любом случае будет полезно для Java-разработчика.

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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Источник



8 самых известных продуктов на Java -3

Разработка мобильных приложений, Софт, Читальный зал, Геоинформационные сервисы

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

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

Но сначала немного о самом языке

Большинству постоянных читателей хабра наверняка все и так известно, но я на всякий случай повторюсь.

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

Создатели реализовали принцип WORA: write once, run anywhere или «пиши один раз, запускай везде». Написанное на Java приложение можно запустить практически на любой платформе, что является большим преимуществом.

Теперь можно перейти к самим продуктам

NASA World Wind

NASA World Wind относится к типу геоинформационных систем. Это полностью трехмерный интерактивный виртуальный глобус, который использует спутниковые снимки NASA и аэрофотосъемку Геологической службы США для построения трёхмерных моделей Земли, Луны, Марса, Венеры и Юпитера.

Читайте также:  Чем полезны бактерии гниения для человека

NASA World Wind имеет статус проприетарного ПО с открытым исходным кодом. Программа написана на Java, и работает под управлением всех операционных систем, для которых реализован OpenGL-стек.

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

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

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

Вот как это выглядит

Google и Android OS

Компания Google использует Java для многих своих продуктов. В основном для программирования сервера и разработки пользовательского интерфейса.

Например, для Google Docs — приложение для работы с документами, которое очень похоже на Microsoft Word. Только все изменения в нем сохраняются автоматически, и если вы авторизованы в Google на своих устройствах, вы всегда и везде можете открыть и поработать с документом без необходимости его скачивать.

И конечно, здесь мы никак не можем пройти мимо операционной системы Android — ведь она берет свое начало именно от виртуальной машины Java (JVM). Поэтому на этом языке можно разрабатывать и мобильные приложения.

Кстати, по поводу использования Java в Android у компании Oracle, владеющей Java, когда-то случился серьезный конфликт с компанией Google. Подробнее об этом можно почитать здесь.

Не смотря на популярность Java, многие Android разработчики уже активно переходят на Kotlin — еще один язык программирования (правда не от Google, а от JetBrains), работающий поверх JVM и имеющий ряд преимуществ именно для мобильной разработки — он гораздо более лаконичный и менее ресурсоемкий.

Netflix

Эта компания и ее платформа не нуждаются в длинном представлении. Netflix — одна из крупнейших американских компаний в индустрии развлечений — является поставщиком фильмов и сериалов на основе потокового мультимедиа.

Компания использует Java для серверной части большинства своих приложений, наряду с Python. Аndroid и Android TV приложения практически полностью построены на Java, с небольшой примесью C++.

Spotify

Spotify — один из популярнейших в мире интернет-сервисов потокового аудио, позволяющий легально и бесплатно прослушивать более 50 миллионов музыкальных композиций, аудиокниг и подкастов. Доступен в виде веб-приложения, десктопных приложений, приложений для смартфонов и множества других смарт-устройств, а также для медиа-систем автомобилей.

В основном, Spotify использует Java и Python для реализации некоторого функционала своего веб приложения, например для логирования и стабилизации передачи данных.

Ну и конечно же, Java является основной технологией для приложения Spotify на Android OS.

LinkedIn

На сегодняшний день LinkedIn является одной из крупнейших социальных сетей для поиска и установления деловых контактов. В LinkedIn зарегистрировано около 600 млн. пользователей, представляющих 150+ отраслей бизнеса из 200 стран.

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

Официальное мобильное приложение LinkedIn для Android OS также разработано на Java.

Uber

Для приложения Uber, Java — одна из важнейших технологий на ряду с Python, Node.js и Go. Согласно заявлению разработчиков, они выбрали Java именно по причине высокой производительности, что является одной из главных характеристик этого языка. Также Java обладает преимуществами экосистемы с открытым исходным кодом и интегрируется с внешними технологиями, такими как Hadoop и другими аналитическими инструментами.

Ну и конечно же, как и в большинстве случаев представленных ранее, Uber использовали Java как основной язык при разработке своего мобильного приложения для операционной системы Android.

Amazon

Кроме электронной торговли, главные направления компании включают разработку и поставку облачных и стриминговых решений, а также активно занимаются направлением искусственного интеллекта. Amazon признан одной из крупнейших технологических компаний в мире наряду с Google, Apple и Facebook.

Главным образом, Amazon используют Java для разработки своих веб сервисов (AWS). Они также предпочитают писать на Java сценарии автоматизации, так как они хорошо поддерживаются, имеют много внутренних инструментов/сред, которые помогают писать вспомогательные инструменты.

Minecraft

Да, эта всемирно известная компьютерная инди-игра в жанре песочницы тоже написана на Java. По словам разработчиков “пусковая установка Minecraft поставляется с Java версии 1.8.0_51, которая используется по умолчанию”. Однако они рекомендуют обновиться, чтобы увеличить производительность.

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

Заключение

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

Я специально подбирал абсолютно разные примеры, чтобы было интереснее. Если у вас есть еще больше интересных примеров использования Java в известных продуктах, пишите в комментариях. С удовольствием почитаю.

Источник