Hatred's Log Place

DON'T PANIC!

Feb 18, 2010 - 3 minute read - programming

./configure для qmake-based проектов

./configure для qmake-based проектов

Что бы очень не заморачиваться с формированием ./configure скрипта (и configure.exe программы для windows) при помощи autotools, когда вся их мощь не очень нужна, поможет проект qconf

Для Арчеводов, можно собрать из AUR svn версию: http://aur.archlinux.org/packages.php?ID=18686

Далее, на правах вольного пересказа английского README.

Intro

Итак, собираем, устанавливаем. Далее идем в корень вашего проекта, где лежит qmake файл, cоздаем там, для примера, файл myproject.qc примерно следующего содержания (это xml файл):

<qconf>
  <name>myproject</name>
  <profile>myproject.pro</profile>
</qconf>

дале пускаем: qconf myproject.qc

На выходе получаем скрипт ./confugure с функционалом, в базовой части соответствующей autotools.

Если запустить без аргумента, будет выбран первый найденный .qc файл, если их найдено не будет - автоматически будет выбран первый .pro файл, и на основе его собран минимальный .qc файл (как в примере выше).

На целевой машине qconf не нужен (нужные только его модули конфигурации, но логично распространять их с самим проектом), нужен только разработчику.

Итак, на этот момент мы имеем готовый ./configure скрипт, который запускаем без параметров или смотрим ./configure --help.

Как это работает

После запуска ./configure, будет сформирован файл conf.pri, в котором будут содержаться различные переменные, отвечающие за сборку, основные из которых:

  • PREFIX
  • BINDIR
  • LIBDIR
  • QTDIR

Этот файл вы можете включать в ваш .pro файл: include(conf.pri)

Т.е. обобщая, как это работает: qconf формирует, на основе .qc файла, скрипт ./configure, который, будучи запущенным, выполняет нужные вам проверки, создает conf.pri, запускает qmake для вашего .pro файла, который (как я выше написал) может включать conf.pri файл (соответственно, все что будет записано в conf.pri - будет доступно для qmake).

