среда, 9 января 2013 г.

Установка сетевого принтера в Debian GNU/Linux 7.0 (wheezy)

После установки (в моем случае) Debian wheezy штатные утилиты гнома почему-то не устанавливали (а, возможно, и не должны) сетевого принтера. Но это не есть большой трудностью. Достаточно доустановить пакет system-config-printer. И после запуска кочанды system-config-printer из-под администратора легко найти и подсоединить принтер

Gnuplot: вывод в несколько окон

Если мы делаем графики в Gnuplot, то по умолчанию вывод этих графиков делается в окно с заголовком "Gnuplot(window id:0)". В других операционных системах заголовок, возможно, другой. Я использую Debian GNU/Linux 7.0 (wheezy). Но суть не в этом. Итак. Если мы дадим команду replot или plot, но с другими чем в предыдущем plot опциями, то наш предыдущий график будет затираться новым. Но что, если я хочу нарисовать еще один график не уничтожая предыдущего? Можно рисовать следующие графики в новом окне. Делается это командой:
>set terminal wxt n
где n - это некое число: 1,2,3 и т.д. Соответственно новое окно будет выводиться с заголовком "Gnuplot(window id:n)".

пятница, 4 января 2013 г.

Два монитора на компьютере с Debian

Хорошо, если у нас есть ноутбук с Debian wheezy. А что если у нас есть второй монитор и мы хотим его подсоединить к нашему ноутбуку? В моем случае второй монитор подсоединился автоматически, но при этом не только на нем вывод был с плохой разрешающей способностью, но и на экране самого ноутбука качество изображения изменилось не вbлучшую сторону. Вобщем встал вопрос: как "правильно" подсоединить второй монитор к нашему ноутбуку? Выполним программу xandr:
#xrandr
В моем случае вывод был такой:
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
LVDS1 connected (normal left inverted right x axis y axis)
   1366x768       60.0 +
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 509mm x 286mm
   1920x1080      60.0*+
   1280x1024      75.0     60.0  
   1152x864       75.0  
   1024x768       75.1     60.0  
   800x600        75.0     60.3  
   640x480        75.0     60.0  
   720x400        70.1  
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)
Достаточно прозрачный вывод. Если выполнить программу xrandr со следующими параметрами (их значения выбираем из вывода предыдущей команды):
#xrandr --output VGA1 --mode 1920x1080 --output LVDS1 --off
то графический вывод будет осуществляться только на присоединенный монитор. Если выполнить команду:
#xrandr --output VGA1 --off --output LVDS1 --mode 1366x768 --pos 0x0
то вывод будет выполняться только на экран ноутбука. Общая идея понятна. Теперь мы хотим следующее. При включении компьютера, если подсоединен второй монитор, нам надо, чтобы включался только этот второй моитор. Если второго монитора нет, то пусть включается только (а что ж еще?) монито ноутбука. Дя этого создаем файл /etc/X11/Xsession.d/45custom_xrandr со следующим содержанием (он запускается при запуске иксов):
xrandr | grep VGA1 | grep " connected "
if [$? -eq 0]; then
      # Внешний монитор отключен
      # Если мы хотим два показывающих монитора
      # xrandr --output VGA1 --mode 1920x1080 --pos 0x0 --output LVDS1 --mode 1366x768 --pos 0x0
      # Если мы хотим включенный только внешний монитор
      xrandr --output VGA1 --mode 1920x1080 --output LVDS1 --off
      if [$? -ne 0]; then
           # Если что-то не так
           xrandr --output LVDS1 --mode auto --output VGA1 --off
      fi
else
      # Внешний монитор не подключен
      xrandr --output LVDS1 --mode 1366x768 --output VGA --off
fi
Вот и все. Написано по материалам, взятым отсюда.

четверг, 28 июня 2012 г.

Создание GTK+ приложения на Оbjective-C

Создаем файлы такого содержания:
MainWindow.h:


#import <gtk/gtk.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>

id myMainWindow;

@interface MainWindow : NSObject{
GtkWidget *winMain; //главное GtkWindow
GtkWidget *button;
}


-(id)initWithArgCount:(int *)argc andArgVals:(char *[])argv;
-(void)destroyWidget; /* Освобождает ранее занятые ресурсы Gtk виджетами */
-(void)startGtkMainLoop; /* Стартует главный цикл обработки сообщений GTK */
-(void)printSomething; /* Пример некой Objective-C функции */

/** Cи фунции обратного вызова (обработчики сообщений)*/

void on_MainWindow_destroy(GtkObject *object, gpointer user_data);/* Вызывается, когда закрывается главное окно приложения */
void on_btnPushMe_clicked(GtkObject *object, gpointer user_data); /* Вызывается, когда мы жмем кнопку */

@end



MainWindow.m:


#import "MainWindow.h"

@implementation MainWindow

-(id)initWithArgCount:(int *)argc andArgVals:(char *[])argv{
if (self = [super init]) { //вызываем init родительского класса
winMain = gtk_window_new (GTK_WINDOW_TOPLEVEL); //создаем главное окно приложения
gtk_window_set_title (GTK_WINDOW (winMain), "Ну привет");
gtk_window_set_default_size(GTK_WINDOW(winMain), 230, 150);
button = gtk_button_new_with_label ("Нажми её!");//создаем кнопку
gtk_container_add (GTK_CONTAINER (winMain), button);
g_signal_connect (winMain, "destroy", G_CALLBACK (on_MainWindow_destroy), NULL);
//привязываем обработчики сообщений
g_signal_connect (button, "clicked", G_CALLBACK (on_btnPushMe_clicked), NULL);
gtk_widget_show_all(winMain); //показываем
}

myMainWindow = self; //назначаем C-compatible указатель
return self; //возвращаем указатель на этот объект
}

