Oleg Atamanenko
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…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…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…If anyone needs invites to atom.io, text editor from github - ask me in comments. I do have 3 invites to share.
Continue Reading…This is a very nice series of posts about Scala by Venkat Subramaniam The Elegance of Scala Sensible Typing and Optional Items Cute Classes and Pure OO Functional Style of Programming Working with Collections Creating Higher Order Functions Pattern Matching XML as First Class Citizen Recursions and Tail Call Optimization Using Traits Chaining Traits Concurrency in Scala
Continue Reading…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…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…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…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…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…Начиная с версии 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 - набор Java API для работы с REST сервисами. Существует несколько реализаций, о которых я уже писал раньше. Предположим, что проект А выставляет наружу REST API, который мы хотим использовать в проекте Б.
Continue Reading…Продолжая разговор о JAX RS Client API - предположим, что мы уже используем JAX-RS клиент У нас есть класс, который умеет создавать прокси для любого REST-интерфейса в проекте. Теперь мы хотим сделать так, чтобы эти интерфейсы можно было автоматически создавать в контексте Spring и связывать с другими бинами.
Continue Reading…JSR-303 предоставляет удобный API для проверки валидности объектов, а также входных параметров. Очевидно, что стандартных валидаторов в какой-то момент может быть недостаточно, поэтому необходимо писать собственный. Хочу показать на примере валидации запроса к MongoDB, как легко это делается.
Continue Reading…В Spring 3.1 появился замечательный модуль - Spring Cache, который является абстракцией над кэшированием, что позволяет декларативно реализовывать кэширование в приложении. Я не буду вдаваться в подробности работы, их можно прочитать в документации, но опишу, каким образом можно настроить memcached в качестве бэкэнда для работы.
Continue Reading…Очень часто возникает задача проверки входных параметров в сервис на корректность с точки зрения бизнес логики. Эту задачу можно решить в лоб, написав вручную код валидации в каждом из методов сервиса, например, вот так:
Continue Reading…Предположим, что у нас есть проект на Spring, в котором необходимо использовать внешние EJB. Для получения бинов необходимо создавать InitialContext и делать lookup() нужных ejb. Но эту задачу можно автоматизировать и пользоваться @Autowired, то есть код будет выглядеть вот так:
Continue Reading…Современные enterprise проекты очень часто имеют очень сложную инфраструктуру для развёртывания. Кроме того, во время разработки часто используются виртуальные машины. Например, может использоваться несколько виртуальных машин, на которых развёрнуты различные конфигурации софта.
Continue Reading…Очевидно, что мы не всегда можем воспользоваться автоматической генерацией кода, предоставляемой Spring Data JPA. Например, у нас слишком сложный запрос, или нам необходимо вызвать процедуру в базе данных, либо у нас сложная бизнес-логика.
Continue Reading…Рассмотрим подробнее одну из наиболее полезных вещей в Spring Data JPA - генерация JPQL-запросов на основе имени метода. Spring Data JPA умеет автоматически генерировать запросы используя для подсказки название метода.
Continue Reading…Сегодня я хочу рассказать, как можно сделать инициализацию логгера в классе с использованием аннотаций и BeanPostProcessor Очень часто мы инициализируем логгер следующим образом: public class MyClass { private static final Logger LOG = LoggerFactory.
Continue Reading…Казалось бы, есть простейшая задача - преобразовать строковое представление даты в объект класса java.util.Date. Как оказалось, иногда использование DateFormat не помогает. В случае, если строка - это заголовок Date из письма, то нам нужно использовать javax.
Continue Reading…Введение Уже прошло несколько лет с тех пор, как появился JPA. Работа с EntityManager увлекательна, но разработчики пишут красивый API, а подробности работы с базой данных скрывают. При этом частая проблема - дублирование имплементации, когда из одного DAO в другой у нас плавно перекочёвывает один и тот же код, в лучшем случае этот код переносится в абстрактный базовый DAO.
Continue Reading…Введение Для разработки 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…Наверно, вы уже сталкивались с таким понятием, как AOП - аспектно-ориентированное программирование. Обычно, про него вспоминают, когда говорят про декларативное использование транзакций, про проверку прав доступа, либо про реализацию журналирования.
Continue Reading…Сегодня я хочу рассмотреть некоторые особенности переопределения методов в 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…Периодически необходимо решать задачу создания больших ( и не очень) объёмов тестовых данных для проведения различных видов тестирования - функционального, нагрузочного (тестирование стабильности и производительности). При этом часто получается так, что система на тестовых данных ведёт себя совсем иначе, чем на реальных данных.
Continue Reading…В данной заметке хочу поделиться некоторыми моментами использования GORM. GORM - это ORM-фреймворк, используемый в Grails. Реализован он поверх Hibernate, но, при этом, с некоторыми отличными умолчаниями. Для разработчиков, знающих Hibernate, рекомендую тщательно изучить GORM, так как его поведение в некоторых случаях отлично от Hibernate, что может приводить к различным сюрпризам.
Continue Reading…Summary: в данной заметке описывается работа с программой Skype через D-Bus на Python. Введение Захотелось мне странного - когда я ухожу домой, мне нужно выключить amarok, kopete и Skype. Собственно, решено было через D-Bus отправлять вышеперечисленным приложениям релевантные сообщения.
Continue Reading…Summary: Пример разработки плагина для TiddlyWiki Вступление TiddlyWiki - это вики-движок, полностью написанный на JavaScript и хранящийся в одном файле (как сам движок, так и содержимое). Создатели позиционируют его как "переиспользуемую нелинейную персональную веб записную книжку".
Continue Reading…Summary: Мой опыт борьбы с "убийцами производительности". Постановка проблемы Иногда бывает так, что хочется отвлечься от работы, от поставленной задачи на какую-нибудь фигню, лишь бы не заниматься текущей задачей. У меня это чаще всего сводилось к тому, что я начинал читать что-нибудь в сети (Google Reader, Habrahabr, LOR, etc).
Continue Reading…Выкладываю ниже список задач, которые нужно/можно выполнить для оптимизации приложения, написанного на Grails, может кому пригодится. Тестирование проведённых оптимизаций Первым делом необходимо разработать критерии проверки, которые позволят оценить эффективность проведённых оптимизаций.
Continue Reading…Summary: Некоторые особенности вложенных транзакций. Иногда бывает так, что при обработке запроса необходимо открыть ещё одну транзакцию в рамках текущей транзакции. Это называется вложенной транзакцией. Очень многие базы данных не поддерживают вложенные транзакции вообще, например, MySQL и Oracle.
Continue Reading…Summary: В данной заметке описана настройка autofs для доступа к сетевым ресурсам, доступным по NFS. Последние несколько лет (с тех пор, как количество компьютеров дома стало больше одного) возникла проблема беспрепятственного доступа к данным, хранящимся на одном компьютере с другого.
Continue Reading…Есть такой замечательный сервис - Dropbox. Этот сервис является онлайн-хранилищем ваших данных. Работает очень просто: Вы регистрируетесь в сервисе. Устанавливаете клиент Пользуетесь. Недавно я понял, что этот сервис можно легко и непринуждённо использовать не только для хранения различных документов и фотографий, а также и конфигурационных файлов приложений, что существенно упрощает жизнь, когда у вас несколько рабочих машин (например, у меня домашний компьютер, ноутбук, а также ещё и рабочий) - необходимо каким-то образом синхронизовать конфиги при изменении их на одной из машине с другими.
Continue Reading…Раньше я использовал коллекцию скриптов nautilussvn, весьма неудобную в использовании. Бродя по просторам сети наткнулся на отличную замену. Встречайте - RabbitVCS. ВозможностиИнтеграция с Nautilus Поддержка Subversion Полная локализация Поддержка командной строки Доступны пакеты для различных дистрибутивов Установка
Continue Reading…Google запустил сайт Chrome Extensions. В данный момент сайт доступен только разработчикам расширений. Залил расширение, написал кратенькое описание. Жду запуска сайта. :) А пока сайт закрыт для рядовых пользователей последнюю версию можно скачать тут.
Continue Reading…В продолжение предыдущей заметки Логично предположить, что у расширений могут быть настройки. В Google Chrome/Chromium для этого есть специальный API. Для того, чтобы создать собственную страницу настроек необходимо сделать следующее:
Continue Reading…Введение Решил научиться писать собственные расширения для Google Chrome/Chromium. За идею взял официальное расширение от Yahoo! для Firefox - Delicious Bookmarks. Структура расширения Расширение - файл с расширением .crx. На самом деле это просто ZIP-архив с файлом манифеста внутри.
Continue Reading…Здравствуйте. Я считаю, что разработчику всегда стоит иметь представление о том, как работают низлежащие абстракции. Хотя бы потому, что часто абстракции бывают протекающими. А веду я это к тому, что когда фреймворк вываливает стектрейс с несколькими вложенными (и, часто, для непосвященных непонятными) исключениями, то бывает непонятно, что с этим делать, особенно, если не знаешь, как реализована абстракция.
Continue Reading…Так получилось, что в последнее время я стал пользоваться небезызвестной оперой. В связи с этим я стал искать замену часто используемым расширениям, одно из них - delicious bookmarks. Сервис del.icio.us предоставляет букмарклеты для различных браузеров, которые позволяют сохранять закладки быстро и удобно.
Continue Reading…Архитектура сгенерированного приложения Spring Roo активно использует аспекты. В качестве реализации аспектов была взята библиотека aspectj. Большая часть сгенерированного кода попадает в отдельные файлы-аспекты. Создадим простой класс: ```bash new persistent class jpa -name ~.
Continue Reading…Недавно компания Spring Source презентовала новый продукт - Spring Roo. Цель проекта - повысить продуктивность Java-разработчиков. Почитав обзоры, а также потрогав его руками можно сделать вывод о том, что это, в некотором виде, альтернатива AppFuse и Grails.
Continue Reading…Столкнулся с такой проблемой - в некоторых случаях приложение, собранное антом не работает. Конкретно - не работает десереализация запросов на веб-сервис. Получаемый запрос содержит null в значениях полей. Опытным путём было выяснено, что на это влияет используемая версия Java.
Continue Reading…Недавно задали мне вопрос - что я думаю об использовании модификатора protected для членов базового класса? Под этим вопросом кроются более серьёзные вещи. Например, любой член класса, имеющий модификатор protected, расширяет интерфейс базового класса для подклассов - подклассы имеют доступ ко всем protected и public методам этого поля.
Continue Reading…Причин для написания плохого кода может быть несколько. Некоторые из них лежат на поверхности: Отсутствие опытаНевнимательность Некомпетентность Немотивированность Отсутствие опыта - казалось бы, самая простая причина проблемы; решение проблемы выглядит очевидным - со временем, разработчик будет писать код лучше.
Continue Reading…В последнее время всё чаще задумываюсь о том, почему разработчики пишут плохой и некачественный код. Под кодом я подразумеваю не только сам код, но и, в том числе, архитектуру и дизайн.
Continue Reading…Посмотрел на Google App Engine (GAE). При своей цене (= бесплатно) это очень хороший сервис. GAE - это инфраструктура для запуска веб-приложений на серверах Google. То, что сейчас модно называть cloud computing.
Continue Reading…Многие ругают Eclipse за то, что там нет многого из того, что есть в коробке у Jetbrains Intellij IDEA. Мне всегда казалось это не очень корректным, так как Eclipse в первую очередь платформа, а уже потом - среда для Java разработки.
Continue Reading…Так как использование блокировок по-разному влияет на производительность, необходимо выбирать, в каких случаях какой вид блокировок лучше использовать. Условие Пессимистичная Оптимистичная Сверх-оптимистичная Конфликты часты + − − Конфликты редки − + − Данные только добавляются (например, журнал) − − + Данные только читаются (справочники) − − + Критерии выбора блокировок
Continue Reading…При работе в многопользовательском окружении может возникнуть ситуация, когда разные пользователи или системы обновляют одни и те же данные. Это может привести к ситуации, когда один из пользователей изменит данные, которые уже изменял другой пользователь и приведёт либо к потере данных, либо к переводу данных в неконсистентное состояние.
Continue Reading…Блокировка - в реляционных базах данных это установка метки на запись, что запись заблокирована для изменений. Существует два вида блокировок - оптимистичная и пессимистичная. Оптимистичная блокировка При оптимистичной блокировке на базе данных реальной блокировки не происходит.
Continue Reading…В продолжение предыдущей заметки. Для работы с del.icio.us я использую официальный плагин от Yahoo!. Он предоставляет следующие возможности: Синхронизация закладок из Firefox с del.icio.us Переопределение стандартного менеджера закладок. Отслеживание изменений на del.
Continue Reading…Уже более двух лет я использую del.icio.us. Недавно возник вопрос - а вот каким образом можно наиболее эффективно использовать теги? Для себя я придумал вот такой вариант использования - сделал tag bundle Actions, в который поместил теги, диктующие дальнейшие действия.
Continue Reading…