Hatred's Log Place

DON'T PANIC!

Mar 27, 2012 - 3 minute read -

Свой домен и динамический DNS

Как писал в позапрошлой заметке - у блога новый домен. Собственно сразу стал вопрос - а как его использовать с моим-то динамическим белым IP адресом?

hatred.homelinux.net - предоставлен DynDNS.com, вот только незадача - они сделали чуть менее, чем всё у себя платным, даже если сейчас я освобожу этот хост - обратно в бесплатном аккаунте я его не выберу.

Именно поэтому в качестве DNS хостера и динамического DNS был выбран http://dnspark.net

Как делегировать туда свой домен, что делать на nic.ru или у других регистраторов - это за пределами этой статьи, в конце концов, там всё достаточно очевидно, если нет - в комментарии с вопросами :)

Mar 26, 2012 - 1 minute read -

Новый адрес блога

Обзавёлся доменом второго уровня: HTRD.SU. Как запомнить? А достаточно просто:

  1. Из моего ника выбрасываем все гласные буквы: HaTReD => HTRD
  2. Смотрим на клавиатуру: буквы образуют как бы трапецию, набираясь в одном направлении: H (влево вверх) T (влево) R (влево вниз) D
  3. Домен .SU просто запоминаем (да-да, я родился в Советском Союзе :)
  4. PROFIT!

Посему новый адрес блога: HTTPS://HTRD.SU

Старый адрес будет доступен ещё неопределённое время. А может и вообще останется как fail-over. Или будет использоваться для доступа домой… В общем не решил ещё :)

Что ещё планируется в ближайшем будущем:

  1. переезд на более стабильную площадку
  2. небольшая заметка: как это всё использовать с Dynamic DNS?

Mar 24, 2012 - 4 minute read - linux

sdict - небольшой скрипт-оболочка для StarDict (qstardict и sdcv)

Могу напугать некоторых, но в стародавние времена со словарями (имеется в виду - удобные программы-оболочки и сами словари) в Linux было, мягко сказать, не густо. В то время я настроил у себя дома словарный сервер dict|dictd (боле подробно на английском: dict ), сначала просто на локальном хосте, потом, когда появилось ещё парочку компьютеров и достаточно дешёвый доступ в интернет сервер стал использоваться и на них, а так же с работы.

Удобным было почти всё:

  • приятная консольная программка dict - для быстрых запросов
  • возможность настроить словарную базу только в одном месте, а на остальных компьютерах указать только адрес сервера
  • прекрасная графическая программка kdict, которая, запускаясь, проверяла буфер обмена и если там что-то было - переводила его (программа проверяла запущенные копии, запускалась в одном экземпляре)

Время шло, начались появляться и недостатки:

  • много времени стало проводиться за нетбуком, да ещё в отстутствии интернета, иногда нужно было что-то быстро перевести
  • доступность домашнего сервера была явно не на высоте - и свет вырубали и связь рвалась
  • программа kdict со своими удобными свойствами канула в лету (уже и не знаю - вообще она существует, но переводить из буфера обмена она как-то перестала)

Пришлось искать дополнительное, оффлайн решение, желательно не менее функциональное. Благо, что при этом и прогресс не стоял на метсе, появилась чудная программа StarDict, словари для которой на ура переделывались формата dictd да и оболочки были разнообразны:

  • stardict - написана на Gtk+, каноническая версия
  • qstardict - оболочка на Qt4, по своими возможностям оказалась очень похожа на полюбившийся мне kdict, в частности возможности перевода содержимого буфера обмена, стоит ли говорить, что мой выбор остановился на ней? Плюс программа успешно управляется путём посылки DBus уведомлений, что и будет позже мной использовано.
  • sdcv - консольная программа для запроса перевода, по сути аналог dict

Теперь подробнее остановлюсь на qstardict, особенно на работе на переводе содержимого буфера обмена.

Тут достаточно всё просто, но специфично: в настройках говорится, следить за буфером - если там появляется новое значение, показывается всплывающее окно с переводом (или не показывается, если, допустим перевода не найдено и в настройках стоит соответствующий параметр). Можно задавать модификатор - что бы оно не реагировало на каждое выделение.

Мне показался такой вариант не очень удобным. Но не беда - благо программа может управляться по DBus, в частности, для показа этого самого всплывающего окна с переводом. Тут же вспоминаем про удобную программу xclip для работы с буфером обмена из состава Xorg, примешиваем немножно универсальности для работы из X11 или из консоли и получаем такой скрипт:

#!/bin/sh


check_prog()
{
  local res
  prog=`which $1 2> /dev/null`
  res=$?
  if [ $res -ne 0 ]; then
    echo "Can't found program: " $1
    echo "Try to install it via your package manager"
    exit 1
  fi

  echo $prog
}


check_process()
{
  pidof "$1" > /dev/null 2>&1
}


