Створення ефектних екранних повідомлень за допомогою Ghosd і Perl (исходники), Різне, Програмування, статті

Програмний код і підходи, що описуються в даній статті, – це тільки приклад можливої ​​реалізації екранних повідомлень. Вони розраховані на машину, що працює в закритій мережі, і не підходять для машини, що має незахищене з’єднання з Інтернетом, оскільки при цьому сторонні шкідливі програми зможуть виконувати на машині довільний неконтрольований код.


Виведені на екран повідомлення для графічного представлення робочого столу в Windows і Linux існують вже багато років. Нещодавно з’явилися безрамковий прозорі вікна для робочого столу Linux відкрили графічні можливості нового рівня. Середа Ghosd дозволяє створювати екранні повідомлення нового покоління – із згладженими шрифтами, кольоровою гамою True Color, тінями, прозорістю і можливістю завантаження зображень з файлів.


Використовуючи Perl і деякі спеціально скомпільовані програми Ghosd, я покажу вам, як створити свою власну систему повідомлень про події. За допомогою простих правил зіставлення з ключовими словами і клієнт-серверної конфігурації ви зможете отримувати екранні повідомлення з усіх ваших систем, як віддалених, так і локальних ..


Вимоги


Апаратне забезпечення


Потужності будь-якого ПК, виробленого пізніше 2000 року, з великим запасом вистачить для компілювання і виконання програмного коду. Якщо у вас є графічний робочий стіл, у вас швидше за все вже є процесор достатньої потужності.


Програмне забезпечення


Програма Ghosd вимагає наявності бібліотек Pango та Cairo. При компіляції та конфігуруванні Ghosd ці бібліотеки вже повинні бути встановлені. Зверніться до розділу Ресурси, Де є посилання на бібліотеки Cairo і Pango, або зробіть ще один крок вперед і встановіть небудь дистрибутив Linux, в якому ці бібліотеки уже є. Я рекомендую Vector Linux, оскільки в ньому вже встановлені і налаштовані всі бібліотеки і візуальні ефекти, так що ви можете зайнятися безпосередньо Ghosd.


Після установки Pango та Cairo необхідно скомпілювати саму програму Ghosd. Завантажте та розпакуйте архів, що містить вихідний код Ghosd. Потім скомпілюйте його за допомогою команди ./configure && make install. По завершенні процесів установки і настройки ознайомтеся з деякими варіантами використання Ghosd, перейшовши в каталог прикладів програм. Ghosd частково написаний як бібліотека функцій, що допомагає вашим додаткам використовувати метафору розробки екранних зображень. По суті, наведені приклади – це невеликі програми на мові C, що ілюструють не тільки те, як використовувати Ghosd з командного рядка, але й те, як інтегрувати його у ваші програми.


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


Модифікація text.c для використання в командному рядку


Відкрийте каталог прикладів програм і запустіть програму text.c допомогою команди ./text. В нижньому правому куті екрану ви побачите закодований в програмі текст білого кольору. Для наших цілей ми хотіли б мати можливість задавати колір, положення і зміст текстового повідомлення. Замість того щоб створювати нову програму, змінимо існуючу програму text.c у відповідності з нашими вимогами. Якщо ви хочете пропустити цей крок, завантажте готовий файл text.c, включений до архіву вихідного коду, і скомпілюйте його за допомогою команди make.


Додайте наведені нижче змінні в розділ оголошень змінних.


Лістинг 1. Оновлений розділ оголошень test.c





int posX = -50;
int posY = -50;
float red = 1.0;
float green = 1.0;
float blue = 1.0;
int ftSize = 30;
int fadIn = 300;
int fadOut = 1500;
char displayText[500] = “default message”;


Це змінні за замовчуванням для завдання положення, змісту тексту, кольору і розміру шрифту, швидкості появи і зникнення зображення в мілісекундах, а також масиву для зберігання відображуваної рядка. Тепер необхідно змінити відображуваний фрагмент тексту з урахуванням зазначеного кольору. У функції візуалізації (render) змініть рядок cairo_set_source_rgba(cr, 1, 1, 1, 1.0); на cairo_set_source_rgba(cr, red, green, blue, 1.0);. Це дозволить вам використовувати значення кольорів, передані через параметри командного рядка.


Необхідно також змінити програму, щоб вона виводила повідомлення за замовчуванням, а не давала збій, якщо в командному рядку задані не всі параметри. У функції main видаліть рядки, наведені нижче.


Лістинг 2. Закодоване в main () екранне повідомлення





pango_layout_set_markup(layout,
“<span font_desc=”Trebuchet 30″>”
“some sample text using <b>ghosd</b>”
/* “ار�~Jد” */
“</span>”, -1);
ghosd = ghosd_new();
ghosd_text_set_position(ghosd, -50, -50, layout);
ghosd_set_render(ghosd, render, layout);
ghosd_flash(ghosd, 300, 1500);


