Обзавёлся доменом второго уровня: HTRD.SU. Как запомнить? А достаточно просто:
- Из моего ника выбрасываем все гласные буквы: HaTReD => HTRD
- Смотрим на клавиатуру: буквы образуют как бы трапецию, набираясь в одном направлении: H (влево вверх) T (влево) R (влево вниз) D
- Домен .SU просто запоминаем (да-да, я родился в Советском Союзе :)
- …
- PROFIT!
Посему новый адрес блога: HTTPS://HTRD.SU
Старый адрес будет доступен ещё неопределённое время. А может и вообще останется как fail-over. Или будет использоваться для доступа домой… В общем не решил ещё :)
Что ещё планируется в ближайшем будущем:
- переезд на более стабильную площадку
- небольшая заметка: как это всё использовать с Dynamic DNS?
Могу напугать некоторых, но в стародавние времена со словарями (имеется в виду - удобные программы-оболочки и сами словари) в 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
на горячую клавишу, когда надо, выделяю слово и жму её - смотрю перевод во всплывающем окошке.
Пользуйтесь :)
Прочитать: 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/
Так же, от того же автора: “Практическая криптография”:
Стандартная интерактивная оболочка 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
Потребовалось использовать в одном проекте данный планировщик (http://quartz-scheduler.org/). Запускается на ура в виде бина в JBoss… Но вот тут с размаху врезался лбом в косяк:
- планировщик регистрируется в JNDI
- я успешно получаю инстанс планировщика
- добавляю свои задачу со своим воркером
- …
И кряк вам с хреном, а не профит:
ClassNotFoundException…
Столкнулся с непонятной проблемой в JBoss и RESTEasy:
Когда сервис принимает или отдаёт данные в JSON формате Jackson (сериализатор/десериализатор JSON) игнорирует JAXB аннотации @XmlElement(name = "bla_bla")
вместо указанного имя поля всегда используется имя поля в классе, т.е. такое:
@XmlRootElement
class SimpleJson
{
@XmlElement(name = "my_name")
public String megaName;
}
сериализуется в это:
а не, как ожидается, в это:
А так же игнорируется @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
.
Комбинация |
Действие |
ctrl+w ctrl+w |
Переключиться на другое окно. |
ctrl+w Up/Down/Left/Right |
Переключиться на другое окно. |
do |
Получить изменения из другого окна в текущее. |
dp |
Вставить изменения из текущего окна в другое. |
]c |
Перейти к следующему изменению. |
[c |
Перейти к предыдущему изменению. |
:diffupdate |
diff update |
:syntax off |
выключить подсветку синтаксиса |
zo |
раскрыть свернутый кусок текста |
zc |
свернуть кусок текста |
На правах заметки:
В эти выходные на базе школы №53 г.Владивостока прошли зальные соревнования по технике спортивного туризма. Был в составе судейского корпуса, гудят ноги, но вцелом понравилось, особенно наведенение дистанции :)
Фотографии можно поглядеть тут: http://gfst-vl.ru/v12/v_photo2012.html
Информация по соревнованиям: http://gfst-vl.ru/v12/v12.html
Потребовалось сделать окружение для отстройки приложений для системы Linux, запущенной на платформе с процессором ARM.
Внутри есть eglibc, поэтому решено было попробовать сделать окружение с этой библиотекой Си, а не повсеместно используемой newlib.
Процесс чтения манов, проб, нервов занял около двух дней. Помогли разобраться следующие документы:
Особо поразило мозг решение проблемы “кто первый: курица или яйцо?”
В результате получился набор правил для сборки окружение под ArchLinux (пакеты идут в порядке сборки):
Ну и несколько библиотек сразу в придачу:
Набор HTTP API для управления камерами Axis: http://www.axis.com/techsup/cam_servers/dev/cam_http_api_index.php
Изначально задача была: извлечь из изображения область ограниченную полигоном, при этом оставшаяся часть изображения должна залиться “прозрачным” цветом (сиречь размер в пикселях не поменяется). Но как оказалось, можно ещё более обобщить эту задачу - вытаскивать произвольные области изображения.
Рассматриваемый инструмент - 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/
Библиотеки/рекомендации для работы с JSON.
C
C++
BOOST
Qt4
Просто прекрасно:
Почему сейчас таких фильмов нет?
Накатило, решил найти исходники этой программки. Что делает? Да просто берёт и играет mp3 файл. Чем знаменита? :) А тем, что это мой первый проигрыватель mp3 на Linux, который попался мне случайно на купленном диске во Владивостоке, во времена, когда у меня не было интернета и в своём городе-посёлке я был единственным пингвиноводом.
Source1 (на этом сайте) | Source2 | Где найдено
Никаких внешних зависимостей, исходники на чистом Си, в распакованном виде - 290Кб.
PS при сборке на современных системах нужно будет применить такой патч:
--- /home/hatred/download/tmp/mp3/amp-0.7.6/guicontrol.c 1997-08-23 22:30:51.000000000 +1100
@@ -375,7 +375,8 @@
break;
case GETHDR_SYN: warn("oops, we're out of sync.<br/>n");
break;
1. default:
+ default:
+ ;
}
break;
}
по сути, после default:
, поставить точку с запятой :simple_smile: