Обновить
512K+

Java *

Объектно-ориентированный язык программирования

200,49
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

JCoro — асинхронность на сопрограммах в Java

Время на прочтение13 мин
Охват и читатели15K
К исследованиям в этой сфере меня вдохновила статья Асинхронность: назад в будущее. В ней автор описывает идею о том, как, используя сопрограммы, можно упростить асинхронный код так, чтобы выглядел он так же, как обычный синхронный, но сохранял плюшки, которые нам даёт применение асинхронных операций. Вкратце, суть подхода такова: если у нас есть механизм, позволяющий сохранять и восстанавливать контекст выполнения (поддержка сопрограмм), то код на цепочках callback'ов

startReadSocket((data) -> {
   startWriteFile(data, (result) -> {
      if (result == ok) ...
   });
});

мы можем переписать так:

data = readSocket();
result = writeFile(data);
if (result == ok) ...

Здесь readSocket() и writeFile() — сопрограммы, в которых асинхронные операции вызываются следующим образом:

byte[] readSocket() {
    byte[] result = null;
    startReadSocket((data) -> {
	    result = data;
	    resume();
    });
    yield();
    return result;
}

Методы yield() и resume() сохраняют и восстанавливают контекст выполнения, со всеми фреймами и локальными переменными. Происходит следующее: при вызове readSocket() мы планируем асинхронную операцию вызовом startReadSocket() и выполняем yield(). Yield() сохраняет контекст выполнения и поток завершается (возвращается в пул). Когда асинхронная операция будет выполнена, мы вызовем resume() перед выходом из callback'a, и тем самым возобновим выполнение кода. Управление снова получит основная функция, которая вызовет writeFile(). writeFile() устроен аналогично, и всё повторится.

Сделав единожды такое преобразование для всех используемых асинхронных операций и поместив полученные функции в библиотеку, мы получаем инструмент, позволяющий нам писать асинхронный код так, как будто это обычный синхронный код. Мы получаем возможность сочетать плюсы синхронного кода (читабельность, удобная обработка ошибок) и асинхронного (производительность). Плата за это удобство — необходимость как-то сохранять и восстанавливать контекст выполнения. В статье автор описывает реализацию на С++, мне же захотелось заиметь что-то такое в Java. Об этом и пойдёт речь.
Читать дальше →

Быстрая разработка CRUD на Java: дауншифтинг с «1С: Предприятие»

Время на прочтение8 мин
Охват и читатели26K
В связи с последними событиями на мировой арене и понижением курса национальной валюты, для программистов на «1С: Предприятие» наступают непростые времена. Многих увольняют, одновременно усиливается конкуренция со стороны новичков, которых на рынке появилось довольно много — на что не пожалуешься, так как, работая преподавателем в учебном центре при МГТУ им. Баумана, я и сам приложил к этому руку, выдавая свидетельства щедрой рукой.

Вместе с тем, открываются перспективы по освоению других языков, так как работа на зарубежного заказчика внезапно вновь стала выгодной. Также возрос интерес к открытому программному обеспечению на всех уровнях технологического стека, а больше всего, к “импортозамещающим” СУБД типа PostgreSQL, MySQL.

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

Рассказать хочу на примере 2 моих OpenSource проектов, выкладываемых на GitHub:

№1. Реализует базовую функциональность быстрой разработки, доступную в 1С.
№2. Реализует механизм формирования отчетов с пользовательскими настройками типа “сводная таблица”, упрощенный аналог СКД (системы компоновки данных в 1С).

Для начала, по первому проекту.
Читать дальше →

Пагинация списков в Android с RxJava. Часть I

Время на прочтение13 мин
Охват и читатели41K
Часто при разработке клиента мы сталкиваемся с задачей отображения какой-либо информации с сервера, базы данных или еще чего-нибудь в виде списка. И при прокручивании списка данные должны автоматически подгружаться и вставляться в список незаметно для пользователя. У пользователя вообще должно сложиться впечатление, что он скроллит бесконечный список.

В данной статье я бы хотел рассказать вам о том, как сделать автоподгружаемый список простейшим в реализации для разработчика и максимально эффективным и быстрым для пользователя. А также о том, как нам в этом здорово поможет RxJava с ее главной догмой — «Everything is Stream!»
Читать дальше →

Документация разработчика Hibernate – Глава IV. Пакетная обработка

Время на прочтение7 мин
Охват и читатели30K

HikariCP — самый быстрый пул соединений на java

Время на прочтение7 мин
Охват и читатели135K
Java недавно стукнуло 20 лет. Казалось бы, на сегодняшний день на java написано все. Любая идея, любой проект, любой инструмент на java? — это уже есть. Тем более когда речь идет о таких банальных вещах как пул соединений к базе данных, который используют миллионы разработчиков по всему миру. Но не тут то было! Встречайте — проект HikariCP — самый быстрый на сегодняшний день пул соединений на java.

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