sdict_x11()
{
  local res
  qstardict=`check_prog qstardict`
  qdbus=`check_prog qdbus`
  
  check_process "$qstardict"
  res=$?
  if [ $res -ne 0 ]; then
    # for begin - start qstardict
    "$qstardict" > /dev/null 2>&1 &
    sleep 2
  fi

  "$qdbus" org.qstardict.dbus /qstardict org.qstardict.dbus.showPopup "$@"
  "$qdbus" org.qstardict.dbus /qstardict org.qstardict.dbus.showTranslation "$@"
}


sdict_console()
{
  sdcv=`check_prog sdcv`
  $sdcv -n "$@"
}

# force no X11 version
no_x11="false"
if [ "$1" = "--no-x11" ]; then
  no_x11="true"
  shift
fi

# take word from commad line or from buffer
TRANSLATE=$@
if [ -z "$1" ]; then
  xclip=`check_prog xclip`
  TRANSLATE="`$xclip -o`"
fi

# run translation
if [ -z "$DISPLAY" -o "$no_x11" = "true" ]; then
  sdict_console "$TRANSLATE"
  exit $?
else
  sdict_x11 "$TRANSLATE"
  exit $?
fi

Как она работает?

Просто:

  • при запуске проверяет, что установлена переменная DISPLAY и начинает работать с qstardict
  • если переменная DISPLAY не задана, или первым аргументов в командной строке стоит --no-x11, то работа начинается с консольной версией sdcv
  • если в качестве аргументов sdict передаются какие-то слова - пытается их перевести
  • если список аргументов пуст - пытается получить содержимое буфера обмена при помощи xclip и перевести его
  • перед посылкой сообщения по DBus, проверяет, что qstardict запущен, если нет - то запускает его, ждёт 2 секунды и пытается вызвать его для перевода (тут может быть скрыт подводный камень: у нас на работе есть терминальный сервер на Linux, и графических сессий там может быть много, соответственно у каждого пользователя может быть запущена своя версия qstardict, тут проверка запущенности qstardict может отработать некорретно - исправляется легко, но для себя пока не вижу необходимости, поэтому просто информирую)
  • перед запросом команд xclip, qdbus, qstardict, sdcv производится проверка наличия их в пути поиска переменной окружения $PATH, если не находится - программа выдаёт сообщение об их отсутствии на стандартный вывод и завершает свою работу со статусом 1. Обычно эти программы есть почти в каждом дистрибутиве Linux в одноимённом пакете, в случае ArchLinux:

^ Команда ^ Пакет ^ Команда для устрановки ^ Примечание ^ | xclip | xclip | pacman -S xclip | | | qdbus | qt | pacman -S qt | поставится как зависимость при установке qstardict | | qstardict | qstardict | pacman -S qstardict | | | sdcv | sdcv | pacman -S sdcv | |

Собственно всё, после чего повесил у себя в XFCE4 вызов sdict на горячую клавишу, когда надо, выделяю слово и жму её - смотрю перевод во всплывающем окошке.

Пользуйтесь :)

Mar 23, 2012 - 1 minute read -

TODO: Прикладная криптография

Прочитать: http://www.ssl.stu.neva.ru/psw/crypto/appl_rus/appl_cryp.htm
Одним файлом тут: http://files.zipsites.ru/books/cryptoshn.pdf
или у меня: cryptoshn.pdf

На ozon.ru: http://www.ozon.ru/context/detail/id/1135241/ (на момент публикации - нет в наличии)

Обзор в “Компьютерре”: http://www.computerra.ru/offline/2002/462/20458/

Так же, от того же автора: “Практическая криптография”:

Mar 22, 2012 - 1 minute read - linux

Интерактивный tclsh и readline

Стандартная интерактивная оболочка tclsh обладает крайне неприятной особенностью по работе с пользовательским вводом.

На данный момент нашёл такой пакет: tclreadline

Для пользователей ArchLinux в AUR лежит пакет, но он вряд ли соберётся на x86_64 архитектуре, да и другие недочёты есть. В общем, откорректировал немного: http://dl.dropbox.com/u/14324405/tclsh/tclreadline-2.1.0-6.src.tar.gz

Теперь собираем, ставим, прописываем в ~/.tclshrc примерно следующее:

if {$tcl_interactive} {
	  package require tclreadline
	    ::tclreadline::Loop
}

За подробностями в man’ы и на сайта разработчика, к примеру, более увесистый конфиг: http://tclreadline.sourceforge.net/sample.tclshrc

Так же следует не забывать пользоваться командой man: man tclreadline

Примерно так будет выглядеть tclsh после установки:

Пользуясь случаем, хочу так же упомянуть и графическую tcl-консоль: tkcon, для неё же есть и рабочий PKGBUILD в AUR: https://aur.archlinux.org/packages.php?ID=6881

Mar 21, 2012 - 3 minute read - programming