Возможные директивы для .qc файла

  • <name>NAME</name> - имя проекта
  • <profile>FILE.pro</profile> - .pro файл проекта
  • <dep>...</dep> - описываем зависимости, проверка на которые будет проводиться:```xml
    * `"type"` - определяет модуль (примеры модулей идут вместе с qconf, правда только два: qt31.qcm и qt41.qcm). Если type задана как **pkg**, проверка происходит при помощи pkg-config (выводы --libs и --cflags будут добавлены при компиляции):
     * опрашивается параметры:
       * `"name"`
       * `"pkgname"`
       * `"version"` в которой могут содержаться знаки отношения: ">=", "<=", иначе принимается "="
    * `<required />` - определяет обязательность зависимости
    * `<disabled />` - зависимость выключена
    
  • <arg>DESRIPTION</arg> - дополнительные агрументы для скрипта ./configure, сам аргумент будет доступен через переменную окружения QC_NAME (большими буквами, можно достучаться в модулях проверки через getenv), включают атрибуты:
    • "name" - имя
    • "arg" - значение
  • <lib /> - включает режима, когда собираемый проект - библиотека
    • <static /> - в случае, если <lib />, собирать статическую библиотеку
  • <noprefix /> - очищает PREFIX
  • <nobindir /> - очищает BINDIR
  • <prefix>PATH</prefix> - задаем PREFIX (по умолчанию: /usr/local)
  • <bindir>PATH</bindir> - задаем BINDIR (по умолчанию: PREFIX/bin)
  • <incdir>PATH</incdir> - задаем INCDIR (по умолчанию: PREFIX/include)
  • <libdir>PATH</libdir> - задаем LIBDIR (по умолчанию: PREFIX/lib)
  • <datadir>PATH</datadir> - задаем DATADIR (по умолчанию: PREFIX/share)
  • <qtdir>PATH</qtdir> - задаем QTDIR
  • <moddir>PATH</moddir> - добавляет пути поиска модулей для
  • <qt3 /> - конфигурация для qt3 окружения (но сама qconf зависит от qt>=4.1, используйте версию 1.1 для qt3)

Да, пример где используется - psi, там же, в директории qcm можно найти очень много приятных модулей проверки.

Ну и да, это всего лишь помощь к qmake, но не замена. Его тоже настраивать нужно. И читать руководства по нему.

PS пока очень сумбурно, потому как, сейчас сам только с ним столкнулся, потом будет дополняться, уточняться.

Feb 13, 2010 - 1 minute read -

Бортовой журнал переехал на главную

Т.к. основная ценность данного ресурса - это мои бредни, поэтому они заслуженно переезжают на главную страницу, тут же новости и прочая периодика.

Информация о ресурсе переехала на страницу “О ресурсе”, и приобрела чуть более линейный вид.

За сим - всё.

Feb 11, 2010 - 4 minute read - programming

Qt Creator и автоматическое создание реализации метода/прототипа

UPD: Информация больше не актуальна, теперь подобные средства кодогенерации встроены в Qt Creator.

Долгое время пользовался для написание программ, с использованием Qt4 интегрированную среду разработки QDevelop, и хотя она почти всем устраивает, за несколькими исключениями:

  • непонятно работает автодополнение
  • на 500 строках и больше начинает ощутимо поддтормаживать

Feb 5, 2010 - 1 minute read -

Medit из mercurial

Текущая версия замечательного редактора tags:medit?do=showtag&tag=medit|medit это 0.9.4 и она не обновлялась больше года. Решил собрать и попробовать сборку из mercurial, благо, смотря на даты последних изменений можно заметить, что работа ведется:

http://bitbucket.org/muntyan/moo/

Не все гладко - несколько переработан интерфейс, некоторые ошибки так и не исправлены (типа стоит галочка “переносить текст”, а он не переносится, а если убрать - будет переноситься).

Кроме того, сменили систему сборки на cmake, в результате не все доделали, и пришлось сделать два патча и один work-around для того, что бы пакет собрался вообще и с ctags, в частности. Кроме того, правила cmake пока не докрутили для python-plugin, в результате ни консоли питона, ни питоновских команд для пользовательских утилит. Хотя меня не это больше смущает - на питоне сделан терминал был, удобная, иногда, штука.

По питону, есть бага: http://sourceforge.net/tracker/?func=detail&aid=2929703&group_id=167563&atid=843451 будемс следить.

В общем, в результате изысканий, сделал правило для сборки и поместил в AUR: http://aur.archlinux.org/packages.php?ID=34336 там же необходимые патчи, хотя они тривиальны.

Да, рекомендую ознакомиться со справкой к программе, там вы найдете, в частности, как управлять поведением редактора на разных файлах (типа установить ширину отступа и кодировку, делается в манере, схожей с vim)

Feb 2, 2010 - 1 minute read - programming

C/C++ Coding Style

Наконец дошли руки оформить и свои устоявшиеся привычки кодирования, разложить по полочкам и свести к единому результату, а то читая свои творения некоторые, потом долго приходится волосы приглаживать.

В общем вот: /C/C++ Coding Style

По ходу будет дополняться.

Jan 30, 2010 - 2 minute read -

Толи лыжи не едут...

В общем, сегодня выбрался наконец попробовать свои деревяшки в район бот-сада. Понял что нужно, однако, учиться :laughing:

Первое что понял - крепление полная опа. Нога ходит и болтается как г в проруби. Для этих лыж нужно резиновую подкладку ложить, иначе… ну не знаю, одни мучения. В общем попробую, если не поможет - буду вообще переосмысливать.

Далее, вообще не понял как идти в подъем %-) ну качусь назад и все, или мазь нужно было положить потеплее, и что с собой её не взял, хотя была положена -2 – -8. На одном подъемчике ноги так разъехались, почти шпагат вышел, мышцу потянул :)

На ровной местности идти нормально, отдачи нет, когда накатал лыжню даже легкими толчками катиться получается, вот тут прикольно, нужно немного потренироваться и разобраться.

Спуск… Да, сначала нужно тормозить научиться и лыжи закапываться и все, ну да, спускался по целине, учился не на лыжне. И вообще поворачивать в движении, а то я тормозить только падением освоился, благо снег мягкий.

Подвели мои трекинговы палки, которые хотел подъюзать вместо лыжных, что-то там поломалось уже и теперь они не фиксируются, а ведь даже года не отходили и походов-то было раз два и обчелся. Как лыжную палку пришлось использоваться обычную палку.

Но позитив есть, хоть и не очень много :) Спасли так же бахилы, когда с лыж слезать приходилось - снега по колено, ноги не промокли, хотя подтаивало.

И на заметку: http://www.sportfamily.ru/podrostok/sky

Jan 26, 2010 - 2 minute read - linux

Настройка сетевого сканирования

Таска возникла на работе, ничего сложного и по интернетам наверное есть, заметка для себя.

Для Xerox/Samsung МФУ и сканеров рекомендую поставить sane версии не ниже 1.0.20, т.к. там появилась нативная поддержка этих девайсов, в замен глючному Unified Linux Drivers (ULD).

Серверные настройки

Сервер - тот к кому подключен сканер

  1. в /etc/sane.d/dll.conf убираем строки добавленные при установке ULD, обычно содержат в себе слово mfp, добавляем строчку: xerox_mfp
  2. в /etc/sane.d/saned.conf прописываем адреса для которых разрешено сканирование, например, для все сети:192.168.13.0/24
  3. в /etc/xinetd.d/saned disable = yes заменяем на disable = no. Возможно сдесь же, придется исправить группу и пользователя от которого будет стартовать сервер saned.
  4. рестартуем xinetd

Или запускаем saned как сервер. Вот кстати полный конфиг для /etc/xinetd.d/saned:

service sane-port
{
	disable			= no
        port        	= 6566
	socket_type 	= stream
        wait        	= no
	groups			= yes
	user        	= saned
	group       	= users
	server      	= /usr/sbin/saned
}

Клиентская часть

Клиенты - те, с которых будет производиться сканирование.

Тут настройка проста, в /etc/sane.d/net.conf прописать адрес или адреса хостов, к которым подключены сканеры, можно задать таймаут опроса.

Дополнительно

На некоторых системах потребуется монтирование usbfs, что бы организовать правильный доступ к устройству пользователей, на работе в Мандриве это: none /dev/bus/usb usbfs auto,busgid=100,busmode=0775,devgid=100,devmode=0664 0 0

У меня на ArchLinux: none /proc/bus/usb usbfs auto,busgid=108,busmode=0775,devgid=108,devmode=0664 0 0 группа для vbox :wink: ну а так, почти не отличается

ID групп и пользователя и права задаёте те, которые у вам нужны.

далее сканирование происходит как обычно - запускаем scanimage или xsane, если найдено несколько сканеров - будет предложено выбрать, если что-то не работает смотрим логи и права доступа - предварительно настраиваем сканер для локальной печати, благо это, в случае поддержки устройства, делается очень просто.

Jan 26, 2010 - 2 minute read -

Пара исправлений для FBReader

С давних пор пользуюсь для чтения электронных книг замечательной программкой FBReader. Особо мне нравилось то, что он мог на основе параметров пользователя оформлять книги, которые находятся в простом TXT файле.

Например, люди, которые делают OCR могут использовать следующие способы для выделения абзацев:

  • длинные строки, новый абзац с новой строки - такое правда встречается редко
  • в начале обзаца строка имеет отступ а 1-2-3 и т.д. пробелов или табуляций
  • абзацы разделены пустой строкой Второй и третий случай - наиболее частые, а сам текст обычно выравнен на 80 символов, что бы можно было читать в DOS-терминале

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

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

Конечно, данные критерии не покрывают абсолютно все случаи, но большинство - это точно.

Теперь о проблеме: в какой-то момент поломалось форматирование TXT файлов, с разделением абзацев по отступу первой строки, проявлялось так:

Отступ имела первая строка азбаца, после чего азцаз закрывался и вторая строка абзаца так же печаталась с новой строки с отступом, и это очень сильно резало глаза.

Сегодня дошли руки покопаться в исходниках, благодаря ну очень внятной структуре, разобраться много времени не заняло, да и исправления можно сказать косметические, вот патч:

--- ./fbreader/src/formats/txt/TxtBookReader.cpp.orig	2010-01-26 01:33:14.083167173 +1000
@@ -27,7 +27,8 @@
 
 void TxtBookReader::internalEndParagraph() {
 	if (!myLastLineIsEmpty) {
1. 	myLineFeedCounter = 0;
+		myLineFeedCounter = -1; /* Fixed by Hatred: zero value was break LINE INDENT formater -
+		                           second line print with indent like new paragraf */
 	}
 	myLastLineIsEmpty = true;
 	endParagraph();
@@ -76,7 +77,9 @@
 		((myFormat.breakType() & PlainTextFormat::BREAK_PARAGRAPH_AT_EMPTY_LINE) && (myLineFeedCounter > 0));
 
 	if (myFormat.createContentsTable()) {
1. 	if (!myInsideContentsParagraph && (myLineFeedCounter == myFormat.emptyLinesBeforeNewSection() + 1)) {
+	    /* Fixed by Hatred: remove '+ 1' for emptyLinesBeforeNewSection, it looks like very strange
+	       when we should point count of empty string decrised by 1 in settings dialog */
+		if (!myInsideContentsParagraph && (myLineFeedCounter == myFormat.emptyLinesBeforeNewSection())) {
 			myInsideContentsParagraph = true;
 			internalEndParagraph();
 			insertEndOfSectionParagraph();

Или альтернативная ссылка: http://codepad.org/GO5GIN7Y

Сейчас попробуем запостить разработчикам.

UPD: собственно: http://groups.google.com/group/fbreader/browse_thread/thread/a0f77eb79add8571?hl=en

Jan 25, 2010 - 3 minute read -

Аналогии

Когда объяснял процесс монтирования сменных накопителей в nix (читая курсы в ПИППКРО), родилась аналогия про прививу к дереву черенка и организации одного большого дерева (черенок это наш сменный носитель, флешка, CD/DVD и т.д.). Там же родилась юморная аналогия про один корень в nix и несколько корней в win - в nix у нас могучий дуб, а в win - несколько кустиков.

На прошедшем семинаре в коллекцию аналогий попала ещё одна, предложил камрад ad_user. Но для начала скучное техническое объяснение.

Все знают, что на большинстве IBM PC совместимых компах (какая архаика), нам на жестких дисках досталась таблица разделов, которая хранится в MBR (Master Boot Record). Сама MBR находится в первом секторе жесткого диска (в общем случае, можно подставить: flash, floppy & etc), и имеет размер 512 байт. В эти 512 байт нужно было запихнуть код загрузчика, сигнатуру, а на таблицу разделов выделил 64 байта, по 16 байт на раздел (тип раздела, его расположение)… Уже поняли? На первых PC на жеском диске можно было иметь всего 4 раздела (или диска C, D, E, F). После POST_(аппаратное_обеспечение)|POST процедур PC BIOS передает управление коду загрузчика в MBR. Именно поэтому, если хотим откзаться от MBR, нужно отказываться и от PC BIOS (как сделано в маках: EFI (Extensible Firmware Interface, вместо BIOS) + Таблица_разделов_GUID|GPT (GUID Partition Table))

Через некоторое время оказалось, что этого не достаточно, для некоторых задач требовалось делить жесткий диск больше чем на 4 раздела… А что делать - железа было уже очень много, а PC славится обратной совместимостью (когда-то это тру, когда-то - нет), исправить просто так формат - не получится… Тогда придумали совместимый алгоритм, так называемый Extended_Boot_Record|EBR (Extended Boot Record).

Что из себя представляет. В описании раздела в MBR есть поле - типа раздела, договорились, если вписать туда 0x05, это будет типом расширенного раздела, а в полях адреса, будет указан адрес EBR, в которой содержится: указатель на раздел, указатель на следующую табличку EBR и сигнатура (такая же как у MBR). На самом деле там больше полей, но часть просто не используется.

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

Условно принимают что расширенный раздел один, и остальные диски располагаются в нем, это не верно, но для восприятия в большинстве случаем - достаточно. Т.е. в общем случае у нас может быть 3 primary раздела и 1 extended, двух расширенных разделов в MBR быть не может. Стандарт. В Extended - сколько нужно logical разделов.

Ничего непонятно? :) теперь время аналогия:

у нас есть удлинитель на 4 розетки, если мы подключим туда 4 потребителя (создадим 4 primary раздела), мы больше потребителей подключить не сможем (в случае дисков - уменьшить размер существующего раздела и создать в освободившемся месте новый), а если мы сделаем так: подключим 3 потребителя, а 4е гнездо, подключим удлинитель на 2 розетки - в одну подключаем потребителя (кофеварку), а во вторую, ещё один такой удлинитель… и так пока мощности хватит :)

в общем, как-то так :)

PS да, в случае nix, нумерация primary разделов 1-4, а extended - от 5, так что не удивляйтесь, если у вас будут3 primary раздела 1, 2, 3 и сразу 5 (первый раздел в расширенном разделе).

Jan 24, 2010 - 1 minute read -

Флибуста

Или полное название: Книжное братство Флибуста - добротная сетевая библиотека, книжки в fb2 и доступны для чтения онлайн.

А фрегат на фоне волны из страницы книги на логотипе наводит мысль на происхождение название ресурса от слова - флибустьеры… как-то даже приятно)

Собственно что это я, спасибо mountain-diu за наводку, и вот собственно сам сайт: http://flibusta.net/

PS Таня, если читаешь, думаю тебе понравится )