-(void)startGtkMainLoop{
gtk_main(); //стартуем основной цикл обработки сообщений gtk
}

-(void)printSomething{
NSLog(@"Printed from Objective-C`s NSLog function.");
printf("Also printed from standard printf function.\n");
}

-(void)destroyWidget{
myMainWindow = NULL;
if(GTK_IS_WIDGET (button)){
gtk_widget_destroy(button); //разрушаем кнопку
}
if(GTK_IS_WIDGET (winMain)){
gtk_widget_destroy(winMain); //разрушаем главное окно приложения
}
}

-(void)dealloc{
[self destroyWidget];
[super dealloc];
}

void
on_MainWindow_destroy(GtkObject *object, gpointer user_data){
gtk_main_quit(); //выходим из основного цикла обработки сообщений
}

void
on_btnPushMe_clicked(GtkObject *object, gpointer user_data){
printf("Button was clicked\n");
[myMainWindow printSomething]; //вызываем Objective-C функцию из Cи функции с помощью глобального указателяusing
}

@end


main.m:


#import "MainWindow.h"
#import <Foundation/NSAutoreleasePool.h>

int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//создаем пул
gtk_init(&argc, &argv); //инициализируем gtk
MainWindow *mainWindow = [[MainWindow alloc] initWithArgCount:&argc andArgVals:argv];
//создаем GUI
[mainWindow startGtkMainLoop]; //стартуем главный цикл обработки сообщений GTK loop
[mainWindow release]; //освобождаем ресурсы занятые GUI
[pool release]; //освобождаем пул
return 0; //выходим из приложения
}


Компилируем это все из текущей директории следующей командой:
$ gcc `pkg-config --cflags --libs gtk+-2.0` -lgnustep-base -fconstant-string-class=NSConstantString MainWindow.m main.m -I /usr/include/GNUstep/ -L /usr/lib/GNUstep/ -std=c99 -O3

Запускаем на выполнение: ./a.out и видим:

Также выводиться сообщение в консоль.
Стоит ли говорить, что необходимо наличие установленных GTK и Objective-C? Необходимы пакеты gnustep-core-devel и libgtk2.0-dev. Все действия проводились на машине с установленной Debian Wheeze.
Да, еще надо сделать следующее. Если выскакивает ошибка "error: #error The current setting for native-objc-exceptions does not match that of gnustep-base ... please correct this." необходимо в файле /usr/include/GNUstep/GNUstepBase/GSConfig.h строку (221-я):
#define BASE_NATIVE_OBJC_EXCEPTIONS 1
заменить на:
#define BASE_NATIVE_OBJC_EXCEPTIONS 0

Переменные окружения, влияющие на способ компиляции программ в GCC

C_INCLUDE_PATH - (для языка си) содержит список каталогов для поиска включаемых по директиве include заголовочных файлов, аналогична опции командной строки -isystem;
COMPILER_PATH - содержит список путей к каталогам, где компилятор проводит поиск своих подпрограмм, в случае ,если они не были найдены с помощью установки переменной GCC_EXEC_PREFIX;
CPATH - (для языков си, си++, объектный си) действует аналогично опции командной строки -I. Содержит список путей для поиска включаемых заголовочных файлов. Эти пути просматриваются после путей, указанных в -I;
CPLUS_INCLUDE_PATH - (для языка си++)содержит список каталогов для поиска включаемых по директиве include заголовочных файлов, аналогична опции командной строки -isystem. Эти каталоги просматриваются после каталогов, указанных в -isystem;
DEPENDENCIES_OUTPUT - препроцессор использует эту переменную для определения файла куда будут записываться правила зависимостей компоновки и цели, для которой создается отдельное правило. Аналогична сочетанию опций командной строки -MM, -MF, и -MT;
GCC_EXEC_PREFIX - используется для назначения префикса имен, вызываемых компилятором подпрограмм;
LANG - используется для указания компилятору набора кодировки, используемого для представления отдельных расширенных буквенных символов, текстовых строк и комментариев;
LC_ALL - замещает любые установки переменных LC_MESSAGES и LC_СTYPE;
LC_СTYPE - указывает способ кодировки расширенных буквенных знаков, имеющих мультибайтное представление;
LC_MESSAGES - указывает язык, используемый для выдачи компилятором диагностических сообщений;
LD_LIBRARY_PATH - применяется при выполнении программ. Предоставляет список путей, в которых программы во время своего запуска находят разделяемые библиотеки;
LD_RUN_PATH - применяется при выполнении программ. Предоставляет список путей, в которых программы во время своего запуска находят файл, содержащий имена символов и соответствующие им адреса. Аналогична опции -R утилиты ld;
LIBRARY_PATH - задает пути, где компоновщик ищет компоновочные сценарии и библиотеки, указанные опцией -l("эль"). Эти пути просматриваются после путей, заданных опцией -L;
OBJC_INCLUDE_PATH - (для объектного си) аналогична опции командной строки -isystem. Содержит список путей, где ищутся заголовочные include файлы. Эти каталоги просматриваются после каталогов, указанных в -isystem;
SUNPRO_OUTPUT - аналогична DEPENDENCIES_OUTPUT ?;
TMPDIR - содержит полный путь, где компилятор будет сохранять временные файлы;