Power Assert in Vim

Power Assert for Java and others

Peter Niederwieser, creator of Spock, the best testing framework ever, also contributed to Groovy programming language a very handy feature: Power Asserts.

int x = 1;
assert x == 2;

// Output:             
// Assertion failed:
// assert x == 2
//        | |
//        1 false

As you can see, we can see each value of each statement, and this is very cool, especially for unit tests.
It makes all this JUnit bullshit like assertEquals(), assertTrue, assertNull, and all matchers like Hamcrest absolutely unneeded.
I really hate all matchers like FEST or Hamcest, because they aren’t natural and repeat code itself.

So now you can breathe freely without any repeating yourself.

You can see a talk where Peter Niederwieser present Spock specifications

Also Peter created Power Asserts lib for Scala

Unfortunately, you can’t make a Power Asserts in Java, because it doesn’t have a AST preprocessor.

If you, like me, have a big project with tests written in Java+JUnit, the only one way that I found, is convert them to Groovy (in 99% just change file extension from Java to Groovy) or you can compile your tests with groovyc — it’s Groovy Compiler but compiles Java too as well.
After compiling with groovyc asserts in Java behaves like in Groovy. Maybe this is the only one case when something written in Java works differently when compiled with Groovy.

For example here is simple test in Java

import org.junit.Test