Після видалення зазначеного вище коду введіть код перевірки на помилку і виведення повідомлення за замовчуванням, наведений нижче.


Лістинг 3. Перевірка на помилку і висновок повідомлення за замовчуванням за допомогою main ()





if( argc == 10 )
{
posX = atoi(argv[2]);
posY = atoi(argv[3]);
red = atoi(argv[4]);
green = atoi(argv[5]);
blue = atoi(argv[6]);
ftSize = atoi(argv[7]);
fadIn = atoi(argv[8]);
fadOt = atoi(argv[9]);
sprintf(displayText, “<span font_desc=”Trebuchet %d”>%s</span>”, ftSize, argv[1]);
}else{
sprintf(displayText,”<span font_desc=”Trebuchet 30″>Incomplete command</span>”);
}
pango_layout_set_markup(layout, displayText, -1 );
ghosd = ghosd_new();
ghosd_text_set_position(ghosd, posX, posY, layout);
ghosd_set_render(ghosd, render, layout);
ghosd_flash(ghosd, fadIn, fadOt);


Тепер, коли ми ввели простий код перевірки помилок і модифікували формат Pango, текст буде виводитися так, як зазначено в командному рядку, з заданим розміром і кольором шрифту і параметрами зміни яскравості. Створіть нову виконувану програму виведення тексту за допомогою команди make. Запустіть програму виведення тексту для Ghosd командою типу ./text “red text example” -150 -150 1.0 0.1 0.1 40 500 2000. Наведена командний рядок виведе текст “red text example” червоним шрифтом розміром 40pt в точці з координатами екранними -150, -150. Протягом 500 мілісекунд яскравість буде збільшуватися, а потім в Протягом 2000 мілісекунд знижуватися до нуля.


У каталозі прикладів програм є приклад виведення на екран зображення, прекрасно підходить для наших цілей. Введіть команду ./image /usr/share/pixmaps/x264.png -x 40 -y 40 для виведення на екран простого зображення. Наведений нижче малюнок ілюструє одночасне виведення тексту і графічного зображення.


Рисунок 1. Приклад виведення тексту та зображення в Ghosd
Приклад виведення тексту та зображення в Ghosd 


Висновок екранних повідомлень з використанням Perl і Ghosd


Загальна стратегія: клієнт-серверний підхід


Програма Ghosd дозволяє виводити на екран текст і зображення з будь-якими варіаціями розміру, кольору та стилю. Щоб ефективно використовувати ці можливості для стеження за повідомленнями про стан системи, повідомленнями електронної пошти і будь-якими іншими параметрами, необхідно зберегти цю гнучкість і при цьому надати простий інтерфейс для її використання. Система, представлена ​​нижче, використовує клієнт-серверну архітектуру для прийому від локальних і віддалених машин подій, повідомлення про які необхідно вивести на екран.


Рядок повідомлення, відправлена ​​клієнтом, обробляється на предмет наявності заданих ключових слів (зчитувальних з файлу конфігурації), і відповідні дані виводяться на екран. Так, якщо сервер отримує рядок New e-mail from mark@developerWorks, Він знаходить ключове слово e-mail і виведе зображення, відповідне повідомлення електронної пошти, а також повний текст повідомлення в нижньому правому куті монітора. Якщо рядок повідомлення, відправлена ​​клієнтом, містить слово “error” (помилка), рядок повідомлення буде виведена повністю великими червоними літерами по центру екрана.


Приступимо до програмної реалізації, щоб подивитися, як все це працює на практиці.


Реалізація на сервері


Сервер повинен зчитувати файл конфігурації, щоб визначити, як відображати текст і зображення. Він також повинен виконувати нескінченний цикл для прослуховування підключень клієнтів до зазначеного порту. Після встановлення з’єднання – з локальною або віддаленою машиною – вхідні повідомлення обробляються на предмет наявності ключових слів, зазначених у файлі конфігурації. Текст або зображення виводяться на екран відповідно до параметрів у файлі конфігурації. Закінчивши на цьому огляд роботи програми, перейдемо до розділу оголошень змінних.


Лістинг 4. Оголошення osdServer.pl





#!/usr/bin/perl -w
# osdServer.pl – process incoming text events based on keyword matching and
# display using Ghosd
use strict;
use FileHandle;
use Socket;
if( @ARGV != 1 ){ die “specify a port to listen on ” }
my %osdHash = ();
my $proto = “”;
my $port = “”;
my $sockAddr = “”;
my $fullCmd = “”;

Далі йдуть підпрограми, починаючи з readOsdFile, яка зчитує файл osdServer.config і зчитує з нього потрібні ключові слова та параметри виводу повідомлення.