Этот пост — вольный и частичный перевод статьи Down the Rabbit Hole от автора HikariCP перемешанный с потоком моего сознания.

image

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

IoT cloud на Netty или 10к рек-сек на ядро

Время на прочтение6 мин
Охват и читатели29K
Всем привет. Этот пост о серверном решении для интернета вещей, который я написал на асинхронных сокетах с использованием всем известной Netty. Я расскажу о задаче, которую мы ставили перед собой, о том почему я выбрал Netty, почему у нее нету альтернатив, какие у нетти недостатки и преимущества и как можно выжать максимум. Сейчас наш сервер в среднем обрабатывает 1.5 млрд сообщений в месяц и нагрузка с каждым месяцем растет на 20%. Для привлечения внимания — нагрузка на один продакшн сервер с 4-мя ядрами Xeon® CPU E5-2630L v2 @ 2.40GHz при лоаде в 500 рек-сек.

Blynk load - для привлечения внимания

Итак, поехали.

Все началось около 2-х лет назад, когда мне подарили arduino. Я всегда мечтал сделать какое-то интересное устройство своими руками. Но все эти паяльники, резисторы, вольты-амперы меня постоянно отпугивали. Так было, пока не появились arduino. С ардуиной я смог наконец-то управлять электроникой. Сказать, что это было очень круто — не сказать ничего. Я был счастлив. Но, как это часто бывает, после освоения базовых навыков в микроконтроллерах, захотелось большего — управлять устройствами через интернет с телефона. Быстрый гуглинг показал (дело было 2 года назад), что на текущий момент нет ни одного решения, которое бы решало эту задачу. Не считая IoT облака с HTTP API, которые было не очень удобно использовать.

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

Модифицируем плеер Vanilla Music под Android

Время на прочтение8 мин
Охват и читатели13K
Порой нам недостает функциональности приложений, которые мы используем каждый день. Имея при этом навыки программирования, хочется сделать что-нибудь свое: продукт, который будет иметь все необходимые функции, которые вам нужны. Так я решил написать свой собственный андроид-плеер, но столкнулся с серьезной трудностью — чтобы сделать более-менее пригодный плеер, требуется катастрофически много времени на программирование, а тем более на отладку. Погуглив немного на тему open-source плееров для андроид, я быстро нашел проект Vanilla Music в Google Play, а затем и на Github. Скачав исходники, я вскоре вскоре принялся его модифицировать под свои нужды.

Я уже давно пытаюсь освоить программирование под Android и пишу приложения под собственные нужды, иногда выкладывая их на Google Play. В этот раз мне захотелось плеер с переключением песен по клавишам громкости. Это конечно неудобно, если необходимо поменять громкость -поэтому вторая версия идеи звучала так: переключение песен клавишами громкости должно происходить только тогда, когда телефон находится в кармане, иначе просто регулировать громкость. Второе, что мне хотелось бы иметь в функционале плеера — возможность сместить время остановки воспроизведения, если устройство активно использовалось. Итак, приступим к практике!
Читать дальше →

Документация разработчика Hibernate – Глава V. Блокировки

Время на прочтение6 мин
Охват и читатели54K

Google Cloud Endpoints на Java: Руководство. ч. 1

Время на прочтение15 мин
Охват и читатели24K
Google Cloud Endpoints — это надстройка над Google App Engine (GAE) для создания API для веб и мобильных приложений, делающая разработку проще и включающую в себя «из коробки» защиту от DoS-атак, OAuth 2.0 аторизацию, веб-интерфейс для тестирования API, SSL, атоматическую масштабируемость (сайт не упадет под хабра-эффектом), а также возможность использования сервисов доступных в Google App Engine (отсылка и прием электронной почты и XMPP-сообщений, загрузка данных из Интернет (URL Fetch service), задачи по расписанию (Task Queues and Scheduled Tasks) и др.)

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

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

Фреймворк Objectify предоставляет удобные стредства для работы со базой данных встроенной в GAE, а модуль angular-google-gapi для подключения веб-приложения на AngularJS c авторизацией пользователей.

Под катом много картинок и текста, и предполагается, что читатель знаком с Java Servlets.
Читать дальше →

«Чтобы стать хорошим системщиком, нужно 5–10 лет опыта» — интервью с Алексеем Шипилёвым из Java Performance Team

Время на прочтение26 мин
Охват и читатели29K
В преддверии Java-конференции Joker 2015, которая начнется уже завтра, я публикую большое интервью с Алексеем Шипилёвым, инженером команды Java Performance Team из Oracle, одним из самых крутых и известных во всем мире специалистов по производительности. Ну и конечно, прекрасным спикером.

