Category Archives: Programming

ImageMagick “convert: Non-conforming drawing primitive definition `image” problem

ImageMagick is the great set of image processing utilities. But there are some problems to interact with it from your programs (java program in my case). About one of them I would like to talk. In one of our latest projects we used ImageMagick to resize images and put a watermark on them. Everything was fine on developers machines with OS Windows, but when we put project on Unix server… Agrrr. WTF?! We got this error: “convert: Non-conforming drawing primitive definition `image”. Magic… ImageMagick! Here is the best article that I have founded about this problem. It doesn’t help me ’cause it describes a little different problem, but it may be helpful for you) Ok, let us see the code that throws the error (in this example I removed resize parameter ’cause it works fine and the problem only in draw):

public void convertImage() {
    // List of commands that we want to execute
    List commands = new ArrayList();
 
    // Executable file
    commands.add("convert");
 
    // Executable file parameters
    commands.add("-gravity");
    commands.add("South-East");
    commands.add("-draw");
    commands.add(""image Over 0,0 0,0 'im-watermark.png'"");
    commands.add("im-image.png");
    commands.add("im-new.png");
 
    try {
        // I also tried to use Runtime.getRuntime().exec(...), but got the same result and it doesn't wonder
        // 'cause it use ProcessBuilder
        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.command(commands);
        Process process = processBuilder.start();
 
        BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));
 
        // Check if we have an error...
        if (error.ready()) {
            // ...then print them
            String line;
 
            while ((line = error.readLine()) != null) {
                System.out.println("error: " + line);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

The process builder that we use in our code example must generate such command:

convert -gravity South-East -draw "image Over 0,0 0,0 'im-watermark.png'" im-image.png im-new.jpeg

Looks correct, but doesn’t work. Ok, let’s try to run this command from Unix shell. I can’t belive it! It works! In shell, but not from our program( I think that something happens with convert command parameters when JVM run it or may be it is some kind of Unix feature. I don’t know. So, I did this trick:

  1. create shell script “im-convert-proxy.sh” (don’t forget to execute “chmod +x im-convert-proxy.sh” command. It allows you to execute this script) with code:

    eval 'convert '$@

    How you can see it just runs convert command with all parmeters that we passed to script from our java program.

  2. replace executable file from “convert” to “im-convert-proxy.sh”:

    commands.add("im-convert-proxy.sh"); // was commands.add("convert");

That’s all! Everything works, everyone is happy)

P.S.: if you have found a better solution, please write me.

Мониторим процессы в Ubuntu

На VPS, которым я пользуюсь для размещения блога, периодически отваливается возможность подключения по SSH, что меня жутко бесит. В ходе поиска временного решения была обнаружена статья, повествующая о том, что данную проблему можно решить с помощью программы monit. Попытка не пытка) Установка и настройка особых трудностей не вызвала. Для проверки остановил службу SSH, monit перезапустил её через пару минут, так что пока я доволен) Так же у этой тулзы есть довольно удобный web-интерфейс, который выводит информацию об отслеживаемых процессах и позволяет запускать/останавливать/перезапускать их. Дополнительные детали можно глянуть здесь.

monit_web

Запускаем JBoss AS как сервис под Windows

Любое более-менее критичное приложении должно работать в ОС в качестве сервиса. Это позволяет повысить надёжность работы данного приложения, указав ОС, что делать в случае его отказа (перезапустить приложение, перезагрузить ОС или выполнить ещё какое-нибудь безумное действие). Да и вообще так правильней:)

Исключением не стал и сервер приложений JBoss, который мы используем для наших проектов. Чтобы в случае, если он неожиданно отвалится, не пришлось лезть на сервер и запускать его вручную, оформим его в виде сервиса (в данном случае для Windows). Для это нам нужен сам JBoss и ряд библиотек, которые помогут превратить его в сервис. Скачать их можно отсюда (выбираем JBoss Native 2.0.6 Win32). После установки JBoss’а распаковываем содержимое архива с native-библиотеками в папку “JBOSS_HOMEbin”. После чего можно отредактировать содержимое файла “JBOSS_HOMEbinservice.bat”, заменив в нём версию JBoss’а на нужную (практической ценности это не несёт и влияет только на имя создаваемого сервиса). Всё. Остался последний шаг) Запускаем “JBOSS_HOMEbinservice.bat install” и радуемся новому сервису)

P.S.: в архиве с native-библиотеками лежит файл “README-service.txt”, в котором сказано, что нужно делать)

Визуализируем репозиторий

Вдохновившись статьей про программу Code Swarm, которая позволяет преобразовать многочисленные коммиты в репозиторий, сделанные бессонными ночами, в феерическое зрелище, я решил испробовать её на деле. В качестве подопытного был выбран проект cherinfo, находящийся на стадии “уже почти готово”. Ролик получился не такой красочный, как скажем у Eclipse, но, тем не менее, довольно интересно просмотреть в течение нескольких секунд то, на что было потрачено около года. Результат Вы можете наблюдать ниже) Получить этот результат отчасти помогла статья Creating your own code swarm.

А у Вас есть резюме?

“эээ… чего?” − примерно такой ответ услышала девушка из кадрового агентства, звонившая мне насчёт работы. Пообщавшись с ней и договорившись о встрече, я клятвенно пообещал принести резюме. Составлением данной бумаги я до этого никогда не занимался, поэтому полез в интернет и взял основу один из наиболее популярных шаблонов. Результат можно посмотреть на специально отведённой для этого странице.