Oleg Atamanenko

thoughts about programming

Category: development

Deploying in Kubernetes. Checklist.

While kubernetes is easy to start with, it is quite challenging to master and know all details. In this post I will provide checklist of important manifest stanzas that are applicable to most applications that are targeted to run in production and which are expected to not have downtime during cluster maintenance and/or application updates.

Continue Reading…

Docker Best Practices

Introduction

After using docker for last several years I’d like to share best practices that works in production.

Continue Reading…

How to add YAML support to go-restful

go-restful is a go package used for building REST-style web services. It is potent, but it supports JSON and XML out of the box only. Fortunately, go-restful allows registering custom serialization schemes.

Continue Reading…

Using Unitils ReflectionAssert

Often it is needed to compare two different instances of the class inside test. I.e. we save object into database, then fetch it back from db and we want to be sure if nothing was lost during saving/reading.

Continue Reading…

Using AssertJ

AssertJ is a library which provides fluent strongly-typed assertions to use in unit tests. Example of assertions written with AssertJ: import io.github.uthark.blog.assertj.Assertions.assertThat; // ... within @Test User result = userDao.findByLogin("username"); assertThat(result).

Continue Reading…

Initializing Mockito @Mocks with JUnit @Rule

In this post I will show how one can implement custom JUnit @Rule. As an example let’s take Mockito and implement custom rule which will initialize Mocks in test class.

Continue Reading…

Life fee

