Hatred's Log Place

DON'T PANIC!

Apr 17, 2012 - 1 minute read - programming c++

Цикл статей "Введение в C++11"

Цикл статей камрада Игоря Кальницкого для “самых маленький” про плюшки нового стандарта C++:

  1. Введение в C++11: auto, decltype, nested templates и range-based-for
  2. Введение в C++11: nullptr и нововведения в системе инициализации
  3. Введение в C++11: лямбда функции
  4. Введение в C++11: умные указатели
  5. Введение в C++11: новые спецификаторы
  6. Введение в C++11: пользовательские литералы

Так же стоит прочитать статью на Википедии, на удивление информативная: C++11

Apr 16, 2012 - 1 minute read -

BgBilling 5.2 - ошибка

А как оказалось, на разделе с /tmp кончилось место, сказал об том Midnight Commander при запуске.

Apr 11, 2012 - 1 minute read - programming c++

Удаление weak_ptr из std::list

Дано: контейнер примерно такого вида:

std::list< boost::weak_ptr<Item> > items;

Вместо %%boost::weak_ptr<>%% могу быть:

  • %%std::tr1::weak_ptr<>%%
  • %%std::weak_ptr<>%% для C++11

Задача: нужно удалить элемент по значению.

Казалось бы, просто сделай:

...
items.remove(value);
...

ан нет: для %%weak_ptr<>%% не определён оператор сравнения. Если потеоретизировать, можно предположить, почему так сделано: что бы гарантировать консистентность указателей при сравнении нужно их захватить (сделать %%value.lock()%%), т.е. создать два %%shared_ptr%% и уже их сравнивать, т.е. лишние накладные расходы.

Поэтому удаление можно делать так:

template <typename T>
bool operator == (const boost::weak_ptr<T>& a, const boost::weak_ptr<T>& b)
{
    return a.lock() == b.lock();
}

после такого %%std::list::remove(const T&)%% будет работать для всех типов. Можно и сузить до конкретного.

Либо использовать %%std::list::remove_if(Predicate)%%, предикат объявить как:

struct EqPredicate
{
    const boost::weak_ptr<Item>& item;

    EqPredicate(const boost::weak_ptr<Item>& item)
        : item(item)
    {
    }

    bool operator () (const boost::weak_ptr<Item>& p) const
    {
         return p.lock() == item.lock();
    }
};

и использовать так:

std::list< boost::weak_ptr<Item> > items;
...
items.remove_if(EqPredicate(value));

Информация взята отсюда: http://stackoverflow.com/questions/1390340/how-can-i-use-stdremove-on-a-container-with-stdtr1weak-ptr

Вышесказанное верно для %%boost::weak_ptr%%, %%std::tr1::weak_ptr%%, %%std::weak_ptr%%

Apr 5, 2012 - 1 minute read -

0x10c - Hard Science Fiction

Проект новой игры от создателя Minecraft - 0x10c

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

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 свернуть кусок текста