С Алексеем мы подробно поговорили:
  • про грядущие изменения в классе String;
  • про то, кто же на самом деле разрабатывает OpenSource;
  • про системных разработчиков и их карьеру;
  • про обмен технологиями, «научную» и «продуктовую» разработку;
  • про сложность низкоуровневых задач;
  • про развитие Java-сообщества и бенчмарк-войны;
  • про mutable vs immutable;
  • про Unsafe;
  • про JMH, бенчмарки и узкую специализацию.


Вот видео нашего разговора. Больше часа длиной, можно слушать в дороге.



Ниже под катом — расшифровка нашей беседы для тех, кто видео не очень.
Читать дальше →

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

Время на прочтение6 мин
Охват и читатели40K
— Мы забрели в зону с сильным магическим индексом-объяснил он, — Когда-то давно здесь образовалось мощное магическое поле.
– Вот именно, — ответил проходящий мимо куст.
Терри Пратчетт, Цвет волшебства


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

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



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

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

Документация разработчика Hibernate – Глава VI. Кэширование

Время на прочтение7 мин
Охват и читатели36K
Представляю вашему вниманию перевод шестой главы официальной документации Hibernate.

Перевод статьи актуален для версии Hibernate 4.2.19.Final

Предыдущая главаДокументация разработчика Hibernate – Глава V. Блокировки

Что собой представляют кэш первого и второго уровня в Hibernate, показано на следующий диаграмме (прим. автора).

image

6.1. Кэш запросов


Если у вас есть запросы, выполняющиеся снова и снова, с одними и теми же параметрами, кэширование запросов предоставит выигрыш в производительности.

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

На что может рассчитывать студент в IT, и какие есть вообще варианты

Время на прочтение6 мин
Охват и читатели45K


В Петербурге зарплаты для Java-junior'а колеблются от 30 до 60К рублей. За пару лет реально дорасти до 80К, за 3-4 года — до 120К. Это докризисные цены, сейчас многие подняли зарплаты еще процентов на 20, сначала те, у кого клиенты зарубежные, а потом и остальные, чтобы оставаться конкурентноспособными.

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

Я уже несколько лет наблюдаю за поведением IT-студентов с большим интересом. Получается, что после университета у них либо есть нужная хорошая практика как старт; либо же они оказываются перед чертовски странным выбором, где даже непонятно, что и из чего выбирать. И по книгам, Гитхабу или другим самостоятельным образом выучиться достаточно быстро не выйдет — очень много времени будет потрачено просто зря. При этом в мире нужны все: дикий кадровый голод на Java-программистов есть по всему миру. Количество программистов в мире растет на 15% в год то есть, удваивается каждые 5 лет, а в России — еще быстрее. У бизнеса огромный спрос на прогеров. Понятно, что ВУЗы просто не успевают подготовить такое количество кадров.

Надо что-то с этим делать. И вот к каким выводам в Java User Group мы пришли по этому поводу относительно студентов.
Читать дальше →

Ближайшие события

Volker Simonis — Внутренности SAP JVM [Встреча JUG в Питере]

Время на прочтение3 мин
Охват и читатели8.4K
Уже в эту среду, 14 октября, в петербургском офисе компании Oracle состоится встреча JUG.ru c Фолькером Симонисом из SAP. Тема встречи — внутреннее устройство SAP JVM.

sap-jvm

Наверняка многие из вас слышали про SAP — немецкого гиганта, который делает разные корпоративные системы — бухучёт, контроль за производством, финансы, HR, кадры, управление складом и прочий «Кровавый энтерпрайз», который с большой вероятностью стоит в вашей организации, если ее численность превышает тысячу человек.

Фокус в том, что многие (если не все) из перечисленных решений так или иначе работают на Java, и соответственно внутри них крутится JVM. Прикол в том, что это их собственная JVM. Ну как собственная — в свое время она была лицензирована у Sun вместе с исходниками, из которых и разрабатывалась. В данный момент — она лицензируется у Oracle. Соответственно, это некоторый форк Oracle JDK / JVM со своими косынкой и секретаршами, лицензированный, совместимый и т.д. и т.п.

Однако это не только форк, но и порт, поддерживающий 7 CPU-архитектур: x86, x86_64, SPARC, PowerPC, Itanium, z/Arch and PA-RISC на семи разных операционках: OS X, Windows, Solaris, Linux, AIX, as400 and HP/UX. По заявлению SAP, они поддерживают единую систему конфигурирования, единое поведение, одинаковые плюшки и расширения, инструменты анализа и поддержи на всей этой аццкой комбинации платформ.



Как видно из этой таблички, они до сих пор поддерживают Java с 1.4 до 8 на всех упомянутых платформах. Например, Oracle поддерживает нынче только Java 8, а Azul и Red Hat, как я понимаю, только 6, 7 и 8.

