суббота, 11 октября 2014 г.

Установка googleearth на debian

Чтобы проинсталлировать googleearth на Дебиане  не нужно идти на сайт гугла, загружать пакет googleearth и инсталлировать его командой dpkg. Нужно делать следующее. Выполняем в командной оболочке под администраторской учетной записью: 
#apt-get install googleearth-package
Потом из учетной записи обычного пользователя делаем: 
#make-google-earth-package
В текущей директории появляется пакет googleearth*.deb, который и устанавливаем командой:  
#dpkg -i googleearth*.deb

четверг, 11 сентября 2014 г.

Установка драйвера NVIDIA на ноутбук с линукс дистрибутивом Kali

Проведем краткий обзор установки проприетарного драйвера для видеокарты NVIDIA.
Смотрим, какая видеокарта установлена в нашем компьютерне:
#lspci | grep VGA
Делаем обновление системы:
#apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y
Устанавливаем заголовочные файлы:
#apt-get -r install linux-headers-$(uname -r)
Устанавливаем ядро NVIDIA:
#apt-get install nvidia-kernel-$(uname -r)
Устанавливаем DKMS для NVIDIA:
#apt-get install nvidia-kernel-dkms
Во время выполнения этой команды появяться два диалоговых окна. Первый будет говорить про конфликт между установленным по умолчанию драйвером nouveau (для NVIDIA он устанавливается по умолчанию) и устанавливаемым нами драйвером, а второй будет говорить, что у вас нету файла xorg.conf (если его у вас действительно нет, а по умолчанию он отсутствует) и его надо создать. На обоих диалогах отвечаем ОК. 
Приступим к созданию файла xorg.conf. Для этог делаем следующее:
#apt-get install nvidia-xconfig
И запустим команду:
#nvidia-xconfig
#reboot
Если не получается войти в графический интерфейс после перезагрузки - вы можете вернуться к предыдущему состоянию просто удалив xorg.conf.
Если загрузка GUI прошла успешно, то проверяем работу GLX модуля:
#apt-get install mesa-utils
#glxinfo | grep -i "direct rendering"
Вывод должен быть следующим:
"direct rendering: Yes"
Проверяем, загружен ли модуль NVIDIA:
#lsmod | grep nvidia
Следующая команда не должна давать никакого вывода:
#lsmod | grep nouveau
Драйвер nouveau должен быть заблокирован. Убедитесь в этом посмотрев содержание следующих файлов:
/etc/modprobe.d/nvidia.conf
/etc/modprobe.d/nvidia-blacklists-nouveau.conf
/etc/modprobe.d/nvidia-kernel-common.conf
Когда-то эти файлы надо было редактировать вручную. Сейчас это делается автоматически при инсталляции проприетарного драйвера.
Для того чтобы удалить проприетарный драйвер NVIDIA (если уж что-то пошло совсем не так), делаем такие действия:
#apt-get remove nvidia-kernel-dkms
#reboot
Описанные выше шаги типичны для всех компьютеров с картой NVIDIA и не есть специфическими для какого-либо дистрибутива.
Если у нас нотбук, то может возникнуть такая проблема. Обычно NVIDIA карта устанавливается в ноутбук как вторая видео карта (в виду ее высокого энергопотребления, как я понимаю). В качестве первичной обычно используется что-то другое, типа интеловской. Поэтому для использования "совместно" двух видеокарт на линукс системах был создан проект bumblebee. Демон bumblebeed запускается при старте системы. Клиентом этого сервиса является команда optirun. Аргументом этой команды является программа, которую мы хотим выполнять на NVIDIA карте. Со стороны это выглядит так. Мы имеем два конфигурационых файла для Х-сервера (если вы дочитали до этого момента, то вам не надо объяснять, что это такое), один для одной видеокарты, второй для другой. В качестве основной конфигурации Х-сервера мы используем "первый" файл (там указан, например, интеловский видеодрайвер), но как мы только используем команду optirun, bumblebeed для аргумента optirun использует "вторую" конфигурацию Х-сервера, а там указано испорльзование NVIDIA драйвера.
Теперь рассмотрим установку всего этого на систему вместе с CUDA.
#apt-get install freeglut3-dev libxmu-dev
Скачиваем пакет virtualgl http://sourceforge.net/projects/virtualgl/
Делаем
#dpkg -i virtualgl*.deb
#vim .bashrc
добавляем строку:
export PATH=$PATH:/opt/VirtualGL/bin
# vim /etc/apt/sources.list
добавляем строку:
deb http://ftp.debian.org/debian wheezy-backports main contrib non-free
#apt-get update  
#apt-get install bumblebee-nvidia primus
#apt-get install nvidia-glx
Создаем следующие файлы и редактирем их (после изучения комментариев, написанных в них):
#cp /etc/bumblebee/xorg.conf.nvidia.dpkg-new /etc/bumblebee/xorg.conf.nvidia
#cp /etc/bumblebee/bumblebee.conf.dpkg-new /etc/bumblebee/bumblebee.conf
В первом делаем такие изменения:
Section "Device"
Identifier "DiscreteNvidia"
Driver "nvidia"
VendorName "Nvidia Corporation
BusID "PCI:03:00:0"
Значение BusID узнаем из вывода команды:
#lspci | egrep 'VGA|3D'
Нюанс: вывод будет показывать 03:00.0 - то есть точку заменяем на двоеточие.
Во втором файле редактируем соответствующие строки: 
Driver=nvidia
KernelDriver=nvidia-current
Рестартуем демон:
#/etc/init.d/bumblebeed restart
Ну и тестируем, сравниваем скорости, которые будут выводиться в консоли:
#optirun glxgears
#glxgears
Сравнивая выводы этих команд мы должны увидеть разницу в скорости выполнения команд на разазных видеокартах вашего ноутбука. Если до этого момента все прошло как написано, то установка CUDA должна пройти без неожиданностей. Загружаем и запускаем загруженный бинарный файл на выполнение, отвечаем на пару вопросов и получаем возможность писать программы на CUDA. Помним, что работаем на ноутбуке, а значит NVIDIA карта у нас "вторая". Поэтому откомпиллированные CUDA программы запускаем используя optirun.
Написано по материалам со следующих ссылок:
http://www.blackmoreops.com/2014/06/27/kali-linux-1-0-7-kernel-3-14-install-proprietary-nvidia-driver/
https://forums.kali.org/showthread.php?21956-%28Guide%29-Installing-Nvidia-Bumblebee-CUDA-for-Optimus-enabled-Laptops


