Карты со вкусом Яндекса

Во время работы над очередным проектом столкнулся с непреодолимым желанием заменить имеющуюся карту (надо сказать не лучшего качества) на странице “Контакты” на что-то более интересное и интерактивное) На ум пришли Google.Maps и Яндекс.Карты. Выбор в пользу последних был сделан в силу того, что нужный участок нашей планетки был отрисован там гораздо подробней, чем у Google:

Череповец с точки зрения Google Maps

cherepovets_google_maps
Череповец с точки зрения Яндекс.Карт

cherepovets_yandex_maps
Гы) Как говорится, почувствуйте разницу)

Итак, выбор сделан. Что дальше? Идём вот сюда. Нужен ключ? Ок) Заполняем простенькую форму, где только и требуется, что указать адрес сайта. Причём сделать это надо правильно. Вместе с ключом выводится также несложный примерчик с подробными комментариями, аля “Hello world”:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Примеры. Простой вызов карты.</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="http://api-maps.yandex.ru/1.1/index.xml?key=XXXYYYZZZ" type="text/javascript"></script>
        <script type="text/javascript">
            // Создание обработчика для события window.onLoad
            YMaps.jQuery(function () {
                // Создание экземпляра карты и его привязка к созданному контейнеру
                var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);
 
                // Установка для карты ее центра и масштаба
                map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 10);
            })
        </script>
    </head>
 
    <body>
        <div id="YMapsID" style="width:600px;height:400px"></div>
    </body>
</html>

Так как меня интересовала именно интерактивная карта, то мне подошёл JavaScript API. Лезем в примеры, где сразу находим всё, что нужно) Также порадовал подробный “Справочник по программному интерфейсу“, где расписано, что куда и как надо передавать. Пришлось немного помучатся с масштабом и размером всплывающего balloon’а, но в итоге всё стало выглядеть так как надо. Ура! Получилась вот такая загагулина:

my_yandex_maps

<div id="YandexMap" style="width : 420px; height : 350px; float: right; border: 1px solid gray;"></div>
 
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=XXXYYYZZZ" type="text/javascript"></script>
 
<script type="text/javascript" charset="utf-8">
    YMaps.jQuery(function () {
        var
        map = new YMaps.Map(YMaps.jQuery("#YandexMap").get(0)),
        geoPoint = new YMaps.GeoPoint(37.928155, 59.122003);
 
        map.setCenter(geoPoint, 16);
        map.openBalloon(
            geoPoint,
            'XXXYYYZZZ',
            { hasCloseButton : false, maxWidth : 180 }
        );
        map.addControl(new YMaps.Zoom());
    });
</script>

Вообщем, я доволен)

Redirect to “No IE6 page”

Many online services have stopped supporting Internet Explorer 6 and when a user tries to access them with the browser sent him to the information page, where the offer to upgrade IE to latest version or choose another browser. Here is my easiest solution for this:

<html>
    <head>
        <!--[if lt IE 7]>
            <script type="text/javascript" charset="utf-8">
                window.location = 'location_of_your_no_ie6_page';
            </script>
        <![endif]-->
        ...
    </head>
    ...
</html>

It used nothing, but IE conditional comments, so it’s very compact and fast ’cause every browser except IE6 and lower just ignores this code.

Багаж знаний

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

my_books_small

Особо стоит отметить трёхтомник Кнута и книгу по C++ Страуструпа)

Таиланд. Мечты сбываются!

Ура! Мне с семьёй снова посчастливилось побывать за границей) На этот раз в Таиланде. Стране, где растут кокосы и ананасы, живут слоны и тигры, и солнце светит круглый год. Старался расписывать всё как можно подробнее) Итак, начнём по-порядку.

Continue reading

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.

Backup мобильника

После знакомство со статьёй “Это сделает вас мобильнее” моё внимание привлёк сервис “Mobical“, который судя по описанию, позволял сохранить информацию с мобильного телефона. Заманчиво, подумал я, и полез смотреть: чего же там есть? Перво-наперво заглянул в раздел “Certified devices”, где без труда нашёл свой телефон. Уже неплохо, можно двигаться дальше. Смотрим раздел “What you need” и видим, что для того, чтобы успешно воспользоваться сервисом необходимо:

  1. мобильный с клиентом SyncML (первый раз узнал, что такой вообще есть, но раз телефон сертифицирован, значит, эта штука в нём есть);
  2. чтобы в телефоне было настроено Интернет подключение (благо у меня это уже было сделано).

Идём в регистрацию и заполняем несложную форму. Однако, так как я честно указал в качестве города Москву (ибо ничего ближе не было), после отправки формы получил сообщение, что мол, извините, но мы с такими странами не сотрудничаем) Не сотрудничаете, так и фиг с вами. Выбираем “US” и всё идёт как по маслу.

Настраиваем свой телефон для синхронизации с помощью простого мастера и вуаля — все данные с телефона (разумеется, которые телефон в состоянии отдать) доступны on-line, и их всегда можно синхронизировать. Имхо, весьма удобно.

mobical-1 mobical-2

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

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

monit_web

Кружка с сюрпризом

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

funny_mug_1 funny_mug_2

Однако при ближайшем рассмотрении в кружке были обнаружены нехарактерные для данного предмета “элементы”:

funny_mug_3

Сам я из этого девайса, что-либо пить не рискнул, но при случае налью кому-нибудь чаю в эту модную кружку)

P.S.: кружки-девочки в магазине не было. Хотя мне даже страшно представить, как бы она выглядела)

Запускаем 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”, в котором сказано, что нужно делать)