08 нояб. 2012 г.

Ubuntu - Optimus < 0

Если бы не сегодняшнее горе, то я бы не написал этот блог пост. Проблема возникла в том, что после установки очередной порции обновлений, и, кажется, пакета linux-image-3.5.0.18 что-то там, я сломал свой линукс до неузнаваемости. Оказалось, что пропали драйвера от пакета nvidia-current, и в общем всё нахрен сломалось. Побаловавшись с тем, что вроде бы работало, я сломал свои иксы напрочь и даже чудом лишился файла xorg.conf.

Потерев все ppa, удалив все где упоминались слова типа nvidia и bumblebee, я вернул систему в божеский вид и запустил драйвера nouveau. Отлично, полёт нормальный, но мне захотелось вернуть свою CUDA назад. Что я для этого сделал? С ходу не отвечу, потому что подбирал много параметров, но я решился на установку сырых пакетов из ppa:xorg-edgers/ppa. Кстати, советую поставить заголовки нового ядра: обычные и generic. Думаю, пригодятся :)

Когда bumblebee установился, я понял, что моя Intel карта перестала работать, выдавая вот такую ошибку:

$ glxinfo
name of display: :0
Xlib: extension "NV-GLX" missing on display ":0".
X Error of failed request: BadAlloc (insufficient resources for operation)
  Major opcode of failed request: 153 (GLX)
  Minor opcode of failed request: 3 (X_GLXCreateContext)
  Serial number of failed request: 17
  Current serial number in output stream: 18

Единственная внятная статья по этому поводу мне не помогла. Но я решил на неё забить, потому что я хотел вернуть Optimus назад.

Проект bumblebee не заработал, потому что при запуске любого приложения выдавалась ошибка с "якобы" вот таким решением. Оказалось, что вроде бы драйвер nvidia не может быть найден. Если помните, то nvidia-current решило мне похожую проблему ранее. Но опять таки я не загружал нужный мне модуль, потому что горе-погроммисты переименовали его. И теперь, правильнее было бы подправить /etc/bumblebee/bumblebee.conf вот так:

...
Driver=nvidia
...
[driver-nvidia]
# Module name to load, defaults to Driver if empty or unset
KernelDriver=nvidia_current
Module=nvidia
...

Руки бы им за подчёркивание оторвать. На всякий случай, я также добавил nvidia модуль в /etc/modules:

...
nouveau # не знаю, но в блеклист я этот модуль не стал добавлять
nvidia_current

Ну и немного для истории, вот моя видео карта:

$ optirun ./deviceQuery 
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 540M"
  CUDA Driver Version / Runtime Version          5.0 / 5.0
  CUDA Capability Major/Minor version number:    2.1
  Total amount of global memory:                 2048 MBytes (2147155968 bytes)
  ( 2) Multiprocessors x ( 48) CUDA Cores/MP:    96 CUDA Cores
  GPU Clock rate:                                1344 MHz (1.34 GHz)
  Memory Clock rate:                             900 Mhz
  Memory Bus Width:                              128-bit
  L2 Cache Size:                                 131072 bytes
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65535), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1536
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 5.0, CUDA Runtime Version = 5.0, NumDevs = 1, Device0 = GeForce GT 540M


$ optirun ./bandwidthTest 
[CUDA Bandwidth Test] - Starting...
Running on...

 Device 0: GeForce GT 540M
 Quick Mode

 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes) Bandwidth(MB/s)
   33554432   6269.0

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes) Bandwidth(MB/s)
   33554432   6277.8

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes) Bandwidth(MB/s)
   33554432   23688.5

06 нояб. 2012 г.

CUDA куда-куда? А! В Ubuntu 12.10 - CUDA Part

Круто - но стрёмно! Вот пришла пора описать как я ставил саму CUDA, и какие сложности попались мне на пути. Версия, которую мне захотелось поставить - CUDA 5.0. Четвертая версия сама по себе уже старовата, да и меня прельщала возможность использования Nsight for Linux, нежели чем какие-нибудь собственные make файлы.

Проще говоря, скачать и поставить не проблема, всяких док полно в интернете. Главное есть некоторые нюансы, которые я бы упомянул:

  • Не ставьте драйвера NVIDIA, входящие в комплект SDK;
  • Не ставьте поддержку Optimus - я не знаю, в чем её смысл, но думаю ничего хорошего она вам не принесёт. Во всяком случае интернет молчит по этому поводу;
  • Скорей всего инсталлятор попросит у вас GCC 4.6 - качайте отдельный метапакет для этого. У CUDA заголовков внутри прописана версия компилятора. Поэтому, если попытаетесь всё поднять на 4.7, то у вас отвалится. Любые попытки исправить (особенно, если вы новичок как я) оставьте на потом;

Когда всё поставите (соглашайтесь с дефолтными путями), то первым делом надо собрать каталог ~/NVIDIA_CUDA-5.0_Samples. При сборка каталога командой make вы получите около пяти ошибок, которые легко решаются. И так, понеслось...

g++ -m64 -o vectorAddDrv vectorAddDrv.o -L/usr/local/cuda-5.0/lib64 -lcuda
/usr/bin/ld: error: cannot find -lcuda
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuInit'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceGetCount'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceComputeCapability'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceGetName'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuDeviceGet'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuCtxCreate_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuModuleLoadDataEx'
...
vectorAddDrv.o:vectorAddDrv.cpp:function main: error: undefined reference to 'cuMemcpyDtoH_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuMemFree_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuMemFree_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuMemFree_v2'
vectorAddDrv.o:vectorAddDrv.cpp:function CleanupNoFailure(): error: undefined reference to 'cuCtxDetach'
collect2: error: ld returned 1 exit status
make[1]: *** [vectorAddDrv] Error 1

Лечится такая ошибка вот этим. Почему именно в .bashrc, а не в .bash_profile? Потому что из под иксов, при запуске gnome-terminal, вызывается именно первый файл, а не второй. Второй будет использоваться только в голой консоли. На всякий случай, вот мой файл:

export PATH=$PATH:/usr/local/cuda-5.0/bin
export LPATH=/usr/lib/nvidia-current:$LPATH
export LIBRARY_PATH=/usr/lib/nvidia-current:$LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-5.0/lib:/usr/local/cuda-5.0/lib64:/usr/lib/nvidia-current

Когда возникнет ошибка вида MPI not found (simpleMPI), то советую посмотреть сюда для наглядности и поставить ещё один пакет:

sudo apt-get install libopenmpi-dev

Потом у вас должна возникнуть ошибка с libcublas, которая лечится добавлением опции -ldl к компилятору:

cdpLUDecomposition: dlaswp.o dgetf2.o dgetrf.o cdp_lu.o cdp_lu_main.o
    $(NVCC) $(CCFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LDFLAGS) $(EXTRA_LDFLAGS) -ldl

Собственно это всё, после этого все демки должны будут скомпилиться и работать. Кстати, к сожалению позднее появление этой статьи в моём браузере является причиной написания этого блог-поста. Прочтите и не пожалеете.

Я не буду, наверное, описывать как программировать под CUDA, потому что сам не умею, но точно прошу вас запомнить следующие команды. Они вам помогут:

optirun nsight    # запускает Eclipse, чтобы программы работали с CUDA
optirun cuda-gdb yourCudaProgram    # запускает отладчик через CUDA

Погуглив в интернете более интенсивно, я понял, что nvcc почему-то не генерит отладочные символы (Debug Symbols) для устройства. В общем, если знаете ответ на этот вопрос, будьте добры, напишите мне где-нибудь...

04 нояб. 2012 г.

CUDA куда-куда? А! В Ubuntu 12.10 - Optimus Part

Линуксу - нет! Так получилось, что во время написания этого поста, я являюсь счастливым обладателем ноутбука фирмы ASUS, модель X7BS. Если захочется погуглить, то в нем Intel Core i7 - 2630QM, 2.0GHz, что даёт мне 8 гипертрединговых ядер, ну и два жёстких по 500 Gb. Однако не это в нём примечательное, а то, что он является обладателем технологии NVIDIA Optimus. Другими словами, его видеокарта GeForce GT 540M (2 Gb) умеет распоряжаться интегрированной Intel'овской картой.