среда, 21 августа 2013 г.

Понятие виджетов GNOME/GTK+

Попробуем коротко описать понятие виджета GTK. При изучении программирования на GTK необходимо понимать, что такое "программирование на Си в объектно-ориентированной манере". Речь идет не о объектном Си (языке программирования Objective C), а о об написании программ на "обычном" языке Си, но держа при этом написании в уме основные концепции ООП.

Объектно-ориентированный Си

  • Объектно-ориентированное программирование - это всего лишь метод организации данных и кодов. Библиотеки GNOME и GTK+ написаны на С, и их API состоит только из вызовов функций С. Тем не менее, код написан в объектно-ориентироанном стиле. Объектная ориентация не является частью языка С и ее пришлось имитировать. Имеется несколько характеристик объектов, относящихся к GNOME и GTK+, самыми важными из которых следует считать инкапсуляцию, наследование и методы.
  • Доступ к инкапсулированной информации может быть получен только посредством обращений к функциям, специально разработанным для этих целей. Эти функции называются методами.
  • Код, описывающий объект, называтся классом. Класс, из которого образуется другой класс, называется базовым. Все классы изначально происходят из GtkObject. Каждая структура включает в виде первого элемента полную структуру своего базового класса.
  • Для создания нового объекта используется метод. Все создающие объект функции имеют в своем имени слово new. Обычно функции, создающие  какой-либо виджет (кнопку, чекбокс и т.п.), возвращает указатель на структуру GtkWidget, а не структуру кнопки или чекбокса. Это возможно благодаря полиморфизму. Полиморфизм означает, что любой объект может рассматриваться в качестве одного из своих базовых классов.
  • Когда вызывается метод для работы с существующим объектом, адрес этого объекта передается как первый аргумент.
  • Методы всех классов в иерархии вызываются при использовании специальных макросов приведения типов данных. Для каждого виджета в GNOME и GTK+ имеется макрос приведения типов данных. Эти макросы делают несколько больше, чем просто приведение типов: во время работы приложения удостоверяют правильность приведения типов.
При программировании на  GTK важно понятие о событиях и их диспетчеризации.

 Последовательность диспетчеризации событий.

  • Происходит событие.
  • Соответствующая информация отправляутся менеджеру окон.
  • Менеджер окон имеет адрес очереди событий для каждого окна. Он преобразовывает полученные данные в стандартный для Х формат и ставит их в очередь, связанную с окном в которое послано событие.
  • Главный цикл приложения  использует низкоуровневую функцию системы Х для чтения событий из очереди. По идентификатору окна, присланному вместе с сообщением, программа определяет, какой из виджетов должен получить сигнал. Затем однп из функций GTK+ преобразует информацию в сигнал и передает его виджету.
  • Для каждого виджета существует функция, которая получает все поступающие сигналы.
  • Виджет просматривает список функций обратного вызова, которые связаны с определенным сигналом, и вызывает все эти функции.
Для создания сигнала можно применять функции g_signal_emit() g_signal_emit_by_name(). Соответствующие функции с префиксом gtk_ вместо g_ устарели и не рекомендуются для применения в "свежем" коде.Каждая функция обратного вызова имеет два общих параметра, но многие из функций имеют еще дополнительные параметры. Прототип самой простой функции обратного вызова выглядит так: 
void cb(GtkWidget*, gpointer); 
Если имеются дополнительные параметры, то они вставляются между двумя параметрами этого прототипа. Также кроме пустого типа могут возвращаться типы gint и boolean. На самом нижнем уровне создание события - это создание события Xevent. Xevent содержит тег, идентифицирующий окно, для которого это событие предназначено. Каждому событию соответствует своя структура. Каждая структура определена в виде двух частей. Первая - это собственно сама структура, а вторая - оператор typedef для этой структуры. Имена различаются только первым символом: имя структуры начинается символом подчеркивания.GdkEvent - это объединение нескольких структур событий. Чтобы облегчить задачу определения типа события и соответствующей ей структуры, первым полем во всех структурах является поле type. Для доступа к данным события напрямую можно выполнить приведение типа объединения к типу структуры. Какое именно приведение надовыполнить определяем из поля type.Информация о каждом событии содержится в структуре GSignalQuery. Ее поля заполняются с помощью функции g_signal_query().
typedef struct {
    guint signal_id;
    const gchar *signal_name;
    GType itype;
    GSignalFlags signal_flags;
    GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
    guint n_params;
    const GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
} GSignalQuery;
У каждого виджета есть внутренние установки, которые прикладная программа может читать или записывать.Приложению необходим интерфейс для обращения к этим установкам (аргументам)  внутри указанного виджета. То есть, чтобы прочитать или записать одно из этих значений, программа должна знать имя виджета, имя переменной и тип данных этой переменной. Итак, каждый аргумент имеет тип данных и права чтения/записи. Большинство аргументов имеют права и чтения и записи.Есть два способа установить значение аргументв внутри виджета.Есть фунции, закрепленные к определенному аргументу, который можно изменять с помощью этой функции. Соответственно есть фукция для чтения этого аргумента.Второй способ заключается в использовании структуры GtkArg, у которой три поля: GtkType - определяет тип данных, указательна строку, определяющую имя аргумента, и объединение различных типов данных.Когда виджет рождается и проходит свой путь от шаблона бит в памяти до графического объекта на экране, то происходят процессы создания, реализации, преобразования и отображения. При уничтожении виджета происходят: скрывание, уничтожение соответствия, деактивизация и разрушения. Виджет может скрываться и появляться вновь. При перемещении из одного окна в другое происходят уничтожение реализации, а потом реализация.Указанным этапам соответствуют такие функции:
*_new()
gtk_widget_destroy()
gtk_widget_unref()
gtk_widget_show()
gtk_widget_hide()
gtk_widget_map()
gtk_widget_unmap()
gtk_widget_realize()
gtk_widget_unrealize()
У виджетов есть также до пяти так называемых стилей (состояний):
GTK_STATE_NORMAL
GTK_STATE_ACTIVE
GTK_STATE_PRELIGHT
GTK_STATE_SELECTED
GTK_STATE_INSENSITIVE
Для первого "философского" понимания, что такое виджет GTK - этого достаточно.

четверг, 8 августа 2013 г.

Строковые типы в Windows

В Windows существует возможность писать код, который будет откомпилирован и корректно работать со строками или в ANSI представлении или юникоде, в зависимости от значения переменной _UNICODE. Рассмотрим это на примере.
char* string1 = "ANSI string";// не зависит от значения _UNICODE
wchar_t* string2 = L"UNICODE string";// не зависит от значения _UNICODE
LPTSTR string3=_T("or ANSI or UNICODE string"); // зависит от значения _UNICODE
LPTSTR string4=TEXT("or ANSI or UNICODE string"); // то же самое
LPTSTR -это макрос, который во время работы препроцессора раскрывается либо в wchar_t* либо в char*, в зависимости от _UNICODE. То же самое относится к макросам _T и TEXT - они раскрываются в L либо в "ничего".
Приведем таблицу соответсвия некоторых таких макросов и типов, а также наиболее типичных функций, работающих со строками. Имена типов комбинируются из достаточно простых и понятных составляющих:
LP означает long pointer,
C - constant,
STR - string,
WSTR - wide character string
, но все равно можно легко запутаться, поэтому эта табличка будет полезна:
В первой колонке написаны макросы которые раскрываются в значения во второй колонке, если мы работаем с ANSI строками или в значения в третей колонке, если мы работаем с юникодом. Вобщем, если мы хотим писать "универсальный" код, нам надо вместо функций или типов пользоваться соответствующими макросами.
 Более обильная информация по подобной теме представлена в MSDN в разделе Generic-Text Routine Mappings.

вторник, 30 апреля 2013 г.

Минимальный sudoers

Приходится пользоваться утилитой sudo, достаточно редко, чтобы забыть как правильно писать правила в файл sudoers, но достаточно часто, чтобы пожалеть время, растрачиваемое на ковыряние довольно сложного мануала по данной теме. Это команда, которая необходима каждому, кто пользуется юникс.
Итак - перед нами "коза" файла /etc/sudoers:
User_Alias USER1 = myName
Host_Alias LOCALHOST = myHost
Cmnd_Alias COMMAND1 = /path/to/my/programm.exe
USER1 LOCALHOST = NOPASSWD: COMMAND1
myName - наш логин в систему;
myHost - имя нашего компьютера;
Теперь мы можем выполнять нашу программу без ввода пароля:
#sudo /path/to/my/programm.exe
По аналогии можно добавить пользователя USER2, USER3 и т.д. или команду COMMAND1, COMMAND2 и т.д.