Test
Первый тестовый пост после обновления PHP с 5.3.10 на 5.4.3 и отказа BlogTNG.
Причина: BlogTNG использует SQLite2, который выкинули из PHP 5.4.0.
Первый тестовый пост после обновления PHP с 5.3.10 на 5.4.3 и отказа BlogTNG.
Причина: BlogTNG использует SQLite2, который выкинули из PHP 5.4.0.
Не всё делается одинаково во всех компиляторах, не на всех платформах, приходится временами городить хитрые конструкции из #if/#elif/#endif. Случайно наткнулся на шпаргалку, в которой описано, какие директивы препроцессора предопределяют конкретные компиляторы: http://sourceforge.net/p/predef/wiki/Compilers/
С того же ресурса:
А так же определение порядка байтов: http://sourceforge.net/p/predef/wiki/Endianness/
Другие ссылки на эту тематику:
Отдельно по ANSI C: http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20%28ANSI%29%202.2.pdf
Цикл статей камрада Игоря Кальницкого для “самых маленький” про плюшки нового стандарта C++:
Так же стоит прочитать статью на Википедии, на удивление информативная: C++11
А как оказалось, на разделе с /tmp кончилось место, сказал об том Midnight Commander при запуске.
Надеюсь, что всё таки выберемся за пределы орбиты Земли..
Хорошее руководство: http://www.newty.de/fpt/index.html
PDF версия: http://www.newty.de/fpt/zip/e_fpt.pdf
Там же, прицепом: “Callback Implementations in C++”
Дано: контейнер примерно такого вида:
std::list< boost::weak_ptr<Item> > items;
Вместо %%boost::weak_ptr<>%% могу быть:
Задача: нужно удалить элемент по значению.
Казалось бы, просто сделай:
...
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%%
Проект новой игры от создателя Minecraft - 0x10c
Канву и основные фичи читать на сайте, отмечу только, что в игре придётся заниматься программированием 16-битного компьютера на чипе DCPU-16, спецификация чипа прилагается. Думаю, что тут можно будет проследить историю развития языков :)
Решил таки переопубликовать свою статью в OpenSource ( http://osa.samag.ru/info/OpenSource068.zip) и у себя в блоге. В журнале статья называется: “QLandKarte GT как замена OziExplorer в GNU/Linux”, здесь же публикую под оригинальным.
Как писал в позапрошлой заметке - у блога новый домен. Собственно сразу стал вопрос - а как его использовать с моим-то динамическим белым IP адресом?
hatred.homelinux.net - предоставлен DynDNS.com, вот только незадача - они сделали чуть менее, чем всё у себя платным, даже если сейчас я освобожу этот хост - обратно в бесплатном аккаунте я его не выберу.
Именно поэтому в качестве DNS хостера и динамического DNS был выбран http://dnspark.net
Как делегировать туда свой домен, что делать на nic.ru или у других регистраторов - это за пределами этой статьи, в конце концов, там всё достаточно очевидно, если нет - в комментарии с вопросами :)
Обзавёлся доменом второго уровня: HTRD.SU. Как запомнить? А достаточно просто:
Посему новый адрес блога: HTTPS://HTRD.SU
Старый адрес будет доступен ещё неопределённое время. А может и вообще останется как fail-over. Или будет использоваться для доступа домой… В общем не решил ещё :)
Что ещё планируется в ближайшем будущем:
Могу напугать некоторых, но в стародавние времена со словарями (имеется в виду - удобные программы-оболочки и сами словари) в Linux было, мягко сказать, не густо. В то время я настроил у себя дома словарный сервер dict|dictd (боле подробно на английском: dict ), сначала просто на локальном хосте, потом, когда появилось ещё парочку компьютеров и достаточно дешёвый доступ в интернет сервер стал использоваться и на них, а так же с работы.
Удобным было почти всё:
dict
- для быстрых запросовkdict
, которая, запускаясь, проверяла буфер обмена и если там что-то было - переводила его (программа проверяла запущенные копии, запускалась в одном экземпляре)Время шло, начались появляться и недостатки:
kdict
со своими удобными свойствами канула в лету (уже и не знаю - вообще она существует, но переводить из буфера обмена она как-то перестала)Пришлось искать дополнительное, оффлайн решение, желательно не менее функциональное. Благо, что при этом и прогресс не стоял на метсе, появилась чудная программа StarDict, словари для которой на ура переделывались формата dictd
да и оболочки были разнообразны:
kdict
, в частности возможности перевода содержимого буфера обмена, стоит ли говорить, что мой выбор остановился на ней? Плюс программа успешно управляется путём посылки DBus уведомлений, что и будет позже мной использовано.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
Как она работает?
Просто:
qstardict
--no-x11
, то работа начинается с консольной версией sdcv
sdict
передаются какие-то слова - пытается их перевестиxclip
и перевести его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