Ну раз моя видеокарта может пользоваться CUDA технологией, то я решил поковырять параллельное программирование на ней на досуге. Проблема в том, что официально NVIDIA поддерживает MS Visual Studio 2008/2010 своим плагином Nsight для разработки приложений под CUDA. Начиная с 5.0 версии, они разродились самостоятельной средой разработки на основе Eclipse. Но минус в том, что эта IDE доступна для Linux'a и Мака (кажется).

Попробовав поставить старые .deb пакеты под обновившуюся недавно Убунту, я наткнулся на несколько, для меня, новостей: Optimus под линуксом идёт плохо, CUDA поддерживает старый компилятор GCC-4.6. Всё это меня расстроило в конец, потому что с OpenSuse дела тоже идут не гладко со старыми компиляторами, поэтому я решил написать статью о том как запустить CUDU с моей видеокартой под линукс.

Для начала нам надо запустить Оптимус. Под ОпенЗюзе есть хорошая статья (на немецком и русском языках), которая дала мне понять, что с Оптимусом под линуксом жить можно. Хочу сразу же обратить внимание на небольшую и простую переписку в форуме, которая мне помогла установить поддержку Оптимуса. Кстати да, я там отличился. У вас, скорей всего, как и у меня x-swat репозитории для 12.10 окажутся пустыми. Но это и не важно, ибо он не нужен вроде как :) В лучшем случае, если не полетит, то в файле /etc/bumblebee/bumblebee.conf должно быть так:

...
Driver=
...
[driver-nvidia]
# Module name to load, defaults to Driver if empty or unset
KernelDriver=nvidia-current
Module=nvidia
...

Про всяких пользователей я умолчу, так как все должно было бы встать нормально. Если что, проверьте своего пользователя, чтобы он был в группе bumblebee:

$ groups
user adm cdrom sudo dip plugdev lpadmin sambashare bumblebee

Если у вас всё взлетит, то вы увидите следующие или похожие результаты:


$glxgears
Running synchronized to the vertical refresh. The framerate should be approximately the same as the monitor refresh rate.
304 frames in 5.0 seconds = 60.613 FPS
... Intel
$ optirun glxgears
4439 frames in 5.0 seconds = 887.763 FPS
... NVIDIA
$ glxspheres
Polygons in scene: 62464
Visual ID of window: 0xa3
Context is Direct
OpenGL Renderer: Mesa DRI Intel(R) Sandybridge Mobile
60.271004 frames/sec - 67.262440 Mpixels/sec
... Intel
$ optirun glxspheres
Polygons in scene: 62464
Visual ID of window: 0x21
Context is Direct
OpenGL Renderer: GeForce GT 540M/PCIe/SSE2
110.310679 frames/sec - 123.106717 Mpixels/sec
... NVIDIA

Вот собственно и всё для этой части. Что-то поздно и я подумываю над тем, чтобы пойти спать. К сожалению, я не закончил статью, а посему про CUDA напишу позже... Ку!

04 мая 2009 г.

Принтер Samsung ML-2015

С незапамятных времен у меня был принтер, название которого вы видите выше. Так получилось, что мне нужно использовать его под Linux. Всё было хорошо, в ранних версиях Ubuntu (< 9.04), он у меня подхватывался системой CUPS как говориться "искоропки". Но вот, незадача, как-то пришлось мне обновиться (во всяком случае я не так часто печатал, чтобы обратить внимание на то, как вёл себя принтер в 8.10, здесь я говорю именно про сейчас) до Jaunty релиза и он у меня перестал работать. Точнее когда отправляешь задание на печать, я получаю следующее: документ тормозится на обработке и мне сообщается, что принтер не подключён (кстати сказать на моём нетбуке под той же версией Ubuntu принтер работает):

Состояние печати

Сравнив настройки принтера в моих дистрибутивах, я обнаружил интересную разницу, которую сам добавить никак не мог (выделено на рисунке):

Свойства принтера

Стерев разницу мой принтер сразу же заработал. Кстати добавив к с вышеизложенному. В /var/log/syslog я увидел следующее:

May 4 19:29:05 vest-desktop hal_lpadmin: Running hal_lpadmin
May 4 19:29:06 vest-desktop hal_lpadmin: hal_lpadmin triggered by low-level USB device
May 4 19:29:06 vest-desktop hal_lpadmin: Getting device ID from the usblp HAL entry ...
May 4 19:29:06 vest-desktop hal_lpadmin: Device ID for /dev/usb/lp0: MFG:Samsung;MDL:ML-2010;DES:;CMD:GDI;
May 4 19:29:06 vest-desktop hal_lpadmin: Written device ID into HAL database entry: MFG:Samsung;MDL:ML-2010;DES:;CMD:GDI;
May 4 19:29:06 vest-desktop hal_lpadmin: add
May 4 19:29:06 vest-desktop hal_lpadmin: Printer reported by HAL: Samsung ML-2010 3D66BKCPA21817X.
May 4 19:29:06 vest-desktop hal_lpadmin: Found configured printer: ML-2010; URI: usb://Samsung/ML-2010?serial=3D66BKCPA21817X.
May 4 19:29:06 vest-desktop hal_lpadmin: Not adding printer: ML-2010 already exists
May 4 19:29:06 vest-desktop hal_lpadmin: Re-enabling printer ML-2010

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

04 марта 2009 г.

Gnome Internationalization или интернационализация средствами Glib и intltool

Теперь пришло время, добавить в наш шаблон «Интернационализацию». Основное отличие от «Локализации» заключается в том, что приложение, поддерживающее интернационализацию физически представляет собой один исполняемый файл (с сопутствующими ему файлами с данными), которое равно запускается в операционной системе и отображает локализованную информацию в зависимости от настроек ОС. Локализованное приложение отображает только тот язык, для которого оно было создано. Так, например, в Windows часто вы встречали фразы «Скачать русскую версию». Так вот, это были локализованные приложения.

Наше приложение пока отображает только английскую локаль. Попробуем встроить в него интернационализацию управляемую библиотекой GLib. Для начала нам понадобятся пара пакетов: intltool и gettext. Они помогут нам, избавив от некоторой рутинной работы.

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

Здесь и далее хочу сказать, что в исходных кодах можно использовать как TAB символы, так и пробелы, в шаблонах configure.ac также, НО в Makefile.am только TAB.

#include <config.h>
#include <stdio.h>
#include <glib/gi18n.h> -- поддержка макросов gettext

int main(int argc, char** argv)
{
    setlocale (LC_ALL, ""); -- устанавливаем текущую локаль, информацию берём с переменных окружения (это можно опустить в GUI программировании)
    bindtextdomain (GETTEXT_PACKAGE, QUOD_LOCALEDIR); -- устанавливаем каталог, где лежат файлы для разных языков
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); -- устанавливаем кодировку для вывода символов (благо Linux легко поддерживает Unicode)
    textdomain (GETTEXT_PACKAGE); -- установка домена по умолчанию

    printf(_("Hello World!\n")); -- отмечаем текст, который надо перевести с помощью макроса _()

    return 0;
}

Почитав повнимательнее, я выяснил, что оказывается сам GLib локализован с помощью механизма gettext, поэтому он принят стандартом де-факто. Существуют разные макросы, выделяющие наш текст, требующий интернационализации. Например, для строк, к которым не может быть применён вызов gettext (например глобальные переменные переменные принимающие строки в массивах), то к ним применяется макрос N_(). Дополнительную информацию можете поискать в самом Glib'e, либо Internationalising GNOME applications, ещё как вариант скачать intltool, и там прочесть HOW-TO. Вообще, информации много, но вот собранной воедино и с нуля — мало.

Следующим этапом идёт создание каталога po, где будут находиться наши переводы. Заодно, подправим наши шаблоны:

~/gnome-quod$ mkdir po

configure.ac
# ======================== initialization ===============================
AC_INIT([Gnome Quod],
        [0.4.0],
        [vest@mail.com],
        [gnome-quod])

AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2])
AC_DEFINE([NDEBUG], [], [Disable debugging information])

# ==================== basic compiler settings ==========================
AC_PROG_CC
AM_PROG_CC_C_O
AC_HEADER_STDC

# ==================== internationalization i18n ========================
IT_PROG_INTLTOOL([0.40.4]) -- требование библиотеки intltool не ниже 0.40.4
GETTEXT_PACKAGE=gnome-quod -- название пакета выносим в отдельную переменную
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"], -- которую делаем в качестве
                   [The domain to use with gettext]) -- директивы для препроцессора (см. config.h)