Found in sources: try { // do some business logic. } catch (Exception e) { errorBean.addError("System exception. Unable to locate life fee."); } This is just awesome!

Continue Reading…

Limiting threads count for GreenRobot EventBus

In one of my projects I used EventBus library. The library is pretty cool and I would recommend everybody to use it. But I found one small issue with this library - in case you send too many events very fast (i.

Continue Reading…

Using custom font in Android TextView

Today I want to share with you custom TextView which allows to set font to be used in xml layout. First, we need to declare our custom styleable attrs.xml: <?xml version="1.

Continue Reading…

Solving issue with DB2 on VMWare Fusion on MacBook Pro 2013 Late

Today I found issue running DB2 10.1 under VMWare Fusion 6.0.2 on my MacBook - all management services for db2 are starting except for the db2 instance itself. When I tried to start DB2 using db2start it just crashed without any additional information.

Continue Reading…

Using iTerm triggers

I want to share one of the cool features which iTerm.app has - triggers. The idea behind triggers is simple - it allows to perform arbitrary action based on the output in console window.

Continue Reading…

Fixing unescaped quotes in page rendering in Octopress

When I created About Me page I found issue with rendering: for some reason styles and some javascripts were missing on the page. Investigation showed that content in meta tag description contained unquoted quotes, thus resulting in broken HTML.

Continue Reading…

Automatic query modification with Spring Data Mongo

Introduction Today I want to show how one can automatically apply additional restrictions on MongoDB Queries with MongoTemplate or Spring Data Mongo. Implementation First, let’s introduce interface QueryModifier. import org.springframework.data.mongodb.core.query.Query; public interface QueryModifier { /** * Modifies source query according to the rules.

Continue Reading…

Пишем @Enable*-аннотацию для Spring

Начиная с версии 3.1 Spring поддерживает декларативное включение необходимой функциональности через, так называемые, @Enable* аннотации. Пример таких аннотаций: org.springframework.web.servlet.config.annotation.EnableWebMvc, org.springframework.cache.annotation.EnableCaching, org.springframework.scheduling.annotation.EnableAsync и другие. В продолжение темы прошлого поста, я хочу показать, как можно добавить собственную @Enable аннотацию.

Continue Reading…

JAX-RS Client API

JAX-RS - набор Java API для работы с REST сервисами. Существует несколько реализаций, о которых я уже писал раньше. Предположим, что проект А выставляет наружу REST API, который мы хотим использовать в проекте Б.

Continue Reading…

@Autowired JAX-RS Client API

Продолжая разговор о JAX RS Client API - предположим, что мы уже используем JAX-RS клиент У нас есть класс, который умеет создавать прокси для любого REST-интерфейса в проекте. Теперь мы хотим сделать так, чтобы эти интерфейсы можно было автоматически создавать в контексте Spring и связывать с другими бинами.

Continue Reading…

Пишем валидатор для Bean Validation API

JSR-303 предоставляет удобный API для проверки валидности объектов, а также входных параметров. Очевидно, что стандартных валидаторов в какой-то момент может быть недостаточно, поэтому необходимо писать собственный. Хочу показать на примере валидации запроса к MongoDB, как легко это делается.

Continue Reading…

Использование memcached в качестве backend для Spring Caching Abstraction

В Spring 3.1 появился замечательный модуль - Spring Cache, который является абстракцией над кэшированием, что позволяет декларативно реализовывать кэширование в приложении. Я не буду вдаваться в подробности работы, их можно прочитать в документации, но опишу, каким образом можно настроить memcached в качестве бэкэнда для работы.

Continue Reading…

Валидация входных параметров с использованием Spring

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

Continue Reading…

@Autowiring EJBs with Spring

Предположим, что у нас есть проект на Spring, в котором необходимо использовать внешние EJB. Для получения бинов необходимо создавать InitialContext и делать lookup() нужных ejb. Но эту задачу можно автоматизировать и пользоваться @Autowired, то есть код будет выглядеть вот так:

Continue Reading…

Автоматизируем работу с виртуальными машинами с помощью Vagrant

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

Continue Reading…

Собственная реализация методов в Spring Data JPA

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

Continue Reading…

Ищем с помощью Spring Data JPA

Рассмотрим подробнее одну из наиболее полезных вещей в Spring Data JPA - генерация JPQL-запросов на основе имени метода. Spring Data JPA умеет автоматически генерировать запросы используя для подсказки название метода.

Continue Reading…

Использование BeanPostProcessor на примере журналирования

Сегодня я хочу рассказать, как можно сделать инициализацию логгера в классе с использованием аннотаций и BeanPostProcessor Очень часто мы инициализируем логгер следующим образом: public class MyClass { private static final Logger LOG = LoggerFactory.

Continue Reading…

Преобразуем строку в дату

Казалось бы, есть простейшая задача - преобразовать строковое представление даты в объект класса java.util.Date. Как оказалось, иногда использование DateFormat не помогает. В случае, если строка - это заголовок Date из письма, то нам нужно использовать javax.

Continue Reading…

Упрощаем работу с JPA при помощи Spring Data JPA

Введение Уже прошло несколько лет с тех пор, как появился JPA. Работа с EntityManager увлекательна, но разработчики пишут красивый API, а подробности работы с базой данных скрывают. При этом частая проблема - дублирование имплементации, когда из одного DAO в другой у нас плавно перекочёвывает один и тот же код, в лучшем случае этот код переносится в абстрактный базовый DAO.

Continue Reading…

Разработка и тестирование Java REST веб-сервисов

Введение Для разработки REST веб-сервисов Java предлагает JSR-311 - JAX-RS: The Java™ API for RESTful Web Services Как это обычно бывает в мире Enterprise Java, существует несколько реализаций данной спецификации: Jersey - это эталонная реализация спецификации от компании Sun Oracle Apache CXF JBoss RESTEasy На примере последней реализации, я и расскажу, каким образом можно написать REST-сервис.

Continue Reading…

Немножко магии от AspectJ

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

Continue Reading…

Немного о виртуальных методах в Java

Сегодня я хочу рассмотреть некоторые особенности переопределения методов в Java. В java нельзя переопределить: поля класса конструкторы, инициализаторы класса статические методы статические поля Подробнее об этом можно прочитать в Java Language Specification, §8.

Continue Reading…

Сокращаем ссылки на андроиде

ВступлениеВстала передо мной задача - сокращать ссылки перед тем, как отправлять их в Twitter. Для решения этой задачи я решил использовать bit.ly, благо, их API внятный и простой. Программируем!Решение нарисовалось в виде следующего класса: import org.

Continue Reading…

Удаление различных диакритических символов из строки

Возникла проблема - каким образом заменить в строке символы из национальных кодировок на соответствующие им из латиницы. Например, из строки explicación получить explicacion. package com.blogspot.atamanenko; import java.text.Normalizer; import java.text.Normalizer.Form; public class StringNormalizer { public static String normalize(String string) { return Normalizer.

Continue Reading…

Создание больших объёмов тестовых данных с помощью Databene Benerator

Периодически необходимо решать задачу создания больших ( и не очень) объёмов тестовых данных для проведения различных видов тестирования - функционального, нагрузочного (тестирование стабильности и производительности). При этом часто получается так, что система на тестовых данных ведёт себя совсем иначе, чем на реальных данных.

Continue Reading…

Несколько слов о GORM

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

Continue Reading…

Общение со Skype через D-Bus на Python

Summary: в данной заметке описывается работа с программой Skype через D-Bus на Python. Введение Захотелось мне странного - когда я ухожу домой, мне нужно выключить amarok, kopete и Skype. Собственно, решено было через D-Bus отправлять вышеперечисленным приложениям релевантные сообщения.

Continue Reading…

Разработка макроса для TiddlyWiki

Summary: Пример разработки плагина для TiddlyWiki Вступление TiddlyWiki - это вики-движок, полностью написанный на JavaScript и хранящийся в одном файле (как сам движок, так и содержимое). Создатели позиционируют его как "переиспользуемую нелинейную персональную веб записную книжку".

Continue Reading…

Список для проверки при оптимизации Grails приложений

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

Continue Reading…

Вложенные транзакции в базах данных

Summary: Некоторые особенности вложенных транзакций. Иногда бывает так, что при обработке запроса необходимо открыть ещё одну транзакцию в рамках текущей транзакции. Это называется вложенной транзакцией. Очень многие базы данных не поддерживают вложенные транзакции вообще, например, MySQL и Oracle.

Continue Reading…

Расширение для работы с Delicious доступно на сайте расширений Google Chrome

Итак, расширение для работы с Delicious доступно на сайте расширений Google Chrome. Посмотреть и установить Новые версии расширения буду закачить на этот сайт.

Continue Reading…

Создание страницы настроек для расширений Google Chrome

В продолжение предыдущей заметки Логично предположить, что у расширений могут быть настройки. В Google Chrome/Chromium для этого есть специальный API. Для того, чтобы создать собственную страницу настроек необходимо сделать следующее:

Continue Reading…

Расширение Delicious Bookmarks для Google Chrome/Chromium

Введение Решил научиться писать собственные расширения для Google Chrome/Chromium. За идею взял официальное расширение от Yahoo! для Firefox - Delicious Bookmarks. Структура расширения Расширение - файл с расширением .crx. На самом деле это просто ZIP-архив с файлом манифеста внутри.

Continue Reading…

Двунаправленная ссылочная целостность

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

Continue Reading…

Spring Roo (часть 2)

Архитектура сгенерированного приложения Spring Roo активно использует аспекты. В качестве реализации аспектов была взята библиотека aspectj. Большая часть сгенерированного кода попадает в отдельные файлы-аспекты. Создадим простой класс: ```bash new persistent class jpa -name ~.

Continue Reading…

Введение в Spring Roo

Недавно компания Spring Source презентовала новый продукт - Spring Roo. Цель проекта - повысить продуктивность Java-разработчиков. Почитав обзоры, а также потрогав его руками можно сделать вывод о том, что это, в некотором виде, альтернатива AppFuse и Grails.

Continue Reading…

Apache Ant и Metro

Столкнулся с такой проблемой - в некоторых случаях приложение, собранное антом не работает. Конкретно - не работает десереализация запросов на веб-сервис. Получаемый запрос содержит null в значениях полей. Опытным путём было выяснено, что на это влияет используемая версия Java.

Continue Reading…

Использование модификатора protected на полях в базовом классе

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

Continue Reading…

Сферический программист в вакууме и абстрактное понятие качества кода в условиях Fixed-Price проектов (часть 2)

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

Continue Reading…

Сферический программист в вакууме и абстрактное понятие качества кода в условиях Fixed-Price проектов (часть 1)

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

Continue Reading…

Google Application Engine

Посмотрел на Google App Engine (GAE). При своей цене (= бесплатно) это очень хороший сервис. GAE - это инфраструктура для запуска веб-приложений на серверах Google. То, что сейчас модно называть cloud computing.

Continue Reading…

Eclipse и его расширения

Многие ругают Eclipse за то, что там нет многого из того, что есть в коробке у Jetbrains Intellij IDEA. Мне всегда казалось это не очень корректным, так как Eclipse в первую очередь платформа, а уже потом - среда для Java разработки.

Continue Reading…

Критерии выбора блокировок

Так как использование блокировок по-разному влияет на производительность, необходимо выбирать, в каких случаях какой вид блокировок лучше использовать. Условие Пессимистичная Оптимистичная Сверх-оптимистичная Конфликты часты + − − Конфликты редки − + − Данные только добавляются (например, журнал) − − + Данные только читаются (справочники) − − + Критерии выбора блокировок

Continue Reading…

Транзакции в реляционных базах данных

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

Continue Reading…

Кратко о блокировках в БД

Блокировка - в реляционных базах данных это установка метки на запись, что запись заблокирована для изменений. Существует два вида блокировок - оптимистичная и пессимистичная. Оптимистичная блокировка При оптимистичной блокировке на базе данных реальной блокировки не происходит.

Continue Reading…