Quartz Scheduler

Потребовалось использовать в одном проекте данный планировщик ( http://quartz-scheduler.org/). Запускается на ура в виде бина в JBoss… Но вот тут с размаху врезался лбом в косяк:

  1. планировщик регистрируется в JNDI
  2. я успешно получаю инстанс планировщика
  3. добавляю свои задачу со своим воркером

И кряк вам с хреном, а не профит: ClassNotFoundException…

Mar 21, 2012 - 2 minute read - programming

RESTEasy, JAXB, XML, JSON и другие

Столкнулся с непонятной проблемой в JBoss и RESTEasy:

Когда сервис принимает или отдаёт данные в JSON формате Jackson (сериализатор/десериализатор JSON) игнорирует JAXB аннотации @XmlElement(name = "bla_bla") вместо указанного имя поля всегда используется имя поля в классе, т.е. такое:

@XmlRootElement
class SimpleJson
{
  @XmlElement(name = "my_name")
  public String megaName;
}

сериализуется в это:

{
  "megaName" : ""
}

а не, как ожидается, в это:

{
  "my_name" : ""
}

А так же игнорируется @XmlJavaTypeAdapter, что есть пичалька.

Тут по ходу сочинения заметки пришло в голову, что Джексон не настроен использовать JaxbAnnotationIntrospector - повод рассмотреть.

Пока же использую work-around, в виде дополнительного навешивания Jackson-аннотаций вроде:

@XmlRootElement
class SimpleJson
{
  @XmlElement(name = "my_name")
  @XmlJavaTypeAdapter(Iso8601DateAdapter.class)
  @JsonProperty(value = "my_name")
  @JsonSerialize(using = JsonIso8601DateSeializer.class)
  @JsonDeserialize(using = JsonIso8601DateDeserializer.class)
  public Date megaName;
}

Подкатом, бонусом, классы Iso8601DateAdapter, JsonIso8601DateSeializer, JsonIso8601DateDeserializer.

Mar 21, 2012 - 1 minute read - linux

Клавитурные сокращения в vimdiff

Комбинация Действие
ctrl+w ctrl+w Переключиться на другое окно.
ctrl+w Up/Down/Left/Right Переключиться на другое окно.
do Получить изменения из другого окна в текущее.
dp Вставить изменения из текущего окна в другое.
]c Перейти к следующему изменению.
[c Перейти к предыдущему изменению.
:diffupdate diff update
:syntax off выключить подсветку синтаксиса
zo раскрыть свернутый кусок текста
zc свернуть кусок текста

Feb 27, 2012 - 1 minute read - life туризм

Соревнования по технике спортивного туризма "Вызов 2012"

В эти выходные на базе школы №53 г.Владивостока прошли зальные соревнования по технике спортивного туризма. Был в составе судейского корпуса, гудят ноги, но вцелом понравилось, особенно наведенение дистанции :)

Фотографии можно поглядеть тут: http://gfst-vl.ru/v12/v_photo2012.html

Информация по соревнованиям: http://gfst-vl.ru/v12/v12.html

Feb 24, 2012 - 1 minute read - linux

Набор для кросс-компиляции для Linux на ARM

Потребовалось сделать окружение для отстройки приложений для системы Linux, запущенной на платформе с процессором ARM.

Внутри есть eglibc, поэтому решено было попробовать сделать окружение с этой библиотекой Си, а не повсеместно используемой newlib.

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

Особо поразило мозг решение проблемы “кто первый: курица или яйцо?”

В результате получился набор правил для сборки окружение под ArchLinux (пакеты идут в порядке сборки):

Ну и несколько библиотек сразу в придачу:

Feb 16, 2012 - 1 minute read -

ImageMagick: вырезание произвольной области изображения

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

Рассматриваемый инструмент - ImageMagick или GraphicsMagick.

Решение нашлось тут: http://studio.imagemagick.org/pipermail/magick-users/2006-March/017281.html

Коротко суть: на основе исходного изображения (по сути используется только, что бы задать размеры) создаётся временное изображение-маска и нарисованной фигурой/фигурами которые образуются, если их обрисовать полигоном. Остальные пиксели на маске - прозрачные. Далее маска накладывается на исходное изображение и извлекается только нужная его часть…

Теперь на примере.

Есть изображение:

Нужно вырезать область, заданную полигоном (для простоты - треугольник) с координатами: (10,10)-(400,200)-(100,200)

Шаг 1. Делаем маску:

convert screenshot.png -matte -fill none -draw 'color 0,0 reset' -fill white -draw 'polygon 10,10,400,200,100,200' polygon.png

Получаем следующее (картинка белая :simple_smile: ):

Шаг 2. Вырезаем область:

convert screenshot.png -matte polygon.png -compose DstIn -composite out.png

Получаем чего желаем:

Команды рисования можно посмотреть тут: http://www.imagemagick.org/Usage/draw/