AM_GLIB_GNU_GETTEXT -- не знаю до конца, но скорей всего включает поддержку GETTEXT у Glib (или через)
AC_SUBST(GETTEXT_PACKAGE) -- добавляет опции в компилятор для включения gettext

QUOD_LOCALEDIR=[${datadir}/locale] --указываем, где будут находиться локализации
AC_SUBST(QUOD_LOCALEDIR) -- запоминаем этот путь и добавляем его в опции компилятора

PKG_CHECK_MODULES([GLIB],[glib-2.0 >= 2.18]) -- проверяем, что у нас стоит Glib нужной версии

# ==================== generate files ===================================
AC_CONFIG_FILES([
  Makefile
  src/Makefile
  po/Makefile.in -- выводим ещё один шаблон Makefile'a в новом каталоге po
])
AC_OUTPUT

В HOW-TO, я прочитал следующее, что вместо AM_GLIB_GNU_GETTEXT можно использовать AM_GNU_GETTEXT([external]), а сам autoreconf предложил мне воспользоваться AM_GNU_GETTEXT_VERSION. С одним предупреждением у меня получился следующий вариант:

...
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
                   [The domain to use with gettext])
AM_GNU_GETTEXT_VERSION
...

$ autoreconf
...
autoreconf: configure.ac: AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT

с другим вариантом:

autoreconf: configure.ac: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION
configure.ac:23: required file `./config.guess' not found
configure.ac:23: `automake --add-missing' can install `config.guess'
configure.ac:23: required file `./config.rpath' not found
configure.ac:23: required file `./config.sub' not found
configure.ac:23: `automake --add-missing' can install `config.sub'
configure.ac:23: required file `./ABOUT-NLS' not found

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

// Makefile.am
SUBDIRS = src po -- добавляем лишний каталог

@INTLTOOL_DESKTOP_RULE@ -- этот макрос позволяет intltool определить, где какие файлы требуют перевода (в частности, в корневой директории может находиться будущий ярлык программы)

INTLTOOL_FILES = \
        intltool-extract.in \
        intltool-merge.in \
        intltool-update.in

EXTRA_DIST = $(INTLTOOL_FILES)

DISTCLEANFILES = \
        intltool-extract \
        intltool-merge \
        intltool-update


# здесь я говорю, что вышеследующие файлы (шаблоны) будут распространятся в дистрибутиве без обработки, в случае очистки сгенерированные с шаблонов файлы следует стирать

# эти строки я встречал не всегда. Они отвечают за очистку кеша, создаваемого intltool
clean-local:
        rm -f po/.intltool-merge-cache


// src/Makefile.am
quod_CFLAGS = \ -- задаём флаги для конкретного исполняемого файла (quod)
        -DQUOD_LOCALEDIR=\"${QUOD_LOCALEDIR}\" \ -- где лежат наши локали
        $(GLIB_CFLAGS) \ -- флаги для компиляции с Glib
        -I$(top_srcdir) -- путь, с заголовками уровнем выше (обычно для config.h)

quod_LDADD = \ -- тоже самое, но для линковщика
        $(INTLLIBS) \ -- библиотеки intltool
        $(GLIB_LIBS) -- библиотеки Glib

bin_PROGRAMS = quod
quod_SOURCES = main.c

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

~/gnome-quod$ intltoolize -- этот скрипт создаст файл po/Makefile.in.in

// вручную создаём po/LINGUAS
# please keep this list sorted alphabetically
#
ru -- по алфавиту указываем какие языки у нас будут присутствовать

// вручную создаём po/POTFILES.in
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
src/main.c -- здесь описываем все файлы, где нужен перевод (даже файлы с ярлыками для рабочего стола)

// Проверяем:
~/gnome-quod/po$ ls -l
итого 8
-rwxr-xr-x 1 vest vest 51 2008-12-10 10:50 LINGUAS
lrwxrwxrwx 1 vest vest 34 2009-03-04 18:52 Makefile.in.in -> /usr/share/intltool/Makefile.in.in
-rwxr-xr-x 1 vest vest 68 2009-03-04 19:04 POTFILES.in

На самом деле видите, что Makefile.in.in это всего-навсего ссылка. Далее попытаемся создать pot-файл, содержащий строки, нуждающиеся в переводе:

~/gnome-quod/po$ intltool-update --pot -- выполнять это надо внутри каталога po

~/gnome-quod/po$ cat gnome-quod.pot
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-03-04 19:08+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: ../src/main.c:13
#, c-format
msgid "Hello World!\n"
msgstr ""

Вот так выглядит шаблон, созданный скриптом. Сам pot-файл не нужен, так как генерируется автоматически. То, что требуется от вас, это сделать копию файла с именем того языка, на который вы будете создавать свою локализацию (в нашем случае ru.po). Сам файл хорошо документирован, вам следует обратить внимание на то, что CHARSET следует исправить в UTF-8. Есть другой способ создать шаблон нужной локализации средствами gettext (но про UTF-8 строки следует не забывать. Помните наши изменения в исходном файле main.c):

~/gnome-quod/po$ msginit --locale=ru
Новый каталог сообщений должен содержать ваш адрес электронной почты,
чтобы пользователи могли присылать свои замечания по поводу ваших
передов, а также чтобы сопроводители программ могли связаться с вами в
том случае, если возникнут непредвиденные технические проблемы.

Which is your email address?
1 Vest@home.tula.net
...
9 vest@vest-desktop

Please choose the number, or enter your email address.
9 -- я ввёл это чисто (просто так, на самом деле введите либо номер либо свой реальный адрес)
A translation team for your language (ru) does not exist yet.
If you want to create a new translation team for ru, please visit
 http://www.iro.umontreal.ca/contrib/po/HTML/teams.html
 http://www.iro.umontreal.ca/contrib/po/HTML/leaders.html
 http://www.iro.umontreal.ca/contrib/po/HTML/index.html

Создано ru.po. -- вот это самое главное.

~/gnome-quod/po$ cat ru.po
# Russian translations for Gnome Quod package.
# Copyright (C) 2009 THE Gnome Quod'S COPYRIGHT HOLDER
# This file is distributed under the same license as the Gnome Quod package.
# Vladislav Volodin <vest@vest-desktop>, 2009.
#
msgid ""
msgstr ""
"Project-Id-Version: Gnome Quod 0.4.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-03-04 19:08+0300\n"
"PO-Revision-Date: 2009-03-04 19:18+0300\n"
"Last-Translator: Vladislav Volodin <vest@vest-desktop>\n"
"Language-Team: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n" -- как видите, это надо поменять на UTF-8
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: ../src/main.c:13
#, c-format
msgid "Hello World!\n"
msgstr ""

Далее переводим строку следующим образом. Оставляем оригинал вверху, нужный перевод внизу, и всё сохраняем в формате UTF-8:

...
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: ../src/main.c:13
#, c-format
msgid "Hello World!\n"
msgstr "Привет Мир!\n"

И пробуем реконфигурировать наш проект, собирать, и устанавливать. Остаётся проверить:

vest@vest-desktop:~/gnome-quod$ autoreconf && ./configure && make
...
checking whether NLS is requested... yes
checking for intltool >= 0.40.4... 0.40.5 found
checking for intltool-update... /usr/bin/intltool-update
checking for intltool-merge... /usr/bin/intltool-merge
checking for intltool-extract... /usr/bin/intltool-extract
checking for xgettext... /usr/bin/xgettext
checking for msgmerge... /usr/bin/msgmerge
checking for msgfmt... /usr/bin/msgfmt
checking for gmsgfmt... /usr/bin/msgfmt
...
checking for GLIB... yes
...
# INTLTOOL_MAKEFILE
make all-recursive
make[1]: Вход в каталог `/home/vest/gnome-quod'
Making all in src
make[2]: Вход в каталог `/home/vest/gnome-quod/src'
gcc -DHAVE_CONFIG_H -I. -I.. -DQUOD_LOCALEDIR=\"/usr/local/share/locale\" -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I.. -g -O2 -MT quod-main.o -MD -MP -MF .deps/quod-main.Tpo -c -o quod-main.o `test -f 'main.c' || echo './'`main.c
mv -f .deps/quod-main.Tpo .deps/quod-main.Po
gcc -DQUOD_LOCALEDIR=\"/usr/local/share/locale\" -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I.. -g -O2 -o quod quod-main.o -lglib-2.0
...
~/gnome-quod$ quod
Привет Мир!
$

Теперь можно вас поздравить с тем, что у вас «интернационализовано» ваше приложение. Далее попробуйте уже сами создать пакет с помощью make dist, и просмотреть какие файлы распространяются с пакетом, а какие нет.

И ещё, не забывайте каждый раз обновлять файл POTFILES.in, когда добавляете новые исходные файлы в src каталог. И затем выполняйте intltool-update ru. Она также обновляет файлы с переводом, если у вас добавляются новые строки, указывая вам на число переведённых или не переведённых строк. Смотрите, что будет если подправить исходный код следующим образом:

// main.c
printf(_("Hello World!!\n")); -- лишний восклицательный знак

:~/gnome-quod$ cd po
~/gnome-quod/po$ intltool-update ru
... завершено.
0 переведенных сообщений, 1 неточный перевод.
~/gnome-quod/po$ cat ru.po

#: ../src/main.c:13
#, fuzzy, c-format -- здесь он подправил, что наше исходной сообщение теперь другое. После исправления это слово можно стереть
msgid "Hello World!!\n" -- ведь появился восклицательный знак
msgstr "Привет Мир!!\n" -- добавим его здесь

Вот собственно и всё, жду Ваших комментариев и дополнений.

Web-камера Creative Vista IM (VF0420)

Небольшое предисловие, мне понадобилась камера, которая работала бы в Linux'е (а именно у меня в Ubuntu 8.10), и упор делался на проприетарный Skype. И я купил камеру, модель Creative Vista IM (VF0420). Определяется эта камера следующим образом:

$ lsusb
Bus 001 Device 002: ID 041e:4064 Creative Technology, Ltd

Могу сказать, что с нуля, камера на Desktop-машине работала на приложении Cheese притормаживая, VLC ничего не открывал. Другие я не пробовал. Сам Skype определяет камеру, но к сожалению во время тестов и вещания вместо изображения рисует шумы в виде зелёных полос и точек.

Говорят, что модуль gspca плохо поддерживает камеру. Готовое решение я сперва отыскал здесь, но потом (когда уже всё заработало по первому варианту) обнаружил здесь (на русском языке). Потому, чтобы не дублироваться решил привести ссылки на эти источники.

Вот, что хочу добавить: после установки модулей у меня перестал работать cheese, плохо заработала camorama (чёрно-белые 4-5 изображений, сжатых в один ряд по-горизонтали). Можно запустить gstreamer-properties и попробовать принудительно выбрать устройство видеозахвата (на v4l работало, на v4l2 — нет)

Ещё, что не указано в источниках, проверьте принадлежит ли ваш пользователь группе video. Название группы можно уточнить, просмотрев аттрибуты на файл /dev/video0. Добавив пользователя в группу и перелогинившись в X у меня заработал Skype (2.0.0.72).

Удачи вам с вашими камерами. Даже купив камеру, которая создала мне по умолчанию видео устройство, мне всё равно пришлось выполнить вышеуказанное.

27 февр. 2009 г.

Autotools с нуля

На этот раз, я постараюсь объяснить, возможно, знакомую всем по предыдущим постам тему об использовании Autotools. Мне пришлось этот путь пройти заново, и немного по-другому, для того, чтобы мой проект выглядел так, как того требуют Gnome Games. Так получилось, что я написал им письмо о том, что у меня есть игра Gnome Quod (для Ubuntu вы сможете использовать мой автоматический репозиторий на PPA), и я бы хотел привести её к виду, соответствующему Gnome Games. Автор сборника игр, выделил мне ряд требований, решив которые, я смогу попробовать заново попросить его о включении моей игры в их пакет. Ну да ладно, это будет не скоро, и я сомневаюсь в этом, но давайте приступим к подготовке нового пакета, прежней игры.

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

Для начала создадим папку с названием gnome-quod. Так будет называться мой каталог, где будут находиться все исходники, весь пакет, откуда потом, мы будем создавать пакеты. Затем, создаём файл-шаблон configure.ac. Его будет просматривать скрипт Autotools с названием autoreconf. Этот скрипт занимает одно из главных положений, в нашем проекте. Первоначальное содержание configure.ac будет следующим (комментарии только для осмысления.):

# ======================== initialization ===============================
Здесь будет описываться инициализация проекта: имя, начальный каталог и пр.

# ==================== basic compiler settings ==========================
Основные опции компилятора (например, используемый язык)

# ==================== checks for libraries =============================
Проверка существования библиотек

# ==================== checks for header files ==========================
Проверка существования заголовочных файлов (если нужно)

# ===== checks for typedefs, structures and compiler characteristics ====
Проверка типов, структур, особенностей компилятора

# ==================== checks for library functions =====================
Проверка функций библиотек. Полезно, когда версия библиотеки мало ли соответствует требуемой, но в ней нет функции, или, например, вы не уточняете версию библиотеки, и потому в случае отсутствия функции, можете реализовать её сами.

# ==================== generate files ===================================
Здесь создаются файлы, которые потом используются make'ом

AC_OUTPUT -- эта строка даёт всему начало

Порядок, который я описал, важен, но не существенно. Но главное не путать конец с началом. А вообще лучше придерживаться этого шаблона. Я встречал его во многих исходных файлах. Так что, будет у вас как у всех , если конечно, вам это не мешает. Теперь давайте добавим, в отдельные группы следующие макросы. Они должны описывать наш проект так, чтобы он работал.

# ======================== initialization ===============================
AC_INIT([Gnome Quod],
        [0.4.0],
        [vest@mail.com],
        [gnome-quod]) -- длинное имя, версия пакета, адрес куда стоит писать bug-репорты, краткое имя пакета

AC_CONFIG_SRCDIR([src/main.c]) -- проверка безопасности, что по этому адресу находится заведомо известный исходный файл
AC_CONFIG_HEADERS([config.h]) -- здесь создаётся заголовочный конфигурационный файл, который может быть использован в исходных файлах (в частности, там определена директива NDEBUG, см. ниже)
AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2]) -- включаем компилятору все предостережения и ошибки, чтобы подробно видеть всё на экране, о процессе компилции, дистрибутив распространяется в виде упакованного файла bz2
AC_DEFINE([NDEBUG], [], [Disable debugging information]) -- эта строка нужна лично мне, так как я использую assert функции, и если что, мне их нужно отключать

# ==================== basic compiler settings ==========================
AC_PROG_CC -- используем только Си компилятор
AM_PROG_CC_C_O -- нужно использовать вместо AC_PROG_CC_C_O, позволяет использовать флаги для каждой цели в Makefile
AC_HEADER_STDC -- проверка стандартных заголовочных файлов "stdlib.h", "stdarg.h", "string.h", "float.h". Это уже не нужно, так как они всегда есть, можно не проверять.

# ==================== generate files ===================================
AC_CONFIG_FILES([
  Makefile
  src/Makefile
]) -- происходит вызов AC_OUTPUT для каждого файла.
AC_OUTPUT -- создаёт много файлов, которые нам нужны

Далее создаём файлы-шаблоны Makefile.am и src/Makefile.am:

# Makefile.am
SUBDIRS = src

# src/Makefile.am
bin_PROGRAMS = quod
quod_SOURCES = main.c

Конечно же нам нужно создать main.c, с неким Hello World'ом.

#include <config.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    printf("Hello World!\n");

    return 0;
}

Вот собственно и всё, на данный момент, далее выполняем следующие команды:

~/gnome-quod$ autoreconf --install
/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB
/usr/share/aclocal/lf_x11.m4:33: run info '(automake)Extending aclocal'
/usr/share/aclocal/lf_x11.m4:33: or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
configure.ac:14: installing `./compile'
configure.ac:9: installing `./install-sh'
configure.ac:9: installing `./missing'
src/Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING'
autoreconf: automake failed with exit status: 1

Как вы видите, получили ошибки. Связаны они с тем, что наш проект полностью соответствует GNU стандарту, согласно configure.ac, но на деле таковым не является. Требуется создать самому следующие файлы, и желательно заполнить их. Вы можете посмотреть пример заполнения в любом серьёзном проекте, либо обратившись к Learning the GNU development tools. Создадим их и попробуем ещё раз (я ещё создал файл THANKS, название говорит само за себя):

$ ls
AUTHORS ChangeLog configure.ac Makefile.am NEWS README THANKS src

$ autoreconf --install
/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB
/usr/share/aclocal/lf_x11.m4:33: run info '(automake)Extending aclocal'
/usr/share/aclocal/lf_x11.m4:33: or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
configure.ac:14: installing `./compile'
configure.ac:9: installing `./install-sh'
configure.ac:9: installing `./missing'
src/Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
Makefile.am: installing `./COPYING'

Каждый раз, когда меняется один из шаблонов, следует вызывать autoreconf без параметров. Иногда вы встретите в пакетах файл autogen.sh, по идеи он похож с предыдущим. Не вдаваясь в подробности этапов конфигурирования, здесь осуществляется поочерёдный вызов некоторых скриптов, входящих в состав Autotools.

Можно избежать проблем с тем, что не существует файлов, для этого стоит "сказать", что мы не соответствуем стандарту, для этого следует изменить макрос AM_INIT_AUTOMAKE следующим образом:

...
AM_INIT_AUTOMAKE([-Wall -Werror dist-bzip2 foreign])
...

Теперь поочерёдно выполним следующие команды, и взглянем на результат:

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
....
checking for ANSI C header files... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands

$ make
make all-recursive
make[1]: Вход в каталог `/home/vest/gnome-quod'
Making all in src
make[2]: Вход в каталог `/home/vest/gnome-quod/src'
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -g -O2 -o quod main.o
make[2]: Выход из каталога `/home/vest/gnome-quod/src'
make[2]: Вход в каталог `/home/vest/gnome-quod'
make[2]: Выход из каталога `/home/vest/gnome-quod'
make[1]: Выход из каталога `/home/vest/gnome-quod'

$ src/quod
Hello World!

Здесь я решил не урезать вывод, чтобы вы могли заметить. Тут поэтапно проходит конфигурирование, компиляция программы и последующий её запуск. Если вам нужен распространяемый пакет, выполните следующую команду make dist, в текущем каталоге вы получите следующие два файла:

$ ls -l gnome-quod-*
-rw-r--r-- 1 vest vest 73173 2009-02-27 01:01 gnome-quod-0.4.0.tar.bz2
-rw-r--r-- 1 vest vest 87568 2009-02-27 01:01 gnome-quod-0.4.0.tar.gz

Итак, на сегодня это пока всё. Вся вышеперечисленная информация, чуть более чем подробно объясняется в этой презентации (http://www.lrde.epita.fr/~adl/autotools.html). Советую с ней ознакомиться.

25 янв. 2009 г.

Игра на КДЕ. День последний.

Вот собственно игра окончилась, можно сказать, по-честному, прошла она не очень, но в то же время всё-таки прошла.

Короче... я стёр KDE и поставил себе Чистый Gnome.

Как высказались мои друзья, после KDE я потерял всякую мораль, стал замкнутым и отчуждённым. Глупо, но такое ощущение, что KDE может повлиять на человека не в лучшую сторону... не в лучшую.

Вы спросите буду ли я играть на KDE вновь? — Быть может, быть может. Я не хочу обещать, может быть это будет традицией, неделя Gnome, неделя KDE. Но если честно, KDE меня нервирует.

Я сожалею о том, что играл на KDE...

23 янв. 2009 г.

Игра на КДЕ. День пятый.

Вот идёт ещё один день моего смелого пребывания в KDE. Что у меня изменилось за последнее время? Я начинаю привыкать к проблемам со звуком и постоянно вылетающими теперь Konqueror и Firefox. Вчера Firefox удивил меня тем, что когда я заходил на какой-то из сайтов он тихо закрылся. Причем эту ошибку отследить было нельзя, потому я запустил его в консольном режиме, и вот что я получил:

$ firefox
QPixmap: Invalid pixmap parameters

(firefox:10500): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed <-- многократное появление таких строчек

The program 'firefox' received an X Window System error.
This probably reflects a bug in the program.
The error was 'RenderBadPicture (invalid Picture parameter)'.
(Details: serial 3472708 error_code 169 request_code 155 minor_code 7)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)
Locking assertion failure. Backtrace:
#0 /usr/lib/libxcb-xlib.so.0 [0xb80347c7]
#1 /usr/lib/libxcb-xlib.so.0(xcb_xlib_lock+0x2e) [0xb803496e]
#2 /usr/lib/libX11.so.6 [0xb6b2b619]
#3 /usr/lib/libXrender.so.1(XRenderFreePicture+0x41) [0xb6bdcf41]
#4 /usr/lib/libQtGui.so.4 [0xb41d86bf]
... многократное появление похожих строчек связанных с этой библиотекой]
#17 /usr/lib/libQtGui.so.4 [0xb41d2d5a]
#18 /lib/tls/i686/cmov/libc.so.6(exit+0x89) [0xb7dc2d69]
#19 /usr/lib/libgdk-x11-2.0.so.0 [0xb66e26b7]
Segmentation fault

Меня насторожила строка, сразу же после выполнения команды. Похоже имеется какая-то проблема с QPixmap. И это мне не понравилось. Потому я решил обновиться на KDE 4.2-rc-1. Воспользовавшись ссылкой, так "заботливо" предоставленной моими друзьями, которые они аргументировали следующим образом:

Один: http://www.kubuntu.org/news/kde-4.2-rc1
Вест
сделайте этот смертельный номер
один хрен потом вам кеды сносить, а то и всю ось переставлять :)
Другой: Да, поставьте бету, ведь вам уже всё равно :)

Заодно и помогли ссылкой. Аргументы были весомые, я не мог ничего сказать плохого в сторону KDE и решил обновиться. Скачивать пришлось около 250 мб пакетов, что собственно я и сделал.

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

E: /var/cache/apt/archives/kdebase-workspace-data_4%3a4.1.96-0ubuntu4~intrepid1~ppa1_all.deb: попытка перезаписать /usr/share/doc/kde4/HTML/en/kcontrol/windowspecific/index.cache.bz2, который уже имеется в пакете kde-window-manager

Итак, обновление прошло почти с первого раза... После гламурного, красивого и приятного глазу моего KDE 4.1.4 я получил почти не изменившееся окно:

Что сразу хочется отметить: изменилось меню в красивую сторону, иконки раньше имеющие баг на протяжении года жизни KDE в System Tray'e, связаный с некорректным отображением прозрачности в виде чёрного квадрата вокруг них, сейчас исправились. Почему-то пришла идея, что на чёрном чёрный квадрат не видно, и потому решили в Tray'е "вырезать" прямоугольник и закрасить его чёрным цветом, что по-моему сделано почти правильно. Ведь это же KDE! Меню тоже похорошело, приобрело красивую рамочку. Кстати сказать о плазмоидах. Теперь плазмоиды могут масштабировать так, как нормальные окна, то есть один из углов становится фиксированным, а другой перемещается за мышью (раньше это было от центра плазмоида, и он постоянно уходил за пределы экрана). Ещё хочется добавить то, что при масштабировании не происходит увеличения или уменьшения иконок, то есть всё вроде бы даже хорошо и KDE могло бы заполучить ещё одного пользователя, но... Как вы видите, справа внизу я оставил ошибку, связанную с Phonon'ом. Но у меня звук продолжал работать, Amarok играл, как? Не знаю, наверное через PulseAudio.

Удивительная вещь №5 заключается в том, что можно вытянуть уведомление, что я и сделал, но после чего остался маленький квадратик, тоже плазмоид. Промастабировав его и развернув, видно, что antialiasing по-прежнему не работает. Причём на некоторые рамки распространяется, но на шрифты нет. Вообще-то, вращение плазмоидов является основной фишкой KDE4, так как до этого я нигде похожего не видел. Зачем это нужно? Я пока не решил, наверняка это требует ресурсов (раз уж это у меня даже на выключенных эффектах подтормаживает). Зато представьте, у вас немного перекошен стол, на котором стоит монитор и "о чудо!", вы можете внести поправку на все плазмоиды, которые есть на рабочем столе. Вращение окон пока остаётся за гранью мыслемого... Подождём.

Ах да! Я вспомнил, опять же вчера, то есть на четвёртый день, меня поразило то, что безопасность KDE может быть под угрозой. Не верите? Итак, Удивительная вещь №6. Включив однажды компьютер, залогинившисть в KDE, мне предстало следующее окошко:

Не знаю как вы, но я испугался, хорошо, что у меня есть KDE и оно мена предупредило, что моя мышка может быть захвачена. Теперь моя безопасность уже выросла. Кстати сказать, Konqueror не стал стабильней и по-прежнему аварийно завершался... и не он один, другие, неизвестные мне приложения, закрывались тоже. Вот, например, что происходит при завершении System Tray'a (GTK приложения остаются обделёнными, в то время как QT'шные нет. KDE - единоличник!):

