Обновить
128K+

Java *

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

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

QuisyReader

Время на прочтение1 мин
Охват и читатели31K
Под влиянием "500 слов в минуту без подготовки" решил реализовать программу которая бы работала на большинстве платформ, так и появилось сиё чудо под названием «QuisyReader».

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

Concurrency: 6 способов жить с shared state

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

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

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

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

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

Автоматизация системного интеграционного тестирования

Время на прочтение4 мин
Охват и читатели34K
Привет, Хабравчане!

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

Как же происходит тестирование интеграции? Самый короткий ответ — никак, хотя у нас больше сотни систем, которые взаимодействуют через интеграционную шину Oracle Service Bus(OSB). У этого продукта есть инструмент OSB Console, который позволяет послать тестовый запрос и отображает полученный ответ. После того как разработчик реализует на шине новый сервис, сервис вручную проверяется через OSB Console. Если проверка успешна, то сервис объявляется работающим и меняется, только если на него начинают жаловаться разработчики внешних систем.

Поддержка используемой нами OSB подходила к концу, и возникла необходимость перехода на новую версию. Хотя сама миграция больших проблем не вызывала, встал вопрос, а как проверить работоспособность смигрированного решения? И тут наша команда в очередной раз задумалась о внедрении автоматического тестирования.
Читать дальше →

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

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

Введение


Наконец-то полез детально изучать Java-байткод, и почти сразу же в голове возник интересный вопрос. Есть там инструкция NOP, которая не делает ничего. Так вот, а как это «ничего» сказывается на производительности? Собственно, процесс изучения этого и описан в посте.

Дисклеймер


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

Трансформации AST — Первый шаг к тяжёлым веществам

Время на прочтение7 мин
Охват и читатели21K
А давайте сделаем magic с вашим Java кодом. Вот такой:


Берем это:
import groovy.transform.Canonical
import groovy.transform.TupleConstructor

@Canonical
@TupleConstructor
class Person {
    int id
    String firstName
    String lastName
    Date birthdate
}

Компилируем, и в байткоде получаем аналог вот этого:
Адский бойлерплейт на Джаве на 100 с лишним строк
import java.util.Date;
import java.util.Map;

public class Person {
    private int id;
    private String firstName;
    private String lastName;
    private Date birthdate;

    //Эта штука добавлена @TupleConstructor-ом
    public Person(Map parameters){
        this.id = (int) parameters.get("id");
        this.firstName = (String) parameters.get("firstName");
        this.lastName = (String) parameters.get("lastName");
        this.birthdate = (Date) parameters.get("birthdate");
    }

    public Person(int id, String firstName, String lastName, Date birthdate) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthdate =birthdate;
    }

    public Person(int id, String firstName, String lastName) {
        this(id, firstName, lastName, null);
    }

    public Person(int id, String firstName) {
        this(id, firstName, null, null);
    }

    public Person(int id) {
        this(id, null, null, null);
    }

    public Person() {
        this(0, null, null, null);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (id != person.id) return false;
        if (birthdate != null ? !birthdate.equals(person.birthdate) : person.birthdate != null) return false;
        if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) return false;
        if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
        result = 31 * result + (birthdate != null ? birthdate.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", birthdate=" + birthdate +
                '}';
    }

    public int getId() {
        return this.id;
    }

    public void setId(int paramInt) {
        this.id = paramInt;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String paramString) {
        this.firstName = paramString;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String paramString) {
        this.lastName = paramString;
    }

    public Date getBirthdate() {
        return this.birthdate;
    }

    public void setBirthdate(Date paramDate) {
        this.birthdate = paramDate;
    }
}



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

Так зачем именно Groovy, почему AST transformations?
В этой статье я попробую вкраце обосновать, зачем пользоваться Groovy AST transformations в Java проектах, и (опять-же вкраце) рассказать какие AST transfromations есть в Groovy сегодня. Если вы уже знаете зачем, и хотите только «как и что», смело листайте к «Введение в AST transformations».
Читать почему и как AST transformations

Обновление облачной платформы InfoboxCloud: Jelastic 1.9.3

Время на прочтение5 мин
Охват и читатели6.9K
Совсем скоро произойдет обновление Облачной платформы InfoboxCloud Jelastic до версии 1.9.3. Платформа Jelastic в InfoboxCloud позволяет в 1 клик получать Java, PHP и Ruby окружения, необходимые SQL и NoSQL базы данных, кэш, VDS и не только.

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

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