Лістинг 4. Підпрограма readOsdFile





# readKeyWordFile reads type, keywords, (text/image) parameters
# text parameters:
# X coordinate, Y coordinate, red, green, blue, font size, fade In, fade Out
# image parameters:
# image filename, X coordinate, Y coordinate
# osdServer.confg format is: type _#_ keywords _#_ osd parameters
sub readOsdFile
{
open(OSDFILE,”osdServer.config”) or die “no osdServer.config file: $!”;
while(<OSDFILE>){
# ignore comment lines
if( !/^#/ ){
chomp($_);
my @arrLine = split “_#_”;
$arrLine[0] =~ s/ //g;
$osdHash{ lc($arrLine[0]) }{ $arrLine[1] } = $arrLine[2];
}#if not a comment line
}#for each line in file
close(OSDFILE);
}#readOsdFile

Після завдання параметрів пошуку ключових слів і виведення зображення ми можемо перейти до простої підпрограмі зіставлення з ключовими словами matchWords.


Лістинг 5. Підпрограма matchWords





sub matchWords
{
my $msgString = $_[0];
my $type = $_[1];
# for the type specified
for my $kwList ( keys %{ $osdHash{$type} } )
{
# for each word
for my $checkWord ( split ” “, $kwList )
{
$checkWord =~ s/ //g;
if( $msgString =~ /$checkWord/i )
{
if( $type eq “text” )
{
$fullCmd .= qq{./text “$msgString” $osdHash{text}{$kwList} &};
}else
{
$fullCmd .= qq{./image -i $osdHash{image}{$kwList} &};
}
}#if matching word
}#for each check word
}#for each key word list
}#checkText

Підпрограма matchWords виробляє просту перевірку на наявність слів, вказаних у файлі osdServer.config, а потім формує команду для виведення інформації в залежності від типу відображуваного повідомлення. Наприклад, вона сформує команду Ghosd для виведення зображення, якщо є відповідне ключове слово і у файлі конфігурації задано зображення для виведення на екран. Задавши підпрограми, ми швидко переходимо до розгляду логіки короткої головної програми.


Лістинг 6. Логіка головної програми для osdServer.pl





readOsdFile();
$proto = getprotobyname(“tcp”);
socket(SERVER, PF_INET, SOCK_STREAM, $proto) or die “socket: $!
“;
$port = $ARGV[0];
$sockAddr = sockaddr_in($port, INADDR_ANY);
bind(SERVER, $sockAddr) or die “bind: $!
“;
listen(SERVER, SOMAXCONN) or die “listen: $!
“;
# listen forever
while( 1 )
{
my $acceptSock = accept(HANDLER, SERVER) or die “accept: $!
“;
my($acceptPort, $acceptIpAddr) = sockaddr_in($acceptSock);
autoflush HANDLER 1;
while(my $msgString = <HANDLER>)
{
chomp($msgString);
matchWords($msgString,”text”);
matchWords($msgString,”image”);
$fullCmd = `$fullCmd` unless $fullCmd eq “”;
$fullCmd = “”;
}#while handler
close HANDLER or die “close HANDLER: $!
“;
}#while forever

Перша частина логіки головної програми викликає readOsdFile для завдання зіставлення ключових слів і параметрів хешів (hash). Після стандартного коду прослуховування сокета запускається основний цикл, прослуховує нові з’єднання. Кожен раз при новому з’єднанні виконується перевірка на збіг з усіма ключовими словами тексту та зображення, зазначеними у файлі конфігурації. При кожному виявленні збігу до повної команді приписується відповідний текст; повна команда для відображуваного події виповнюється вся цілком. При такому підході задані для однієї події комбінований відображення (графіка плюс текст), наприклад, текстове повідомлення і зображення при отриманні електронної пошти, виводяться на екран строго одночасно.


Файл конфігурації


Тепер, коли серверний код готовий, можна приступити до створення власного файлу конфігурації для відображення тексту в такому вигляді, як вам цього хочеться. В якості стартової точки нижче наведений приклад файлу конфігурації:


Лістинг 7. Приклад файлу osdServer.config





text _#_ email _#_ -250 -250 0.1 0.1 1.0 20 100 4300
text _#_ SYS _#_ -150 -150 0.1 1.0 0.1 30 100 4300
image _#_ SYS _#_ /usr/share/pixmaps/taskmanager.png -x -510 -y -510

Нагадаємо, що формат файлу osdServer.config – type _#_ keyword _#_ ghosd parameters, Де параметри визначені типом, зазначеним у першому полі. Наприклад, в першому рядку зазначено, що якщо у вхідний рядку будь-де присутнє слово “email”, треба вивести повідомлення червоним шрифтом розміром 20 пунктів у позиції з координатами -250, -250, нарощуючи яскравість протягом 100 мс і потім знижуючи її до нуля через чотири секунди з невеликим. Рядок зображення вказує малюнок і координати його розміщення на екрані, а також стримає ключове слово “SYS.” Ми торкнемося його трохи пізніше, при розгляді приклад використання програми для стеження за файлами журналу.