Но и эта вещь легко исправляется, достаточно закрыть эти окошки, как они тут же радостные, что я их освободил от оконного плена, возвращаются назад к себе в tray. Но радость Gajim'a была больше чем у Pidgin'a. Он показал мне уведомление о том, что пришло новое сообщение (конвертик), но на радостях забыл, что при этом "человечек" должен скрыться. То есть теперь это человечек с конвертиком в руках (кстати были случаи, когда конвертик был прикреплён к незадачливому почтальону сзади, как у Карлсона):

Запустив так привычный мне inkscape (мне нужно было подрисовать один градиент в SVG-файле) я получил Удивительную вещь №7. В чём она заключается? Это в том, что настройка градиента не работает так, как мне того надо. Там, где вы не видите шкалу цветов учтите, что она на самом деле есть!

В довершении хочется привести фразу одного из моих друзей, конечно же за вычетом идиоматических выражений: "оно кривое, с ****ным юзабилити и для него фактически нет родных приложений на куте4, а те вменяемые, что есть на куте4, работают и без кде4 на ура и вообще никак к нему не относятся"

21 янв. 2009 г.

Игра на КДЕ. День третий.

Вот и наступил третий день моего пребывания в KDE 4.1.4. Что я могу сказать? В битве с KDE чувство победы плавно переходило от меня к KDE, и от KDE ко мне: как только я зашёл в этот DE, первым делом я обнаружил пропажу звука в музыкальных приложениях, так заботливо запущенного день назад. О звуке я расскажу попозже. Для начала мне стоит сказать, что как только я открыл konqueror на страничке моего блога, мне не понравился цвет шрифта вкладок, который я захотел изменить. Конечно же я полез в systemsettings (теперь уже локализованный в "Параметры Системы"). "Завоеватель" этого перепугался и выдал мне последовательных два окна:

Ну ничего, эта проблема всего-навсего с konquer'ом у меня бывала всего два раза за два дня, так, что я думаю это не страшно. Теперь вернёмся к звуку. Основная проблема была в том, что у меня пропало воспроизведение музыкальных файлов. В моём Gnome для воспроизведения использовался backend Xine, в то время как здесь его не было. Чтобы голову себе не забивать, признаюсь откровенно, я установил метапакет kubuntu-desktop. Что это даёт? Собственно там прилагаются всевозможные попытке по тому, чтобы всё работало. В частности звук. Проблема вроде решилась, но остаются некоторые нюансы. Могу сказать, что звук работает теперь. Но для этого приходится сперва закрыть все приложения его использующие (в том числе и GTK+), потом на всякий случай перегрузить alsa-utils и pulseaudio. Собственно после этих преобразований, у меня получилось всё перенаправить через PulseAudio. Запустив pavucontrol, вы можете это проверить:

Если вы заметили, здесь видно, что сейчас воспроизводится Skype, Amarok, Gajim (paplay). То есть, я позволяю себе использование Звукового Сервера PulseAudio, который разрешает мне одновременное использование звуковой карточки приложениями разных типов.

Теперь, Удивительная вещь №4. Даже после установки метапакета kubuntu-desktop у меня с предыдущего сайта про PulseAudio произошла загрузка вот такого SVG-файла. Да-да, именно, почему-то KDE пока не умеет отображать SVG-файлы ни в konqueror'e, ни в firefox'e:

Хорошо, хоть есть inkscape, он помог мне исправить ситуацию. Я качал картинку и открыл её руками. А также, немного погуглив, обнаружил интересный проект KSVG. Очень интересно, но к сожалению мне не хочется его компилировать, так как в репозиториях его нет. Равно как и версии для KDE4 пока тоже видимо нет. А ещё хочу снова сказать, что konqueror у меня опять закрылся. Видимо он не выдерживает более 4-ёх вкладок при открытии 5-ой Google. Ниже приводится правильный оригинал верхнего изображения:

Напоследок покажу вам текущий рабочий стол, который я решил допилить себе именно так, чтобы мне стало удобно. Но, хочу сказать... Удивительная вещь №5: те, кто столкнётся с установкой тем под KDE4 обнаружат "приятную" новость, оказывается, так просто скачать и поставить тему или plasmoid под DE не так уж и просто. "Почему?" - спросите вы. Потому что, их так просто не установить. Здесь я нашёл одну статью, которая "обещает" быструю установку тем под Plasma, а вот здесь "чуть медленнее". По итогам проделанной работы я поломал внешний вид KDE полностью, и посетовал, что не существует более простого способа установки тем как в Gnome из tar архивов. Но зато, я нашёл у KDE встроенный менеджер по управлению внешним видом, виджетами и прочим. Назвать его точно не могу, одно из предположений это superkaramba, он позволяет скачивать апплеты с KDE-look.org, но почему-то количество доступных в этом приложении апплетов, несравнимо меньше чем имеется оных на сайте. Решение проблемы снова просто - нужно либо скомпилировать всё, что вам понравится, либо попробовать поискать скомпилированный кем-нибудь пакет. Я, к сожалению ничего подходящего не нашёл, возможно вам повезёт больше, так как я решил не тратить на это время свыше 10 минут. Потому смотрите на то, что у меня получилось хотя бы так:

Комментарий по этой картинке было тоже много, как и по первой, которая, по мнению "неназвавшихся" порочит славное имя KDE. Однако здесь было недовольство по поводу синеватости рабочего стола. Ну что ж, пусть, мне так удобно, благодаря таким нежным цветам и яркостью моего монитора, я постарался снизить риск развития заболевания "Красноглазия", которое могу в скором будущем подхватить, если конечно не потру KDE раньше. Хотя с музыкой и Firefox'ом KDE не так страшно (konqueror меня разочаровал своими аварийными завершениями и постоянным беспокойством о том, что я отправляю гнусные скриншоты в этот блог, волнуясь либо за мою, либо за его безопасность).

Но всё равно, несмотря на всяческие ухищрения оно всё ещё имеет популярность у пользователей

19 янв. 2009 г.

Игра на КДЕ. Предисловие

Это и последующие сообщения появились в результате одного или нескольких событий. Да, к сожалению, я хотел описывать в своём блоге только то, что может быть полезно людям, столкнувшимся с Ubuntu, программированием, то есть всем тем, что связано с компьютером.
В один, прекрасный день, один из друзей по переписке отыскал в интернете флеш-игру под названием Globulos. Рассказывать про эту игру можно долго, но это не являлось темой текущего сообщения. Единственное, что можно выделить, что при соответствующей небольшой тренировке вполне можно устраивать соревнования. Главное, чтобы была причина...

... И вот причина появилась. Моими друзьями в количестве 2 "штук" (дабы их не деанонимизировать, не буду приводить их имена и ники), была разработана и предложена, а потом принята причина игры на "что-то". И как вы поняли из темы поста, это что-то было — установка проигравшим менеджера рабочего стола KDE 4, по возможности, последней версией (на время написания статьи, у меня в локальном репозитарии Бунты была версия 4.1.4).

Игра была напряжённой, сперва побеждал я со счётом 2:1. Кстати сказать, по комментариям моих друзей и по статистике, у меня были неплохие шансы на победу, всем казалось, что у меня есть транспортир. Так как игра шла до 3 очков, мне достаточно было забить один гол, но...