В этой статье мы рассмотрим, что нам готовит обновление Облачной платформы InfoboxCloud Jelastic.
InfoboxCloud Jelastic
Читать дальше →

Поддержка .NET на базе IntelliJ — реальность?

Время на прочтение2 мин
Охват и читатели22K
Поговорим про поддержку .NET на IntelliJ платформе. После прочтения вы сами решите: реальность ли?
Читать дальше →

Производительность log4j 1.x в синхронном и асинхронном режиме

Время на прочтение7 мин
Охват и читатели8.7K
Доброго времени суток, хабражители!

На данный момент я занимаюсь улучшением производительности большого корпоративного решения. Его специфика позволяет множеству пользователей выполнять схожие действия, а соответственно за кулисами, сервер приложений работает с одним и тем же кодом. И вот в один из моментов длинного пути ускорения приложения, было замечено что в топе самых низкопроизводительных участков верхние места занимает log4j. Первой мыслью было — излишнее логирование, но последующий анализ ее опроверг. Тем более что это крайне важные данные для инженеров поддержки, и если убрать это сейчас — то либо код вернут обратно либо анализ проблем продакшен сервера будет существенно затруднен.

Это и натолкнуло меня на данное исследование — есть ли способ оптимизировать процесс логирования?

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

Осторожно, под катом трафик.
Я готов узнать детали

О кастомизации информационных систем

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


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

EasyEclipse: эклипс с человеческим лицом на Kickstarter

Время на прочтение2 мин
Охват и читатели9.8K
Да, это «улучшенная» платная версия Eclipse для Java. Причем планируется не просто разовый сбор средств на кикстартере, а даже вовсе продажа лицензионной версии в будущем. Этого следовало ожидать, и (IMHO) вот почему:

  • развитие Eclipse как среды для Java разработчиков практически остановилось. Конечно, поддерживаются новые стандарты, все хорошо и быстро работает, но чего-то не хватает. Eclipse Foundation в первую очередь решает задачи крупных компаний, а на удобство пользователей сил не остается;
  • в то же время, Eclipse — мощная платформа, и часть проблем можно решить довольно просто;
  • на примере Intellij Idea можно видеть, что программисты готовы платить за IDE, если с ним удобно работать. Следовательно, можно попробовать такую модель и с Eclipse.

Собственно, EasyEclipse for Java.
Читать дальше →

Применяем Apache POI, docx4j и springframework.jdbc

Время на прочтение7 мин
Охват и читатели21K
Здравствуйте!
Представляю пример простого консольного приложения на Java, которое считывает данные из БД и из файла *.xslx, а затем создает документ *.docx, заполняя при этом поля слияния (mergefield). В нем используются библиотеки Apache POI, docx4j и springframework.jdbc. В примере собрана воедино реализация нескольких часто возникающих в процессе автоматизации задач. Возможно, что он кому-то будет полезен.
Читать дальше →

Подробно о задачах Gradle

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


Перевод второй главы свободно распространяемой книги Building and Testing with Gradle

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

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

Путеводитель по методам класса java.util.concurrent.CompletableFuture

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

Класс содержит несколько десятков методов, в которых легко потеряться. Данная статья классифицирует эти методы по нескольким признакам, чтобы в них было легко ориентироваться.
Читать дальше →

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

F.A.Q. по Java-конференции JPoint 2014

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

Эпиграф


Конференция JPoint — реальный явский хардкор, по локоть в кровище.

Дима Завалишин, http://dz.livejournal.com/878711.html


Что? Где? Когда?


В пятницу, 18 апреля, в Москве пройдёт Java-конференция JPoint для Middle/Senior-разработчиков. В программе — доклады от ведущих специалистов, представляющих компании Oracle, Одноклассники, Deutsche Bank, JetBrains, Devexperts и др.

Подробности

Новый лидер Java EE? WildFly 8 в InfoboxCloud IaaS. Часть 2. Режим домена

Время на прочтение8 мин
Охват и читатели11K
В первой части мы развернули WildFly 8 в Облачный конструктор InfoboxCloud в режиме Standalone. Давайте посмотрим, как можно развернуть WildFly 8 в режиме домена.

Цель: развернуть WildFly 8 в режиме домена с отдельным контроллером домена и двумя хостами, на которых в режиме высокой доступности смогут исполняться по 2 сервера приложений WildFly.

image

Режим домена или автономный режим?


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

Режим домена (Domain mode) позволяет централизовано управлять конфигурациями WildFly. Использование домена удобно для развертывания и поддержки кластеров, состоящих из нод WildFly.

