Hatred's Log Place

DON'T PANIC!

Mar 27, 2012 - 3 minute read - Comments -

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

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

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

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

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

Mar 26, 2012 - 1 minute read - Comments -

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

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

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

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

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

Mar 24, 2012 - 4 minute read - Comments - 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 - Comments -

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

Прочитать: http://www.ssl.stu.neva.ru/psw/crypto/appl_rus/appl_cryp.htm

Одним файлом тут: http://files.zipsites.ru/books/cryptoshn.pdf

или у меня:

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

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

Так же, от того же автора: “Практическая криптография”: * DJVU: http://www.kodges.ru/2007/12/15/prakticheskaja-kriptografija.html * OZON: * http://www.ozon.ru/context/detail/id/2153578/ (нет в наличии) * http://www.ozon.ru/context/detail/id/4884079/ (нет в наличии)

Mar 22, 2012 - 1 minute read - Comments - 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 - Comments - programming

Quartz Scheduler

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

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

Mar 21, 2012 - 2 minute read - Comments - 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 - Comments - 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 - Comments - life туризм

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

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

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

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

Feb 24, 2012 - 1 minute read - Comments - linux

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

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

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

Процесс чтения манов, проб, нервов занял около двух дней. Помогли разобраться следующие документы: * http://www.eglibc.org/cgi-bin/viewvc.cgi/trunk/libc/EGLIBC.cross-building?view=markup - официальное руководство по кросс-компиляции eglibc * http://www.pgroup.com/userforum/viewtopic.php?t=1636 - помогло разобраться в одной ошибке * http://gcc.gnu.org/install/configure.html - изучение секции Cross-Compiler-Specific Options в частности на предмет опций --with-sysroot и --with-build-sysroot

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

В результате получился набор правил для сборки окружение под ArchLinux (пакеты идут в порядке сборки): * arm-linux-gnueabi-binutils * arm-linux-gnueabi-linux-api-headers * arm-linux-gnueabi-gcc-stage1 - первый кросс-компилятор для отстройки базовых компонент стандартной библиотеки * arm-linux-gnueabi-eglibc-headers - базовый набор стандартной библиотеки - только заголовочные файлы и несколько стабов. Ещё не пригодна для линковки. * arm-linux-gnueabi-gcc-stage2 - компилятор уже пригодный для отстройки стандартной библиотеки * arm-linux-gnueabi-eglibc - готовая стандартная библиотека Си * arm-linux-gnueabi-gcc - компиляторы Си и Си++

Ну и несколько библиотек сразу в придачу: * arm-linux-gnueabi-zlib-static * arm-linux-gnueabi-bzlib-static * arm-linux-gnueabi-boost

Feb 16, 2012 - 1 minute read - Comments -

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/