TechCave

Описание сайта

Основная информация

Java — строго типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, с помощью виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года.

Рейтинг: 1
Создана 4 года назад
Владелец root

Стена группы

Загрузка...
2 года назад
#

Performance это праздник


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


https://xkcd.com/1781/


Подробнее
2 года назад
#

Maven. Собираем только измененное


Работая в многомодульном maven проекте, зачастую приходится вносить изменения в несколько связанных модулей одновременно. И если хочется собрать только задетые модули, то к сожалению maven не предоставляет ничего автоматического. Если чуть погуглить, то на stackoverflow можно найти простое однострочное решение:

mvn install -amd -pl $(svn st | colrm 1 8 | sed 's /.*  ' | xargs echo | sed 's- -,:-g' | sed 's ^ : ')

На этом можно было бы и закончить. Но мне хотелось большего — чего конкретнее и как я этого добивался под катом.

Для тех, кто плохо знаком с bash, mvn или svn, небольшое пояснение скрипта:
  • Основная часть — mvn install -amd -pl project_list. Команда для мейвена, собрать проекты из списка project_list и их зависимые

  • Всё, что внутри $(...) — получение локальных изменений в svn и вытаскивание названия проектов из этих изменений


Подробнее
2 года назад
#

Безопасный Builder на Scala и Java


Статья о реализации паттерна Builder с проверкой на уровне компиляции, реализованного с помощью параметрического полиморфизма. В ней мы поговорим о том, что такое полиморфизм, каким он бывает. Как устроена магия «оператора» =:= в scala, можно ли повторить ее в java и как используя эти знания реализовать Builder, не допускающий неполной инициализации создаваемого объекта.

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

Паттерн builder решает две задачи: во-первых разделяет алгоритм создания(инициализации) объекта от деталей его(объекта) реализации, во-вторых упрощает сам процесс создания:

UrlBuilder()
    .withSchema("http")
    .withHost("localhost")
    .withFile("/")
    .build()

Остается вопрос: как реализовать builder так, чтобы он не допускал не полной инициализации объекта?

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

Подробнее
2 года назад
#

Итак, мы сделали дамп JVM на 150 Гб. Что дальше?


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

Мусор

В моей практике анализ дампов JVM не раз помогал найти причины сложных проблем.

Однако дампы бывают разные. В этот раз передо мной — дамп размером 150 Гб. Моя задача — анализ проблемы, выявленной в процессе, который стал источником этого дампа.

Приложение, в котором я ищу проблему — это гибрид СУБД и системы непрерывной обработки данных. Все данные хранятся в памяти в виде Java объектов, поэтому размер «кучи» может достигать внушительных размеров (личный рекорд — 400 Гб).

Обычно для работы с небольшими дампами я использую JVisualVM. Но полагаю, что дамп такого размера не по зубам ни JVisualVM, ни Eclipse Memory Analyzer, ни другим профайлерам (хотя пробовать я не стал). Даже копирование файла такого объёма с сервера на локальный диск уже представляет проблему.

При анализе дампов в JVisualVM я часто прибегал к возможности использовать JavaScript для программного анализа графа объектов. Графические инструменты хороши, но пролистывать миллионы объектов — не самое приятное занятие. Гораздо приятнее исследовать граф объектов при помощи кода, а не мыши.

Дамп JVM — это всего лишь сериализованный граф объектов; моя задача — извлечь из этого графа конкретную информацию. Мне не очень нужен красивый пользовательский интерфейс: API для работы с графом объектов программным путём — вот инструмент, который на самом деле мне нужен.

Как программно проанализировать дамп «кучи»?

Подробнее
2 года назад
#

Простая реализация Stream из Java 8 в С++


Всем привет! В статье будет представлена упрощенная реализацию Stream из Java 8 на С++. Скажу сразу, что:

  • в отличии от Java не используются отложенные вычисления;

  • нет параллельных версий;

  • местами совмещает Stream и Collectors;

  • используются простые и готовые решения от STL, здесь нету чистого ФП, где только рекурсия;

  • не используются техники оптимизации.


