Oleg Atamanenko

thoughts about programming

Running Pi-hole on Kubernetes

Recently I wrote how you can install Kubernetes on Raspberry Pi. In this post, we will install Pi-Hole on Kubernetes. Up to recent versions of Pi-Hole Docker images you had to take care of the correct architecture (and as a result correct docker tag to use).

Continue Reading…

Performing Kubernetes Service CIDR Block Migration

In the post I describe how we did migration of Service CIDR Blocks in the fleet of our kubernetes clusters in production without downtime.

Continue Reading…

iOS shortcuts

Recently I re-discovered iOS Shortcuts and found it is substantially useful. In this post, I’ll describe a few shortcuts I use.

Continue Reading…

Quick Entry Task to Omnifocus from Terminal

I use OmniFocus a lot and wanted to share with you simple automation that will allow adding tasks to OmniFocus without switching to the main window or using QuickEntry.

Continue Reading…

Causes of UnexpectedAdmissionError in Kubernetes

Recently I found that sometimes kubernetes pods are not starting. They were failing with the enigmatic UnexpectedAdmissionError. Time to deep dive into what may cause it.

After searching through the kubernetes codebase I found several places where this status was set.

Continue Reading…

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…

Installing Kubernetes on Raspberry Pi

Installing kubernetes on Raspberry Pi is easy, but there are few caveats that you need to be aware of. arm64 is preferred, because 64-bit allows you to use > 4GB of RAM per process.

Continue Reading…

Configuring Wi-Fi on Ubuntu Server 64-bit on Raspberry Pi 4

After discovering that by default Raspberry installs 32-bit Raspbian OS, I wanted to reinstall it with a 64 bit - this would allow to run Kubernetes on Raspberry Decided to go with Ubuntu Server 64.

Continue Reading…

Running Pi-Hole on Raspberry Pi

Several years ago I bought Raspberry Pi 3. It was a nice toy, but it was very slow and almost impossible to use, so it didn’t stick. Recently I bought new Raspberry Pi 4 because it has much better hardware (especially 8GB RAM option).

Continue Reading…

My Setup

Introduction This is a dump of different things and apps I use daily. I hope you will find it helpful. Shell/Terminal Applications zsh — ZSH is a shell. It is an excellent alternative to bash used by default in most Linux distributions and macOS.

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…

Migration to hugo completed

Good news, everyone. Migration from octopress to hugo was completed. If you find any broken layout and/or links, please contact me.

Continue Reading…

Pocket is down

Hi. Pocket is down so it means there is no reading list for today. Everyone have a nice day.

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…

Atom.io invites

If anyone needs invites to atom.io, text editor from github - ask me in comments. I do have 3 invites to share.

Continue Reading…

Scala for the Intrigued

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…

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…

Snowboarding

Today in the evening I got to Whitetail Ski Resort.

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…

Lyne Game

Found very addictive and cool game: Lyne. The goal of the game is to connect all dots on the playboard. Worth every cent.

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…

Сплин - Резонанс, часть 1.

Splean released new album - Resonance, part 1. Good album, good texts. You can listen previews here or here (Russia only).

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…

Fixed Google+ comments on the site

Fixed google+ comments disappearing on the site. Thanks to [this blog post][codeinf] [codeinf]: http://blog.code-infection.com/2013/04/google-comments-on-your-none-blogger.html

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…

@Autowired JAX-RS Client API

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

Continue Reading…

JAX-RS Client API

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

Continue Reading…

@Autowiring EJBs with Spring

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

Continue Reading…

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

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

Continue Reading…

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

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

Continue Reading…

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

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

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…

Борьба с убийцами производительности

Summary: Мой опыт борьбы с "убийцами производительности". Постановка проблемы Иногда бывает так, что хочется отвлечься от работы, от поставленной задачи на какую-нибудь фигню, лишь бы не заниматься текущей задачей. У меня это чаще всего сводилось к тому, что я начинал читать что-нибудь в сети (Google Reader, Habrahabr, LOR, etc).

Continue Reading…

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

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

Continue Reading…

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

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

Continue Reading…

Настройка autofs для монтирования NFS-ресурсов

Summary: В данной заметке описана настройка autofs для доступа к сетевым ресурсам, доступным по NFS. Последние несколько лет (с тех пор, как количество компьютеров дома стало больше одного) возникла проблема беспрепятственного доступа к данным, хранящимся на одном компьютере с другого.

Continue Reading…

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

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

Continue Reading…

Использование Dropbox для хранения конфигурационных файлов

Есть такой замечательный сервис - Dropbox. Этот сервис является онлайн-хранилищем ваших данных. Работает очень просто: Вы регистрируетесь в сервисе. Устанавливаете клиент Пользуетесь. Недавно я понял, что этот сервис можно легко и непринуждённо использовать не только для хранения различных документов и фотографий, а также и конфигурационных файлов приложений, что существенно упрощает жизнь, когда у вас несколько рабочих машин (например, у меня домашний компьютер, ноутбук, а также ещё и рабочий) - необходимо каким-то образом синхронизовать конфиги при изменении их на одной из машине с другими.

Continue Reading…

Дайджест ссылок в RSS-ленте

Решил убрать дайджест ссылок из RSS-ленты. Те, кому это нужно могут сделать следующее: 1. Добавить в свой RSS-аггрегатор ленту http://feeds.delicious.com/v2/rss/dark.schakal?count=15 2. Если вы используете сервис Delicious, то можете меня добавить меня в свою сеть по ссылке: http://delicious.

Continue Reading…

RSS лента блога и дайджест ссылок за предыдущий день

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

Continue Reading…

RabbitVCS - расширение для Nautilus для работы с Subversion

Раньше я использовал коллекцию скриптов nautilussvn, весьма неудобную в использовании. Бродя по просторам сети наткнулся на отличную замену. Встречайте - RabbitVCS. ВозможностиИнтеграция с Nautilus Поддержка Subversion Полная локализация Поддержка командной строки Доступны пакеты для различных дистрибутивов Установка

Continue Reading…

Расширение Delicious Plugin идёт в массы

Google запустил сайт Chrome Extensions. В данный момент сайт доступен только разработчикам расширений. Залил расширение, написал кратенькое описание. Жду запуска сайта. :) А пока сайт закрыт для рядовых пользователей последнюю версию можно скачать тут.

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…

Инвайты на Google Wave

Кому нужны инвайты на Google Wave, отписываемся в комментариях - поделюсь. UPD. Инвайты закончились, всем спасибо.

Continue Reading…

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

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

Continue Reading…

Opera и del.icio.us

Так получилось, что в последнее время я стал пользоваться небезызвестной оперой. В связи с этим я стал искать замену часто используемым расширениям, одно из них - delicious bookmarks. Сервис del.icio.us предоставляет букмарклеты для различных браузеров, которые позволяют сохранять закладки быстро и удобно.

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…

Практический опыт использования фолксономии в условиях неограниченной свободы расстановки меток (часть 2)

В продолжение предыдущей заметки. Для работы с del.icio.us я использую официальный плагин от Yahoo!. Он предоставляет следующие возможности: Синхронизация закладок из Firefox с del.icio.us Переопределение стандартного менеджера закладок. Отслеживание изменений на del.

Continue Reading…

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

Уже более двух лет я использую del.icio.us. Недавно возник вопрос - а вот каким образом можно наиболее эффективно использовать теги? Для себя я придумал вот такой вариант использования - сделал tag bundle Actions, в который поместил теги, диктующие дальнейшие действия.

Continue Reading…