Элементы WildFly в режиме домена:
image
Читать дальше →

Поиск работы Java Middle Developer (наблюдения и впечатления)

Время на прочтение3 мин
Охват и читатели61K
И вот настал момент, когда я твердо решила распрощаться с родной и уютной компанией-интегратором и найти работу поинтереснее. За три недели активного поиска получила массу впечатлений, коими и хотела бы поделиться.

Входные данные

Место действия – Москва. Мидл в заголовке поста — некая условность, в заголовке резюме значилось просто «Java разработчик». Опыта в Java – 1.5 года в пресловутом интеграторе, до этого 4+ года в PHP (думаю, подобная ситуация сейчас не редкость). Поскольку дети и ипотеки у меня отсутствуют, деньги были не решающим фактором – главное, интерес и потенциальное развитие.
Читать дальше →

Компиляция Try/Catch/Finally для JVM

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

Вместо введения


Автор статьи, Alan Keefer1, является главным архитектором компании Guidewire Software2, разрабатывающей программное обеспечение для страхового бизнеса. Еще будучи старшим разработчиком, он участвовал в работе над языком Gosu3. В частности, Алан занимался вопросами компиляции языка в байт-код Java.

Данная статья написана в 2009 году и посвящена деталям реализации try/catch/finally в JVM версии 1.6. Для ее прочтения необходимо иметь базовые знания синтаксиса Java, а также понимать назначение байт-кода, простыни которого лежат под катом. Также в конце статьи приведен ряд примеров, похожих на каверзные задачи SCJP.

Внутренности JVM


Одной из вещей, над которой по целому ряду причин мы сейчас работаем, является компиляция нашего «домашнего» языка в байт-код Java. (Для справки: не могу сказать, когда мы закончим. Даже примерно. Даже попадет ли он в будущие релизы.) Веселье заключается в изучении внутренностей JVM, а также поиске всех долбанутых острых углов собственного языка. Но больше всего «веселья» и острых углов доставляют такие операторы, как try/catch/finally. Поэтому, на этот раз, я не буду вдаваться в философию или аджайл. Вместо этого я углублюсь в JVM, куда большинству не требуется (или не хочется) углубляться.

Если бы две недели назад вы спросили меня о finally-блоках, я бы предположил, что их обработка реализована в JVM: это базовая часть языка, она должна быть встроенной, не так ли? Каково же было мое удивление, когда я узнал: нет, не так. На самом деле finally-блоки просто подставляются во все возможны места после try- или связанных с ним catch-блоков. Эти блоки оборачиваются в «catch(Throwable)», который повторно выбросит исключение после того, как finally-блок закончит работу. Осталось только подкрутить таблицу исключений, чтобы подставленные finally-блоки были пропущены. Ну как? (Небольшой нюанс: до версии JVM 1.6 для оператора finally, по всей видимости, использовались подпограммы вместо полной подстановки. Но сейчас мы говорим о версии 1.6, к которой все вышесказанное применимо.)
Читать дальше →

Вопросы и задания для русскоязычной книги Thinking in Java (Философия Java) Брюса Эккеля

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


На вопрос «С какой книги начать изучение Java?» очень часто отвечают: Thinking in Java Брюса Эккеля.
Но вот беда — эта книга (4-е издание) не содержит в конце каждой из глав вопросы и практикум…

Именно того, что способствует наиболее эффективному изучению языка!

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

Почему бы не поделиться этими заметками-вопросами с Вами?

Приведен список составленных на данный момент вопросов.
Вопросы типа «Что такое внутренний класс?» отсутствуют. Такие определения, на мой взгляд, четко формируются по мере чтения главы и не требуют скучного и банального вопроса для подкрепления.

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

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

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

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

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

Простой способ модификации Android приложения

Время на прочтение3 мин
Охват и читатели58K
Бывает после релиза приложения его исходники куда-то деваются. Правда ведь, такое постоянно случается? И ничего не остается кроме как декомпилировать его и подправить несколько сотен строк кода и все это нужно сделать максимально быстро.

Вот и у меня появилась задача модифицировать приложение имея всего лишь его apk. И те, кто занимался декомпиляцией приложений знают насколько тяжело его потом скомпилировать.
Читать дальше →

WSO2: Настройка прокси к сервису с аутентификацией по логину и паролю

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

Задача


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

Решение


Использовать шину: WSO2 Enterprise Service Bus, на которой настроить прокси-сервис.
Подробности