В этой версии основной упор сделан на то, чтобы быстро и просто сделать велосипед). Про ФП упомянуто по-минимуму (комбинаторам внимание не уделено :)).

Интерфейс
template <typename Type>
class Stream : private StreamImpl<Type>
{
private:
    typedef StreamImpl<Type> Parent;
public:
    using Parent::Parent; // конструкторы унаследованы
    using Parent::data;
    using Parent::isEmpty;
    using Parent::count;
    using Parent::flatMap;
    using Parent::map;
    using Parent::reduce;
    using Parent::filter;
    using Parent::allMatch;
    using Parent::noneMatch;
    using Parent::groupingBy;
    using Parent::partitionBy;
    using Parent::minElement;
    using Parent::maxElement;
    ~Stream() = default;
};


Сюда же можно добавить простые статические проверки типа:

static_assert( std::is_copy_assignable<Type>::value,
                   "Type is not copy assignable");
    static_assert( std::is_default_constructible<Type>::value,
                   "Type is not default constructible");
    static_assert( std::is_copy_constructible<Type>::value,
                   "Type is not");
    static_assert(!std::is_volatile<Type>::value,
                  "volatile data can't be used in Stream");
    static_assert(!std::is_same<Type, std::nullptr_t>::value,
                   "Stream can't used with nullptr");


Собственно осталось рассмотреть, что из себя представляет StreamImpl.

Подробнее
2 года назад
#

Spring Boot + Spring Data JPA + Bootstrap


2 года назад
#
Правильный полиморфный билдер на Java

О чем все это?

При реализации chained builder на Java все прекрасно, пока не понадобится добавить наследование. Сразу же возникают две проблемы — как сделать, чтобы методы родительского билдера возвращали объект дочернего билдера и как передавать дочерний билдер в функции, принимающие родительский. Предлагается реализация паттерна, которая позволяет решить обе проблемы. Исходники можно посмотреть здесь на гитхабе.

Upd. Реальная проблема

В приложении есть dto-объекты для отображения результата, которые строятся следующим образом:

1) Создается билдер нужного dto-объекта.
2) Билдер передается в различные классы по цепочке, каждый класс использует билдер для установки нужных ему полей.

В один прекрасный день решили ввести новую версию API, dto-объект был расширен с помощью наследования и тут оказалось, что его билдер не получается засунуть в существующую цепочку классов для достройки.

Постановка задачи

Тут должно быть 100500 слов о важности паттерна билдер, дабы не утомлять читателя этой лабудой, сразу перейдем к делу. Пусть есть 3 класса с понятными именами Gen1, Gen2 и Gen3. Они образуют линейную иерархию Gen3 → Gen2 → Gen1. Каждый их них содержит ровно один очень важный метод с именем setValX (где X цифра из имени класса). Мы хотим получить билдеры Builder1, Builder2, Builder3 каждый из которых содержит соответствующий метод valX, который реализуется только у одного класса (не хотим копипастить).

Так же должны работать цепочки:

Gen1 gen1 = builder1.val1("val1").build();
Gen2 gen2 = builder2.val1("val1").val2("val2").build();
Gen3 gen3 = builder3.val1("val1").val2("val2").val3("val3").build();

И возможность использовать дочерние билдеры вместо родительских:

Gen1 someFunction(Builder1 builder1) {
    return builder1.val1("val1111");
}
...
someFunction1(builder3.val2("val222").val3("val333"));

Подробнее
Den
2 года назад
#
Лекции Технотрека. 1 семестр. Разработка на Java (весна 2016)

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

Курс ведут Рустам Кильдиев, Java/Scala-разработчик мобильного ПО, и Дмитрий Архангельский, инженер-разработчик в Одноклассниках.

Лекция 1. «Знакомство с платформой Java»



Подробнее
2 года назад
#
Как с помощью maven подключить библиотеку к проекту