... но судьба-злодейка не позволила мне забить этот мячик ни разу, и потому, методично проигрывая, сперва 2:2, потом 3:2, я, можно сказать, стал счастливым обладателем пакета kde, а потом уже и kdebase. Первый пакет это установка базового KDE, а второй — его основных приложений (ведь это было бы не по правилам уговора, поставить KDE и продолжать пользоваться Nautilus'ом).

Если учесть то, что я никогда в жизни не сидел и не ставил KDE с нуля, мне пришлось это сделать. Ставятся пакеты относительно быстро, если локальный репозиторий, и занимают где-то 700-800 мб свободного пространства. Первое, что бросается в глаза, это интерфейс чем-то сравнимый с Windows Vista. Вы уведите его чёрные рамочки до тех пор, пока я не найду как это всё можно сменить. На рисунке ниже, вы видите "коробочный" интерфейс, где одновременно помещены разные приложения, без предварительной настройки их внешнего вида:

Знакомство с КДЕ

Вообще, внешний вид, это всего лишь мелочь, подумал я, как оказалось не совсем, мало того, что мои Gnome-приложения, потеряли свой первоначальный вид, так оказалось, что KDE со своим декоратором тормозит у меня так сильно, что я начал жалеть об этой игре вообще.

Пока я решал проблемы с увеличением производительности моей, я столкнулся с Удивительными вещами. Они могут быть неудивительны для вас, но я, ни разу не видевший KDE больше 10 минут, после использования Gnome в течении полутора лет, начал удивляться.

Итак Удивительная вещь №1: в Gnome, когда происходит выбор темы или цветов рабочего окружения, окна изменяют свой окрас мгновенно. В KDE для этого нужно смотреть в маленький прямоугольник наверху, что на мой взгляд очень неудобно. Ведь, получается, что мне нужно вообразить как будет выглядеть моё окно, после применения параметров. Конечно, можно сохранить промежуточный профиль с цветами, чтобы попробовать подбирать дальше, но это решение не для меня.

Вот и цвета

Удивительная вещь №2 заключается в том, что оказывается чтобы применить сглаживание к шрифтам (а я скажу вам, что оно по-умолчанию ужасно) мне нужно перезапустить приложения, если только не само KDE. Ах да, ещё можно ввести дополнение к этой удивительной вещи. Взгляните, оказывается в KDE не хватает места для сообщений в маленьких диалоговых окнах. Поэтому там существует полоса прокрутки. Жаль, конечно, что создатели не предусмотрели этого и не вставили перевод строки (ведь Gnome сам переносит и всё умещает. Такая вот у них политика):

Удивительная вещь №3: KDE поражает своими настройками графического интерфейса (это первое, с чем я столкнулся). Вы можете менять тут ВСЁ, вплоть до бесполезных, на мой взгляд, вещей. Можно взять красивую тему, и испортить её настройками KDE, либо взять плохую тему, и настройки KDE, думаю, вам не помогут. Можно убирать кнопки управления экраном, можно их добавить, удалить, переместить, можно изменить даже толщину бордюра окон, причем безо всяких мыслимых ограничений. Такое ощущение, что скрипту, где содержится команда 'rm -rf /' дали права root'а:

Напоследок, мне понравилось не только то, что Wine после завершения полноэкранного OpenGl приложения "упорядочил" мне окна:

но и то, что пока я писал эту статью я получил вот это:

Я думаю, на сегодня пока всё. У меня на тот день, осталось много неразрешённых проблем, таких как отсутствие звука в системе (похоже это связано с использованием мной PulseAudio, отключение декораций, увеличение производительности всего, что тормозит). А ещё, мне хочется закончить эту статью мыслью: "Мне стыдно, что я поставил KDE". Но неделя ещё длинная, я успею исправить все эти проблемы.

Мне кажется, или мои глаза становятся красными...

16 нояб. 2008 г.

Создаём пакет для Ubuntu. Часть 6. Использование Autotools

Итак, небольшое вступление... После многочисленных поисков, был найден небольшой, первый, я бы сказал, шаг к тому, чтобы осознать как же все-таки создаются распространяемые дистрибутивы. Для меня, основной сложностью в усвоении этой методики - это была проблема в познании языка M4, равно как и сама концепция файла configure.in. Видите ли, чтобы создать пакет требуется всего немного: написать вручную файл configure.in, в каждом используемом каталоге создать свой файл Makefile.am, потом выполнить ряд скриптов, сконфигурировать пакет и, если все прошло удачно, собрать его командой make.

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

Продолжим. Для следующего метода вам понадобятся так называемые autotools или autotoolset. Найти их можно по этому адресу http://autotoolset.sourceforge.net/. Здесь пакет доступен в качестве либо исходных кодов, либо в виде rpm пакета. Я думаю вам не составит труда воспользоваться утилитой alien для преобразования rpm пакета в deb.

После того, как вы установите его, вам следует изменить некоторые скрипты с помощью текстового редактора. А именно, исправить первую строку, где встречается использование sh на bash:

Вместо
#!/bin/sh
...

Записать
#!/bin/bash
...

Если так не сделать, то возможна работа с ошибками таких скриптов, как acmkdir и gpl, генерирующих необходимые файлы и директории.

Далее, когда вы все сделали, и имеете систему подготовленной к использованию, давайте попробуем создать наш первый распространяемый пакет, который так и назовем Hello. Кстати сказать, если вам нужен первоисточник, где я почерпнул необходимую информацию, то советую вам ознакомится с документом Developing software with GNU раздел Hello world with acmkdir.

Перейдите в любой каталог, где бы вы хотели начать создание своего приложения. В моем примере, я решил использовать каталог /tmp и выполните в нем команду acmkdir hello. В качестве аргумента я указал название моего пакета hello. Далее, оно задаст вам ряд вопросов, касающихся разработчика, и, в итоге, вам нужно согласиться с тем, что вы ввели. Вы должны получить на экране следующее:

$ acmkdir hello
Ready to create a new distribution skeleton directory.
The current working directory is:
--> /tmp
If you make a mistake and need to abort, press ctrl-C.

Name of distribution: hello
Your full name: Vest
Your email address: just@ask.me

Do you want to proceed? (y/n) y
+ Mode is default
+ Making directory hello
+ Making src directory
+ Making doc directory
+ Making m4 directory
+ Making config directory
+ Making default text files
+ Making INSTALL file link
+ Running reconf
- aclocal.
/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB
/usr/share/aclocal/lf_x11.m4:33: run info '(automake)Extending aclocal'
/usr/share/aclocal/lf_x11.m4:33: or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
- autoconf.
- autoheader.
autoheader: warning: missing template: CXX_HAS_BUGGY_FOR_LOOPS
autoheader: Use AC_DEFINE([CXX_HAS_BUGGY_FOR_LOOPS], [], [Description])
autoheader: warning: missing template: CXX_HAS_NO_BOOL
autoheader: warning: missing template: NDEBUG
autoheader: warning: missing template: YOUR_OS
- automake.
configure.ac:21: installing `config/config.guess'
configure.ac:21: installing `config/config.sub'
configure.ac:17: installing `config/install-sh'
configure.ac:17: installing `config/missing'
Makefile.am: installing `./INSTALL'
Makefile.am: installing `./COPYING'
configure.ac:16: required file `config.h.in' not found

Distribution directory is ready.
Please make sure to keep the files AUTHORS, NEWS, README, THANKS up to
date before cutting a distribution.

В 4-ой строке снизу (или 5-ой, если считать по символам /n :) ), видно, что в автоматически созданном файле configure.ac в строке 16 отсутствует шаблон config.h.in. Нам он, собственно не нужен, потому эту строку можно смело комментировать командой dnl, или совсем удалить её.

После каждого изменения файла configure.ac всегда следует выполнять скрипт reconf

$ ./reconf
- aclocal.
/usr/share/aclocal/lf_x11.m4:33: warning: underquoted definition of LF_PATH_XLIB
/usr/share/aclocal/lf_x11.m4:33: run info '(automake)Extending aclocal'
/usr/share/aclocal/lf_x11.m4:33: or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
- autoconf.
- autoheader.
autoheader: error: AC_CONFIG_HEADERS not found in configure.ac
- automake.

Для того, чтобы пересобрать все зависящие от него скрипты. Потом можно выполнить сам скрипт ./configure и make. В результате этого должно пройти конфигурирование и компиляция/сборка несуществующих исходных кодов. Теперь давайте создадим некоторый файл в каталоге src, с которого будет выполняться запуск нашего "Привет Мира".

/tmp/hello$ gedit src/main.cxx
// Vest (c) 2008
// Hello World
// main.cxx

#include

int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}

А потом, подправим шаблон Makefile.am, который по-умолчанию пуст. Приведем некоторые возможные опции файла Makefile.am:

ПеременнаяОписание
bin_PROGRAMS = prog1 prog2 ...Список исполняемых файлов, которые будут скомпилированы с помощью 'make', и установлены с помощью 'make install' в каталог '/prefix/bin', где 'prefix', обычно, это '/usr/local'.
lib_LIBRARIES = libfoo1.a libfoo2.a ...Список всех библиотек, которые будут скомпилированы с помощью 'make', и установлены с помощью 'make install' в каталог '/prefix/lib'.
prog_SOURCES = foo1.c foo2.c ... header1.h header2.h ...Список всех файлов, которые образовывают исходный код программы, включая заголовочные файлы. Присутствие заголовочных файлов не подразумевает того, что они будут установлены в '/prefix/include', но означает то, что они будут добавлены в дистрибутив ('make dist'). Если вы хотите установки публичных заголовочных файлов, вы должны упомянуть их в 'include_HEADERS'. Automake генерирует абстрактные правила для файлов C, C++ и Fortran. Для других языков, Вы должны предоставлять свои собственные правила.
prog_LDADD = $(top_builddir)/dir1/libfoo.a -lbar1 -lbar2 ...Список библиотек, которые должны быть подлинкованы с вашим исходным кодом. Установленные библиотеки должны использоваться с флагами '-l'. Удаляемые библиотеки должны упоминаться с использованием абсолютных имён (пример указан в предыдущем столбце).
prog_LDFLAGS = -L/dir1 -L/dir2 -L/dir3 ...Добавляет флаги '-L', которые нужны для поиска установленных библиотек, которые вы хотите подлинковать в 'prog_LDADD'.

Файл Makefile.am будет иметь вид:

/tmp/hello$ gedit src/Makefile.am
# Copyright (C) 2008 Vest <ваш@почтовый.ящик>
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

bin_PROGRAMS = hello
hello_SOURCES = main.cxx

Теперь пакет можно реконфигурировать, и собирать (далее я приведу только последнюю, нужную информацию о том, что компиляция прошла успешно)

$ ./reconf
$ ./configure
$ make
...
Making all in src
make[1]: Вход в каталог `/tmp/hello/src'
g++ -DPACKAGE_NAME=\"hello\" -DPACKAGE_TARNAME=\"hello\" -DPACKAGE_VERSION=\"0.0.1\" -DPACKAGE_STRING=\"hello\ 0.0.1\" -DPACKAGE_BUGREPORT=\"Vest\ just@ask.me\" -DPACKAGE=\"hello\" -DVERSION=\"0.0.1\" -DCXX_HAS_BUGGY_FOR_LOOPS=1 -DYOUR_OS=\"i686-pc-linux-gnu\" -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cxx
mv -f .deps/main.Tpo .deps/main.Po
g++ -g -O2 -o hello main.o
make[1]: Выход из каталога `/tmp/hello/src'
...
$ make distcheck
...
=============================================
hello-0.0.1 archives ready for distribution:
hello-0.0.1.tar.gz
hello-0.0.1.tar.bz2
=============================================

Как вы видите, было создано два архива. Внутри каждого из них лежат наши исходные файлы, доступные для распространения. Кстати сказать, внутри архивов наша программа будет лежать в каталоге 'hello-0.0.1'. Это пригодится нам при создании распространяемого пакета скомпилированного приложения. Проверить то, что наше приложение установится и запустится в системе можно следующим образом:

$ sudo make install
...
$ hello
Hello World!
$ whereis hello
hello: /usr/local/bin/hello
$ sudo make uninstall
...
$ hello
bash: /usr/local/bin/hello: No such file or directory

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

20 авг. 2008 г.

Создаём пакет для Ubuntu. Часть 5a. Пример из helloworld.

Как вы, возможно, видели, некоторых каталогов, описанных в предыдущем разделе у вас в Ubuntu не существует. Это связано с тем, что структура файловой системы различается от дистрибутива к дистрибутиву, сохраняя, конечно, определённую концепцию описанную в Filesystem Hierarchy Standard.

На сайте FTP консорциума GNU лежит программа Hello world основное назначение её в том, чтобы просто посмотреть продукт полностью удовлетворяющий GNU стандарту. Но мы его попробуем использовать для того, чтобы просто узнать значения некоторых переменных.

Скачайте и распакуйте эту программу куда-нибудь в /tmp. Для того, чтобы нам не жалко было её стереть. Зайдите туда из-под консоли и выполните команду:

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
...
configure: creating ./config.status
config.status: creating Makefile -- вот это нам понадобится
...

Eсли у вас возникнет ошибка, что не возможно создать "executable file", поставьте из репозитария пакет build-essential.

Итак, вы возможно обратили внимание на то, что вместо отсутствующего Makefile скрипт configure создал нам новый. Если вы его просмотрите то увидите следующее (нам отсюда нужна только верхняя часть:

$ cat Makefile
... (тут лежат комментарии)
SHELL = /bin/bash

srcdir = .
top_srcdir = .

prefix = /usr/local
exec_prefix = ${prefix}
... (а здесь остальной автоматически сгенерированный код)

Как вы видите префикс равен 'prefix = /usr/local'. В документе Filesystem Hierarchy Standard об этом сказано, что (4.8.2.1): "Иерархия /usr/local используется системным администратором при локальной установки программного обеспечения. Она не должна перезаписываться при обновлении системного программного обеспечения. Она может быть использована для программ и данных, которые совместно используются среди групп хостов, но которые не найдены в /usr. Локально установленное ПО должно быть помещено, предпочтительнее, в /usr/local, чем в /usr, если конечно оно не было установлено для замены или обновления ПО в /usr."

Так как я на своей памяти не встречал пакеты, которые записывались бы в /usr/local (тем более мы с вами будем делать наш собственный пакет, который в дальнейшем будет обновляться). Для этого выполним конфигурационный скрипт следующим образом, и просмотрим наш Makefile:

$ ./configure --prefix=/usr
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
...
$ cat Makefile
... (тут лежат комментарии)
SHELL = /bin/bash

srcdir = .
top_srcdir = .

prefix = /usr
exec_prefix = ${prefix}

bindir = ${exec_prefix}/bin
sbindir = ${exec_prefix}/sbin
libexecdir = ${exec_prefix}/libexec
datadir = ${prefix}/share
sysconfdir = ${prefix}/etc
sharedstatedir = ${prefix}/com
localstatedir = ${prefix}/var
libdir = ${exec_prefix}/lib
infodir = ${prefix}/info
mandir = ${prefix}/man
includedir = ${prefix}/include
oldincludedir = /usr/include
pkgdatadir = $(datadir)/hello
pkglibdir = $(libdir)/hello
pkgincludedir = $(includedir)/hello
top_builddir = .
... (а здесь остальной автоматически сгенерированный код)

Теперь уже всё можно свести в таблицу, чтобы было проще воспринять:


ПеременнаяПутьОписание
srcdir.Исходные коды
top_srcdir.Родительский каталог с исходными кодами (во вложенных директориях его значение равно '..'
prefix/usrКаталог, содержащий данные, совместно используемые несколькими машинами. Любая информация, меняющаяся со временем должна располагаться в другом каталоге
bindir/usr/binПервичная директория для исполняемых файлов
sbindir/usr/sbinДиректория содержащая незначительные файлы, обычно используемые системным администратором: восстановление системы, монтирование /usr раздела и т.д.
libexecdir/usr/libexecДиректория для установки исполняемых программ, которые чаще запускаются другими программами, чем пользователями
datadir/usr/shareИерархия для всех архитектурно-независимых данных, используемых совместно различными хостами
sysconfdir/usr/etcКаталог с файлами для конфигурирования хоста. Предпочтительно использование /etc
sharedstatedir/usr/comДиректория для установки файлов с архитектурно независимыми данными, которые могут быть изменены программой
localstatedir/usr/varДиректория для установки файлов с данными, которые могут быть изменены программами в процессе работы, и которые принадлежат одной конкретной машине
libdir/usr/libСодержит объектные файлы, библиотеки, внутренние бинарные файлы. Подразумевается, что они не используются напрямую пользователем или скриптами шелл
infodir/usr/infoДиректория для установки Info-файлов для этого пакета
mandir/usr/manКаталог верхнего уровня для установки страниц man для текущего пакета
includedir
oldincludedir
/usr/includeСюда помещаются все заголовочные файлы языка C
pkgdatadir/usr/share/helloЗдесь хранятся данные приложения hello. Например, Glade формы
pkglibdir/usr/lib/helloЗдесь хранятся данные библиотеки hello. Например, вспомогательные библиотеки
pkgincludedir/usr/include/helloЗдесь хранятся заголовочные файлы библиотеки hello

Здесь ещё можно добавить следующее, в каталоге /usr/include/pixmaps лежат различные картинки, используемые программой в процессе её жизнедеятельности. Про другие каталоги, такие как /usr/include/doc я ничего верно сказать не могу, так как не видел обобщённой информации по этому поводу. Скорее всего структура файловой системы основана на FHS, а потом идёт собственно набивка различными пакетами.