class UserTest {
    public void testName() {
        String username = "olololo";
        assert username.equals("trololo");


After compiling with groovyc it’s decompiled bytecode will looks like:

// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;
import org.codehaus.groovy.runtime.powerassert.AssertionRenderer;
import org.codehaus.groovy.runtime.powerassert.ValueRecorder;
import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
import org.junit.Test;

public class UserTest implements GroovyObject {
    public UserTestGroovy() {
        CallSite[] var1 = $getCallSiteArray();
        MetaClass var2 = this.$getStaticMetaClass();
        this.metaClass = var2;

    public void testName() {
        CallSite[] var1 = $getCallSiteArray();
        String username = "olololo";
        ValueRecorder var3 = new ValueRecorder();

        try {
            CallSite var10000 = var1[0];
            var3.record(username, 8);
            Object var6 = var10000.call(username, "trololo");
            var3.record(var6, 17);
            if(DefaultTypeTransformation.booleanUnbox(var6)) {
            } else {
                ScriptBytecodeAdapter.assertFailed(AssertionRenderer.render("assert username.equals(\"trololo\")", var3), (Object)null);

        } catch (Throwable var5) {
            throw var5;

As you can see, it uses ValueRecorder to store all evaluated expressions and it will render a source code line. And it may be executed as class file (may require groovy-all dependency in classpath):

Assertion failed: 

assert username.equals("trololo")
       |        |
       olololo  false

	at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:402)
	at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:650)
	at com.github.stokito.UserTest.testName(UserTest.java:9)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)

Unfortunately currently IntelliJ can’t compile Java files with Groovyc. It always compiles *.java files with javac.
I created an issue Allow groovyc as compiler for Java classes, please vote for it.

Power Asserts in other languages


does not exist but authors know about Power Assertions and had intentions to do them.

.NET languages



https://github.com/power-assert-js/espower-typescript for TypeScript
https://github.com/deepblue-will/coffee-power-assert for Cofee Script


There is a gem https://github.com/k-tsj/power_assert and here is presentation from author:

https://github.com/yui-knk/pry-power_assert for Pry REPL


https://github.com/keygx/PAssert XCTest by Swift
https://github.com/rosylilly/power_assert.cr for Crystal (static Ruby)
https://github.com/ma2gedev/power_assert_ex for Elixir
https://github.com/gifnksm/power-assert-rs for Rust
https://github.com/haya14busa/vital-power-assert for Vim script

TODO: write about power assets in https://en.wikipedia.org/wiki/Assertion_(software_development)

Always use interfaces for dependency injection

I working on a big legacy project that uses Spring IoC. And when it started I see in console warning messages like:

WARN  org.springframework.aop.framework.Cglib2AopProxy - Unable to proxy method [public final javax.sql.DataSource org.springframework.jdbc.core.support.JdbcDaoSupport.getDataSource()] because it is final: All calls to this method via a proxy will be routed directly to the proxy.

Here a sample code:

public class UserServiceImpl implements UserService {


public class UserController {

    UserServiceImpl  userService; // Here a problem: we declared field as concrete class UserServiceImpl  instead of interface UserService


As I found it happens when fields autowired as concrete class instead of injection by interface.

According to Spring AOP documentation:

Spring AOP uses either JDK dynamic proxies or CGLIB to create the proxy for a given target object. (JDK dynamic proxies are preferred whenever you have a choice).
If the target object to be proxied implements at least one interface then a JDK dynamic proxy will be used. All of the interfaces implemented by the target type will be proxied. If the target object does not implement any interfaces then a CGLIB proxy will be created.

Thus since userService injected by concrete class UserServiceImpl instead of interface UserService, so Spriong IoC tries to create a proxy class via CGLIB bytecode magic that shows this error message.

Also this CGLIB magic proxying may be disabled by configuration:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <ehcache:annotation-driven cache-manager="genericCacheManager" proxy-target-class="false"/>
    <tx:annotation-driven proxy-target-class="false"/>
    <aop:aspectj-autoproxy proxy-target-class="false"/>

In this case this exception will be thrown during runtime:

Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy56 implementing com.eample.services.UserService,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.eample.services.UserServiceImpl] for property ‘userService’: no matching editors or conversion strategy found

To fix this we just need to use autowiring by interface and this is in common simple refactoring.

Please vote for this feature request to make IntellijIdea helpful in this New inspection: Use dependency injection by interface instead of concrete class

See also:
Spring: Why do we autowire the interface and not the implemented class?
Why always have single implementaion interfaces in service and dao layers?

[LinkSet] Avoiding NullPointerException in Java

[LinkSet] Database migration tools

Версионная миграция структуры базы данных: основные подходы

DBMaintain and Unitils

Использование Unitils для тестирования в Java


Grails Database Migration Plugin
Использование Liquibase без головной боли. 10 советов из опыта реальной разработки




Tapestry 5 Database Migrations

For .NET


Плюсы: процесс создания и редактирования БД напоминает то, как бы вы это делали с Management Studio.
Минусы: сложность написания миграционных скриптов. Т.к. инкрементальные изменения строит сам проект, сохранность данных обеспечивается за счет pre-deploy и post-deploy-скриптов. Придется опираться на наличие/отсутствие полей в БД или «изобретать» таблицу schema version, уже реализованную в миграционных движках.

ECM7 Migrator

Движок миграций с открытым кодом. Проект поддерживает хабраюзер dima117.
Плюсы: поддерживаются разные СУБД, если что-то вас не устраивает, код открыт. Мигратор поддерживается и обрастает новыми функциями. И, пожалуй, самое важное, поддерживает несколько ключей миграций в одной базе данных. Это может быть очень полезно, если ваше приложение модульное и поддерживает плагины в том или ином виде. Каждый плагин может выполнять свои миграции и при этом использовать одну БД
Минусы: нет плюшек Entity Framework Migrations.

Entity Framework Migrations

Плюсы: работает из коробки, автоматически создает миграции по Db-контексту, понимает команды из консоли visual studio, миграции публикуются с помощью стандартного Publish из Visual Studio.
Минусы: зависит от Entity Framework.


FluentMigrator — система версионных миграций

Как снять хату в Куёвке

Спросил недавно меня молодой программист как снять квартиру в Киеве, отрыл в заметках и сделаю для него постик.

Тема популярная так что гуглить \ спрашивать есть смысл. Ойтишнеги регулярно делятся опытом.

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

Карта с сайта http://rating.lun.ua/

Я считаю что стоит постараться снять на правом берегу и желательно на синей ветке метро. На синей ветке больше самых нужных станций: Контрактовая, Майдан, ПЛТ, Олимпийская. Самая паршивая это зелёная ветка. Она прям вся неудачная.
Если позволяют деньги и особо не хочется заморачиваться — снимайте на Оболоне.
Там есть где потусить (Дримтаун) есть где погулять (набережная), есть инфраструктура и в центр добираться недолго.
Короче там явно меньше шансов неудачно снять квартиру.

В красной зоне живут самые злобные небожители и прочие секретари обкомов и тебе такие соседи не нужны даже если ты миллионер.
В жёлтой зоне тоже жить почти невозможно, но это центр поэтому дороже. А вот в оранжевую зону стремись как только можешь. Там очень кайфово, поверь.

Далее, открываешь газету объявлений, например http://www.aviso.ua/kiev/ или OLX и обзваниваешь все все номера, не важно какой там написан район. Это всё агенства и у них много квартир в разных уголках города. Говоришь кто ты, что хочешь и пускай тебе ищут. Например: «Я программист, с девушкой, без детей и дивотных. Ищу однокомнатную на Оболоне. В ней должно быть: стиралка, шкаф, письменный стол, диван, микроволновка, кондиционер».

Агенства берут половину стоимости месячной аренды, т.е. если ты снял однушку за 2500 в месяц то агенство сдерёт с тебя 1250. Плюс ты должен заплатить ещё за последний месяц.
В итоге ты должен будешь выложить 2500 * 2 + 2500 / 2 = 6250 грн.

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

Самое главное запомни: агенты так безбожно пиздят, как даже депутаты не умеют.
Не верь им вообще. С ними как и с другими разводилами и цыганскими гипнотизёршами разговор короткий: чем меньше их слушаешь тем меньше даёшь возможности манипулировать собой. Просто узнавай адрес, сразу смотри по карте и проси показать как можно быстрее.
Вот небольшой ИЧСХ правдивый словарь для расшифровки:

жилое состояние — нежилое состояние;
хорошее состояние — нехорошее состояние;
косметический ремонт — отсутствие ремонта;
ремонту 4 года — нет ремонта;
ремонт 90-х годов — ремонта не было уже тогда когда ты поступал в универ;
евроремонт — хоть какой-то ремонт;
отличная гостинка — оксюморон;
требует ремонта — не было ни одного ракурса, чтобы сделать пристойные фотки;
квартира готова к воплощению ваших самых смелых дизайнерских фантазий — или голые стены или там 50 лет жила бабушка, которую похоронили неделю назад;
квартира достойна вашего внимания — риэлтору срочно нужны деньги;
квартира делалась для себя — безвкусная дорогая квартира;
шикарная квартира — очень дорогая и очень безвкусная квартира;
квартира еще не сдавалась — квартиру никак не могут сдать;
отличная планировка — пол-квартиры кухня и коридоры;
удачная планировка — обычная планировка;
функциональная планировка — все натыкано одно на одном;
уютная квартира — маленькая квартира;
светлая, солнечная квартира — летом солнце шпарит целый день, в квартире 40 градусов;
видовая квартира — квартира выше 5-го этажа;
можно использовать под офис — квартира на первом этаже;
царский дом — очень старый дом;
сталинка — старый кирпичный дом;
спецпроект — старый многоэтажный панельный дом;
ведомственный дом — старый дом со старухами;
дом клубного типа — любой дом построенный начиная с 2000 года;
элитный дом — новый дом;
кухня-студио — снесли стену кухни;
дом введен в эксплуатацию — дом будут доделывать еще полгода;
в историческом центре — в окружении старых домов;
возле метро — 2 остановки до метро;
5 мин до метро — рассчитывалось по времени Усейна Болта на 100 метровке;
удобная транспортная развязка — дом у дороги;
развитая инфраструктура — есть продуктовый магазин;
приятные, отзывчивые соседи — старые бабки;
элитные соседи — нувориши, быки, силиконовые телки и прочая нечисть;
облагороженная территория — двор закатан в асфальт, кустики и деревца;
вид на Покровский монастырь — из окна кухни, если стать вот тут и наклониться, видно пол левого купола;
рядом 2 озера — комары и вонь;
парковка во дворе — нет парковки;
автономное отопление — бойлер висит над унитазом;
во дворе детская площадка — во дворе когда-то была детская площадка;
квартира в классическом стиле — дубовые комоды и полосатые обои;
дизайнерский ремонт — оранжевые стены и синяя мебель.

в квартире есть:
мебель — ненужная мебель;
дорогая итальянская мебель — очень дорогая безвкусная мебель;
диван — поломанный диван;
холодильник — холодильник с дачи;
стиральная машинка — старая стиральная машинка;
шкаф — бабушкин шкаф;
новая сантехника — самый дешевый унитаз;
венецианская штукатурка — WTF???;
торг — скидываем 20%;
хороший торг — цена завышена в 2 раза;
цену снижено — стоимость завышено в 1,5 раза.

Как снять квартиру самостоятельно.
Сегодня ситуацию на рынке аренды жилой недвижимости можно назвать штормом. Бюджетные варианты выстреливают редко, а если и выстреливают. То не успевают «доходить» до риэлторских компаний. Да, и риэлторы стараются не брать бюджетные квартиры в работу, беготни много, расстояния большие ( уходит много времени на перемещения), а можно банально не успеть приехать на квартиру. Сегодня арендодатель устраивает что-то наподобие аукциона. Проводить просмотры начинает уже за месяц до предполагаемого освобождения квартиры ,а арендаторы жалуются, что арендаторы начинают поднимать цену, даже если живешь достаточно долго. При этом снять другую квартиру практически нереально за эту же цену. Несмотря на то, что я являюсь управляющим партнером риэлторской компании «КДУ-риэлти групп», и сегодня в нашей компании работает много переселенцев, которым тоже нужно зарабатывать на хлеб, я решила написать ПАМЯТКУ для вынужденных переселенцев, как самому снять квартиру в аренду и получить минимум седых волос.
1. Запаситесь терпением и интернетом, а также напишите объявление «Сниму для себя квартиру» и распечатайте его в ХХХХ эксземплярах.
2. Поклейте объявление (желательно, после 11 часов дня, когда уже пройдут дворники и оборвут все объявления) в интересующем Вас районе, а лучше во всей ветке метро. Если работа покажется Вам слишком трудоемкой, можно нанять расклейщиков за деньги. Они работают по районам, их работа стоит от 100 грн, и их контакты есть в интернете.
3. Пройдите по ссылке http://top.bigmir.net/show/realty/ и выберите город, в котором ищете квартиру. Вам придется разобраться в куче информационного мусора и откровенных фейков, которые в огромном количестве представлены на сайтах по аренде недвижимости. Справедливости ради надо сказать, что в любом городе, также и в Киеве, есть честные и порядочные посредники, но они работают, в основном, в ценовом сегменте выше среднего, в бюджетном же можно «нарваться» как на мошенников, так и на просто неадекватов или лгунов. Много общайтесь по телефону с целью понять, имеете ли дело с аккредитованным риэлтором, требуйте (просите) назвать компанию, от которой он работает.
4. Поставьте фильтры на сайтах, где ищете квартиру «частное» и «юез комиссии». И хотя, в большинстве случаев это не спасает, зерна от плевел при кропотливом отборе найти можно. Что ж, придется поработать Золушкой. Вопросы ставьте такие
-Сколько лет ремонту?
-Соответствуют ли фотогорафии на сайте сегодняшнему состоянию квартиры и когда были сделаны?
-Можно ли посмотреть квартиру прямо сейчас и сколько человек уже в очереди записано? С какого времени начинаются просмотры? И приезжайте на час-два раньше, если хотите успеть снять квартиру.
5. Разделитесь и езжайте на просмотры в разные места и на разные квартиры, чтобы успеть снять бюджетную квартиру. Имейте при себе сразу деньги в сумме хотя бы на одну месячную плату в качестве залога;
6. Погуглите телефон собственника, в 90% случаев, поисковик покажет, что еще продавал собственник, или собственник ли это.
7. Самое важное:
-не оплачивайте услуги риэлтора ДО просмотра квартиры. Все, кто просит оплатить 100-250-500 грн до просмотров — мошенники. Не ведитесь на низите цены, это «замануха»; Настоящий риэлтор получает комиссию только при подписании договора;
-проверяйте правоустанавливающие документы собственника на квартиру, прописку, поговорите с соседями, знают ли они хозяина;
-не платите деньги хозяину без договора, скачайте договор аренды (образцы есть в интернете) и подкорректируйте его в соответствии со своими требованиями;
-внимательно изучите и согласуйте договор, чтобы через месяц не пришлось выезжать, если хозяин вздумает поднять цену;
-подписывайте приложение к договору, в котором указано имущество владельца, а также сумма денег, которую Вы платите ему за аренду.
Повесьте ПАМЯТКУ себе на стену и следуйте ей, когда возникнет необходимость в аренде квартир.
И компания КДУ-риэлти групп и я, Маленкова Елена, желаем Вам удачи!

(с) отсюда

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

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

От себя добавлю несколько важных пунктов:

  1. Всем хатосдавателям ну очень как интересно что вы будете делать в хате. Они сразу представляют как ты их нежную квартирку всю засрёшь и как они будут отдраивать. Это неизбежно. Меня даже прямым текстом спрашивали не буду ли я устраивать оргий. Расслабь их, я например пошутил что оргии отличная идея! Твоя главная задача во время знакомства с ними определить готовы ли они с этим смириться. Это можно определить по фразам типа «ну в квартире не курите, на балконе можете»
  2. Меняй замки сразу по заезду, это обязательное условие. Когда договариваешься с хозяином говори что у тебя будут хранится документы и ноутбук а сам ты ездишь по командировкам. Во первых эти ключи были у бывших жильцов а то и вовсе квартира могла посуточно сдаваться, обнесут квартиру. Хозяин может согласится но попросить себе ключи на случай потопа. Скажи что дашь телефон своей подруги которая рядом живёт, а хозяина и его семью ты не знаешь, и прва рисковать документами не имеешь. Реальный случай когда сын хозяина, алкаш, украл ключи и обнёс квартирантов. Во вторых, ты не поверишь, но хозяйка квартиры, особенно если это бабка может тайком приходить и даже например подкладывать обратно скатерть которую ты убрал со стола.
  3. Остюда вывод: никогда, ни при каких обстоятельствах не снимай квартиру у пенсионеров. Какими-бы они адекватными не выглядели. Не знаю ни одного случая когда это бы не заканчивалось каким то угарным трешем.
  4. Также, если есть консьержка — с ней по любому будут конфликты. Это неизбежно, как неизбежны проблемы с ментами, учителями и прочим генным мусором который получил кусочек власти, такая у них профессиональная деформация.
  5. Помни: Соседи тебя ненавидят и на этой почве кстати подружатся с консьержкой. Вообще помни что почти все твои соседи (типа) коренные киевляне это такие сферические жлобы в вакууме. Это минимальное условие выживания тут. Если это из головы не опускать то можно неплохо с ними ладить.
  6. Я бы подытожил так: для молодого ойтшнега самое главное в квартире — адекватный хозяин, вид из окна и близость к метро.

Если не знаешь центра на вот тебе экскурсия от Сашечки-няшечки

Ну и если ты молод и только переехал в Киев ещё не зная города то мне в своё время очень понравились ночные туры по городу которые делали студенты КПИшники для своих первокурсников.
Киев, особенно Верхний старый город (от Большой Житомирской до Бульвара Шевченко ) ночью кайфовый. Можешь поискать что нибудь похожее.

По себе могу точно сказать — место очень и очень красит человека.

[Grails] ConfigObject

A popular question about ConfigSlurper:

Hey guys, I had in a project the following:
String variable = grailsApplication.config.grails.property.name + grailsApplication.config.grails.anotherproperty.name

And was working for almost a year but suddenly it stop working and throwing an error regarding the ConfigObject doesn’t have a plus method, did something similar happened to anyone?
Did someone knows why it was working and suddenly stop working ?

It doesn’t work because one of ‘property.name’ or ‘anotherproperty.name’ is not set.

If some option is not set, then ConfigSlurper return instance of ConfigObject.
That’s a common mistake.
Good news is that empty ConfigObject can be casted to false by the Groovy Truth.
Thus, to avoid this kind of mistakes and get null instead of ConfigObject you can use Elvis operator write something like:

// return empty list if supportedLocales isn't set
grailsApplication.config.supportedLocales ?: []

// return null if defaultLocale isn't set
grailsApplication.config.defaultLocale ?: null