Спросите кого-нибудь, для чего вообще нужен Maven — 90 процентов поголовья программистов ответит, что именно для этого и будут во многом правы.

Если в случае с, например, C++ подключение библиотеки к своему проекту — это серьёзный шаг, который гарантированно усложнит сборку до такой степени, что придётся включить инструкции по подключению данной конкретной библиотеки в readme, то в случае с Java это делается легко и непринуждённо — не в последнюю очедь благодаря Maven.

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

Начнём издалека.

Как добавить в проект новый класс

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

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

Предлагаю присутствущим потратить минуту-другую на выражение благодарности капитану Очевидность, а после продолжить чтение.

Как добавить в проект класс, написанный кем-то другим

Ответ, вообще говоря, очевиден — надо скопировать этот класс в свой код.

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

Классы, используемые каким-то другим классом, кстати, принято называть зависимостями (dependencies), этого класса.

У такого подхода есть очевидный минус. Для каждого класса надо выискивать зависимости, а потом руками копировать их к себе. Если позже во всей этой куче кода найдётся какой-нибудь баг, то после появления фикса придётся повторить процесс заново.

Подробнее
Den
2 года назад
#
Принуждение к асинхронности в Java сервисах для Baratine

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

  • Асинхронные сервис интерфейсы

  • Выполнение вызовов сервиса в едином потоке

  • Неразделённое владение данными

  • Асинхронный Web

  • Асинхронная платформа исполнения сервисов


Асинхронные сервис интерфейсы

Микро-сервисы в Baratine описываются интерфейсами. Интерфейс определяет операции предоставляемые сервисом. Особенностью асинхронного интерфейса является то, что методы интерфейса возвращают результат асинхронно, подобно объекту Future.

Например привычный интерфейс для операции оплаты кредитной картой может выглядеть следующим образом:

public interface CreditService {
    PaymentStatus pay(int amount, CreditCard card); 
}

Подробнее
2 года назад
#
Кратко о Java MemoryModel для тех у кого мало времени, но захотелось разобраться

Данная статья в некотором роды выжимка того, что Вы могли бы узнать просмотрев разные видео ролики господина Шипилева, Елизарова, Смирнова. Собственно мы даже собрали для Вас плейлист если Вы захотите пойти «the hard way». В статье я лишь попробую Вам передать некоторые основные мысли/идеи, которые при желании Вы сможете намного более глубоко изучить в первоисточниках.

Итак, давайте теперь перейдем к собственно сабжу. Еще лет пять назад можно было не сильно «парясь» выдавать на-гора однопоточные программы, которые с трудом запускались на топовом железе и знать, что через год-два этот кусочек “программки” (простите за аллегорию) начнет работать нормально. Сегодня подобный «бесплатный обед» закончился.

Рост производительности процессоров

Подробнее
2 года назад
#
Несколько примеров практического использования RxJava

RxJava — это реализация ReactiveX для Java — библиотеки для асинхронной обработки потоков данных. Паттерн observable на стероидах, как они сами пишут. В интернете, в том числе на Хабре, есть много «введений в RxJava». Я хочу привести несколько примеров реальных задач. Они не очень сложные, но возможно кто-то увидит какие-то сходства со своими и задумается.

Собственно, задачи:

1. Простое клиентское TCP-соединение. Есть протокол поверх TCP/IP, нужно сформировать сообщение, подключиться к удаленному узлу, если еще не подключился, передать сообщение и прочитать ответ. Плюс обработка ошибок, проверка таймаутов, повтор отправки в случае неудачи. Жестких требований к производительности нет, трафик не большой.

2. Есть двигатель и некоторый датчик. Нужно произвести сканирование — пройтись двигателем по заданной траектории: послать двигатель к точке, дождаться, когда он к ней приедет, снять показания датчика, отобразить точку на графике (в GUI потоке), поехать к следующей точке…