Так вот, у нас большое счастье. В эту среду на питерском JUG Volker Simonis, наш большой друг и разработчик SAP JVM, будет в стандартном двухчасовом формате рассказывать про все это щастье. Он будет выступать на Joker и планировал прилетать в четверг, но мы специально попросили прилететь его на день раньше, чтобы сделать с ним отдельный JVM-ный ивент.
Подробности и регистрация на встречу

Настройка GPIO в Coremodule 920

Время на прочтение6 мин
Охват и читатели8.4K
Требовалось уметь обращаться к GPIO на Coremodule 920 из под Windows 7 x86. Приложение, которому требовался доступ пишется мной на Java.

Поиск решений


  • Попробовать разобраться самостоятельно
  • Обратиться в техподдержку за помощью

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

Из ответа на мой вопрос следовало, что у них есть драйвер на C и только под Linux, что меня не устраивало.
Читать дальше →

Kotlin ❤ FP

Время на прочтение11 мин
Охват и читатели33K
Предлагаю читателям «Хабрахабра» вольный перевод статьи «Functional programming in Kotlin». Автор публикации — Mike Hearn.

image

Те, кто используют .NET, наверняка слышали про F#, универсальный функциональный язык программирования для CLR. Программисты же вне .NET сообщества скорее всего знают про функциональное программирование в связи с языком Haskell.

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

Язык Kotlin (kotlinlang.org) от JetBrains может показаться всего лишь подслащенной Java: синтаксические конвенции, автовывод типов (type inference) и тому подобные мелочи. Но под незамысловатой оболочкой в нем можно найти все самые популярные и прогрессивные конструкции функциональных языков.
Читать дальше →

Фрактальный кустик от новичка для новичков

Время на прочтение4 мин
Охват и читатели22K
Как я уже упоминал, я начинающий (и самый скромный во Вселенной) программист на Java. Иногда душа просит чего-то такого, вот прям чтоб сначала развернулась, а потом опять свернулась. Красоты хочется. А красоту рисовать мы еще не обучены. Зато обучены рисовать палочки и кружочки.

И с боевым кличем «Красота в простоте!», рисуем из палочек. А что мы можем нарисовать красивое и простое, да чтоб коллеги ахнули в восторге? И тут на помощь приходит красивое слово – Фрактал.

Сначала определение: «Фрактал – это структура из частей… бла-бла-бла… самоподобие… бла-бла-бла… красиво… бла-бла-бла...».



И вооруженные этим исчерпывающим знанием давайте нарисуем фрактальное дерево, а точнее кустик.
Читать дальше →

Диагностируем причину, выживаем в JAR hell: не дышим серой и не варимся в котле

Время на прочтение6 мин
Охват и читатели21K
Бывает что в крупном проекте работающем в jvm, внезапно обнаруживается что приложение не работает и даже не запускается при обновлении какой-либо из зависимостей проекта. Такое же возможно из-за любого другого события, которое изменило порядок следования библиотек в classpath приложения.


Добро пожаловать в JAR hell

Тестирование в Яндексе. Как сделать отказоустойчивый грид из тысячи браузеров

Время на прочтение7 мин
Охват и читатели42K
Любой специалист, причастный к тестированию веб-приложений, знает, что большинство рутинных действий на сервисах умеет делать фреймворк Selenium. В Яндексе в день выполняются миллионы автотестов, использующих Selenium для работы с браузерами, поэтому нам нужны тысячи различных браузеров, доступных одновременно и 24/7. И вот тут начинается самое интересное.



Selenium с большим количеством браузеров имеет много проблем с масштабированием и отказоустойчивостью. После нескольких попыток у нас получилось элегантное и простое в обслуживании решение, и мы хотим поделиться им с вами. Наш проект gridrouter позволяет организовать отказоустойчивый Selenium-грид из любого количества браузеров. Код выложен в open-source и доступен на Github. Под катом я расскажу, на какие недостатки Selenium мы обращали внимание, как пришли к нашему решению, и объясню, как его настроить.
Читать дальше →

Обработка аннотаций в процессе компиляции

Время на прочтение10 мин
Охват и читатели39K
magicМетапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения.

Аннотации, как инструмент метапрограммирования появились вместе с релизом Java 5 в далеком 2004 году. Вместе с ними появился инструментарий Annotation Processing Tool, на смену которому пришла спецификация JSR 269 или Pluggable Annotation Processing API. Что интересно, этой спецификации без малого 10 лет, но свою популярность в Android разработке она начала обретать только сейчас.

О возможностях, которые открывает эта спецификация мы поговорим чуть позже (будет мнооого кода), а сперва, не хотите ли поговорить о компиляции Java кода?
Читать дальше →