Реалізація клієнта


Лістинг 8. Реалізація osdClient.pl





#!/usr/bin/perl -w
# osdClient.pl – send simple client text to server
use strict;
use IO::Socket::INET;
use POSIX qw(F_GETFL F_SETFL O_NONBLOCK);
my $sock = “”;
if( $#ARGV != 2 ){ die “specify a ip, port, text string” }
eval
{
$sock = IO::Socket::INET->new(
PeerAddr => $ARGV[0],
PeerPort => $ARGV[1]) // die “can”t set it up $!”;
$sock->blocking(0)
};
if( $@ =~ /socket/i )
{
die “die in record retrieval socket setup with $@”;
}
print $sock “$ARGV[2]
“;

Цей простий фрагмент програмного коду встановлює з’єднання з зазначеним сервером через вказаний порт і потім відправляє переданий йому в командному рядку текст серверу. Існує безліч прекрасних публікацій та посібників, що містять докладний опис мережних можливостей Perl.


При написанні цих скриптів (або завантаженні їх з архіву вихідного коду), простежте, щоб вони були розміщені в тому ж каталозі, що і приклади програм Ghosd; звичайно це каталог ghosd-0.0.1/examples.


Приклади реалізації та повідомлення


Запустіть програму osdServer.pl за допомогою команди perl osdServer.pl 9090. Серверна програма тепер буде постійно слухати порт 9090, намагаючись виявити TCP-підключення від будь-якого хоста. Припустимо, ви використовували приклад конфігурації, наведений вище. Ви можете випробувати побудовану систему виведення на екран, ввівши команду perl osdClient.pl 127.0.0.1 9090 “email test”. Результатом її виконання буде висновок на екран текстового повідомлення “email test” синім шрифтом.


Тепер ви готові рухатися вперед! Нижче наведено кілька складніших прикладів, щоб допомогти вам освоїтися.


Приклад повідомлення xmms


Для відображення назви програється в даний момент пісні при кожній зміні треку в xmms дотримуйтесь далі інструкцій. Перейдіть в діалогове вікно Preferences в xmms, натиснувши Ctrl+P. Виберіть вкладку general plug-ins і включіть опцію Song Change plug-in. Натисніть configure (налаштувати) і додайте наступний рядок:






/usr/bin/perl (fullpathTo_osdClient.pl) 127.0.0.1 9090 “%n xmms”

В результаті назва поточної пісні буде автоматично передаватися програмі osdServer.pl через клієнт. Для правильного розпізнавання подій xmms необхідно додати в файл osdServer.config наступну рядок:






text _#_ xmms _#_ -150 -150 1.0 1.0 0.1 20 500 2300

Приклад повідомлення системного журналу


Нижче приведена коротка програма, яка контролює ваш системний журнал на предмет появи будь-яких подій, і відправляє повідомлення програмі osdServer.pl:






tail -n0 -f /var/log/messages /  perl -lane “$_=substr($_,30,50);$r=`perl osdClient.pl 127.0.0.1 9090 “$_ SYS”`”

Рядок tail -n0 -f повідомляє про те, що потрібно перейти в кінець файлу і чекати нових змін. Потім наша коротка програма передає рядок програмі osdServer.pl за допомогою програми osdClient.pl, цей рядок складається з перших 50 значущих байтів записи у файлі журналу. Ключове слово “SYS”, яке вже зустрічалося в прикладі файлу osdServer.config, необхідно, щоб дозволити проведення перевірки на ключові слова для всіх системних повідомлень, незалежно від їх конкретного змісту.


Висновок і додаткові приклади


З двох останніх, більш складних, прикладів, ви повинні були зрозуміти, як інтегрувати сервер і клієнт екранних повідомлень Ghosd в вашу обчислювальну середу. Якщо ви хочете відстежувати події на віддалених машинах, просто скопіюйте програму osdClient.pl на віддалену машину і запустіть її, вказавши IP-адресу сервера замість 127.0.0.1. Обміркуйте, які послідовності вказати для перевірки на збіг, якщо вхідні дані отримані з віддаленого джерела. Як варіант, можна також задати зображення для кожної конкретної машини, щоб ви по зображенню могли відразу ж розпізнати, з якої машини отримано повідомлення. Крім того, можна використовувати функцію виведення зображень для відображення графічних елементів, зрозумілих тільки користувачу, наприклад, щоб ви розуміли, що вам прийшло повідомлення електронної пошти, а сторонній людині, смотрящему на ваш монітор, це зображення нічого не говорило.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*