3. Полученные после сканирования данные нужно обработать (условно длительный вычислительный процесс) и засунуть в pdf-отчет (условно длительный процесс ввода-вывода) вместе с изображением графика и данными введенными пользователем (GUI поток).

1. Простое клиентское TCP-соединение

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

public String send(String command) {
        try {
            if (!isConnected()) {
                connect();
            }
            byte[] bytes = command.getBytes();
            bytes = addHeader(bytes);
            sendBytes(bytes);
            return readAnswer();
        } catch (IOException e) {
            // паника
        }
    }


Подробнее
2 года назад
#
Примеры использования различных Google API на Java

Ссылка на Github (google/google-api-java-client-samples)
2 года назад
#
3 примера как разобрать HTML-файл в Java используя Jsoup

HTML это ядро WEB, все интернет-страницы которые Вы видите, являются ли они динамически сгенерированы средствами JavaScript, JSP, PHP, ASP или другими веб-технологиями, основаны на HTML. На самом деле, Ваш браузер разбирает HTML и отображает его в удобном для Вас виде. Но что делать если Вам нужно разобрать HTML-документ и найти в нем некоторый элемент, тэг, атрибут или проверить существует или нет конкретный элемент при помощи программы на Java.

Если бы Вы были Java программистом уже несколько лет, я уверен, Вы бы сделали XML разбор используя парсеры вроде DOM или SAX. Но, по иронии судьбы, бывают случаи, когда Вам необходимо разобрать HTML-документ из базового Java приложения, которое не содержит Servlet и другие Java веб-технологии. Более того, Core JDK также не содержит HTTP или HTML библиотек. Вот почему, когда дело доходит до разбора HTML файла, многие Java программисты спрашивают у Google, как получить значение HTML-тэга в Java.

Когда я столкнулся с этим, я был уверен что решением будет open-source библиотека, осуществляющая нужную мне функциональность, но я не знал, что она будет такой замечательной и многофункциональной как Jsoup. Она не только обеспечивает поддержку чтения и разбора HTML файлов, атрибутов, CSS классов в стиле JQuery, но и в то же время, позволяет модифицировать их. Используя Jsoup Вы можете сделать с HTML документом все что угодно.

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

Что такое Jsoup.

Jsoup это open-source Java библиотека для работы с реальным HTML. Она обеспечивает очень удобный API для извлечения и манипулирования данными, используя лучшие DOM, CSS, и JQuery-подобные методы. Jsoup реализует WHATWG HTML5 спецификацию, и разбирает HTML в ту же модель DOM, как это делают современные браузер вроде Chrome и Firefox.
Вот некоторые из полезных функций Jsoup библиотеки:
  • Jsoup может очистить и разобрать HTML из URL, файла или строки.

  • Jsoup может найти и извлечь данные используя обход DOM или CSS селекторы.

  • Jsoup позволяет манипулировать HTML элементами, атрибутами и текстом.

  • Jsoup обеспечивает очистку предоставленной пользователем информации по white-list, для предотвращения XSS атак.

  • Также Jsoup выдает «аккуратный» HTML.


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

Подрробнее
Den
2 года назад
#
Запускаем Node.js на JVM

Прошли те дни, когда целые компании зависели от одного поставщика технологий. Даже маленькие фирмы и любители найдут оптимальное для себя решение, объединяя технологии в одном проекте. Долгое время Java держала первенство среди серверных технологий. Но сегодня Node.js повсюду.

Java server nodejs

Но даже с ростом популярности Node.js и JavaScript, Java не теряет силу. Кроме того, немногие организации могут позволить себе перенести всю платформу с JVM на Node.js. Это значит, что компания должна либо продолжать использовать текущий стек технологий, либо запускать несколько стеков, которые будут общаться через сетевое API. Однако есть и другой способ: запустить Node.js прямо в процессе JVM. И J2V8, наконец, сделала это возможным.

Подробнее
17 18 20

Авторизация

Войти с помощью

Пользователи

GeekBrains

КАРКАМ

Нетология