<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>[Lost Tower]</title>
	<atom:link href="http://losttower.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://losttower.ru</link>
	<description>Потерянная в веб IT-башня</description>
	<lastBuildDate>Thu, 17 Dec 2009 09:40:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Что такое NASM?</title>
		<link>http://losttower.ru/assembler/chto-takoe-nasm/</link>
		<comments>http://losttower.ru/assembler/chto-takoe-nasm/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 09:07:02 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[Assembler]]></category>
		<category><![CDATA[NASM]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=58</guid>
		<description><![CDATA[NASM (от англ. Netwide Assembler) — свободный (GNU LGPL) Intel x86 ассемблер. Он используется при написании 16-битных и 32-битных программ (IA-32). 32-битные программы могут быть написаны для NASM таким способом, чтобы они были переносимыми между любыми 32-битными x86 операционными системами, если используются правильные библиотеки.
Это пример программы Hello world, которая выводит это знаменитое сообщение и завершается.
SECTION [...]


Ничего похожего не нашёл.]]></description>
			<content:encoded><![CDATA[<p><strong>NASM</strong> (от англ. <em>Netwide Assembler</em>) — свободный (GNU LGPL) Intel x86 ассемблер. Он используется при написании 16-битных и 32-битных программ (IA-32). 32-битные программы могут быть написаны для NASM таким способом, чтобы они были переносимыми между любыми 32-битными x86 операционными системами, если используются правильные библиотеки.</p>
<p><span id="more-58"></span>Это пример программы Hello world, которая выводит это знаменитое сообщение и завершается.</p>
<pre><span style="color: lightblue;">SECTION .data</span>
msg <span style="color: lightblue;">db</span> <span style="color: gray;">"Hello, world!"</span>,0xa ;
len <span style="color: lightblue;">equ</span> <strong>$</strong> – msg
<span style="color: lightblue;">SECTION</span> <strong>.text</strong>
<span style="color: lightblue;">global</span> main
main:
    <strong><span style="color: blue;">mov</span> eax</strong>,4
    <strong><span style="color: blue;">mov</span> ebx</strong>,1
<strong><span style="color: blue;">    mov</span> ecx</strong>,msg
    <strong><span style="color: blue;">mov</span> edx</strong>,len
    <strong><span style="color: blue;">int</span></strong> 0x80
    <strong><span style="color: blue;">mov</span> eax</strong>,1
    <strong><span style="color: blue;">mov</span> ebx</strong>,0
    <strong><span style="color: blue;">int</span></strong> 0x80</pre>
<img src="http://losttower.ru/?ak_action=api_record_view&id=58&type=feed" alt="" />

<p>Ничего похожего не нашёл.</p>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/assembler/chto-takoe-nasm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Немного кода Perl-Gtk2</title>
		<link>http://losttower.ru/perl/gui/nemnogo-koda-perl-gtk2/</link>
		<comments>http://losttower.ru/perl/gui/nemnogo-koda-perl-gtk2/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 14:44:02 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[GUI]]></category>
		<category><![CDATA[Gtk+]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[исходник]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=53</guid>
		<description><![CDATA[16.12.09
Листинг 0. Минимальное графическое приложение на Perl-Gtk2
#!/usr/bin/perl
use Gtk2 -init;
my $window = Gtk2::Window-&#62;new();
$window-&#62;show_all();
Gtk2-&#62;main();
Нарисует окно. При нажатии на &#8220;крестик&#8221; на окне, закроется только само окно, а программа не завершится&#8230; Поэтому &#8220;CTRL+C&#8221;.
Листинг 1. Чтение нажатий клавиатуры (аккордов)
#!/usr/bin/perl
use Gtk2 -init;
use Gtk2::Gdk::Keysyms;

$accel_group = Gtk2::AccelGroup-&#62;new;
$accel_group-&#62;connect ($Gtk2::Gdk::Keysyms{'A'}, 'control-mask', 'visible', \&#38;action);

$window = Gtk2::Window-&#62;new;
$window-&#62;add_accel_group ($accel_group);

$window-&#62;signal_connect (delete_event =&#62; sub {Gtk2-&#62;main_quit});
$window-&#62;show_now;

Gtk2-&#62;main;

sub action {
    [...]

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/ustanovka-perl-gtk2-na-windows-s-pomoshhyu-camelboxa/' rel='bookmark' title='Permanent Link: Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а'>Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а</a></li><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на Perl/GTK+'>Создание кросс-платформенных графических интерфейсов на Perl/GTK+</a></li></ol></td></tr></table>]]></description>
			<content:encoded><![CDATA[<h3 style="text-align: right;">16.12.09</h3>
<p>Листинг 0. Минимальное графическое приложение на Perl-Gtk2</p>
<pre><span style="color: #444444;">#!/usr/bin/perl
</span><strong>use</strong> Gtk2 -init;
<strong>my</strong> <span style="color: #2040a0;">$window</span> = Gtk2::Window-&gt;<strong>new</strong><strong>(</strong><strong>)</strong>;
<span style="color: #2040a0;">$window</span>-&gt;show_all<strong>(</strong><strong>)</strong>;
Gtk2-&gt;main<strong>(</strong><strong>)</strong>;</pre>
<p>Нарисует окно. При нажатии на &#8220;крестик&#8221; на окне, закроется только само окно, а программа не завершится&#8230; Поэтому &#8220;CTRL+C&#8221;.</p>
<p><span id="more-53"></span>Листинг 1. Чтение нажатий клавиатуры (аккордов)</p>
<pre><span style="color: #444444;">#!/usr/bin/perl</span>
<strong>use</strong> Gtk2 -init;
<strong>use</strong> Gtk2::Gdk::Keysyms;

<span style="color: #2040a0;">$accel_group</span> = Gtk2::AccelGroup-&gt;<strong>new</strong>;
<span style="color: #2040a0;">$accel_group</span>-&gt;<span style="color: #a52a2a;"><strong>connect</strong></span> <strong>(</strong><span style="color: #2040a0;">$Gtk2</span>::Gdk::Keysyms<strong>{</strong><span style="color: #008000;">'A'</span><strong>}</strong>, <span style="color: #008000;">'control-mask'</span>, <span style="color: #008000;">'visible'</span>, \&amp;action<strong>)</strong>;

<span style="color: #2040a0;">$window</span> = Gtk2::Window-&gt;<strong>new</strong>;
<span style="color: #2040a0;">$window</span>-&gt;add_accel_group <strong>(</strong><span style="color: #2040a0;">$accel_group</span><strong>)</strong>;

<span style="color: #2040a0;">$window</span>-&gt;signal_connect <strong>(</strong>delete_event =&gt; sub <strong>{</strong>Gtk2-&gt;main_quit<strong>}</strong><strong>)</strong>;
<span style="color: #2040a0;">$window</span>-&gt;show_now;

Gtk2-&gt;main;

<strong>sub<span style="color: #ff0000;"> action</span> {</strong>
    <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #008000;">"Key Pressed<span style="color: #77dd77;">\n</span>"</span>;
<strong>}</strong></pre>
<p>В примере читается нажатие аккорда &#8220;A + CTRL&#8221;</p>
<h3 style="text-align: right;">UPD 17.12.09</h3>
<p>Все аккорды можно найти в файле site/lib/Gtk2/Gdk/Keysyms.pm</p>
<img src="http://losttower.ru/?ak_action=api_record_view&id=53&type=feed" alt="" />

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/ustanovka-perl-gtk2-na-windows-s-pomoshhyu-camelboxa/' rel='bookmark' title='Permanent Link: Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а'>Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а</a></li><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на Perl/GTK+'>Создание кросс-платформенных графических интерфейсов на Perl/GTK+</a></li></ol></td></tr></table>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/perl/gui/nemnogo-koda-perl-gtk2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а</title>
		<link>http://losttower.ru/perl/gui/ustanovka-perl-gtk2-na-windows-s-pomoshhyu-camelboxa/</link>
		<comments>http://losttower.ru/perl/gui/ustanovka-perl-gtk2-na-windows-s-pomoshhyu-camelboxa/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 08:05:13 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[GUI]]></category>
		<category><![CDATA[Camel Box]]></category>
		<category><![CDATA[Gtk+]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=39</guid>
		<description><![CDATA[



Те, кто программировал на Perl под Windows, наверняка знают самый популярный инструмент для этого &#8211; ActivePerl. Однако, зачастую его &#8220;мощностей&#8221; не хватает и приходится брать дополнительные пакеты из ppm (Perl Packet Manager).



Если о таком не знали, наберите в консоли &#8220;ppm&#8221; &#8211; будет интересно.
Однако, и там не всё есть что нам надо&#8230; И тогда стоит заглянуть [...]

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/nemnogo-koda-perl-gtk2/' rel='bookmark' title='Permanent Link: Немного кода Perl-Gtk2'>Немного кода Perl-Gtk2</a></li><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на Perl/GTK+'>Создание кросс-платформенных графических интерфейсов на Perl/GTK+</a></li></ol></td></tr></table>]]></description>
			<content:encoded><![CDATA[<table border="0" width="100%">
<tbody>
<tr>
<td><img class="alignleft" title="perl - Gtk" src="http://code.google.com/p/camelbox/logo?logo_id=1238134654" alt="" width="55" height="55" /></td>
<td>Те, кто программировал на Perl под Windows, наверняка знают самый популярный инструмент для этого &#8211; ActivePerl. Однако, зачастую его &#8220;мощностей&#8221; не хватает и приходится брать дополнительные пакеты из ppm (Perl Packet Manager).</td>
</tr>
</tbody>
</table>
<p><em>Если о таком не знали, наберите в консоли &#8220;ppm&#8221; &#8211; будет интересно</em>.</p>
<p>Однако, и там не всё есть что нам надо&#8230; И тогда стоит заглянуть на CPAN.org. Уж там то вы найдёте пакет для любой задачи. Однако, некоторые из них нужно будет скомпилировать под вашу систему. Задача вполне выполнимая, но трудоёмкая.</p>
<p><span id="more-39"></span>Именно в такой ситуации я оказался, когда захотел поставить Perl-Gtk2 на свою Windows XP. И, если честно, несколько опешил, ведь под Ubuntu этот пакет ставился одним запросом apt-get&#8230; Собирать пакет мне не хотелось, поэтому я решил поискать другие варианты.</p>
<p>Таким вариантом оказался другой дистрибутив Perl&#8217;а &#8220;Camel Box&#8221;.</p>
<p><strong>Чтобы его установить</strong>, нужно скачать exe&#8217;шник с <a href="http://losttower.ru/goto/http://code.google.com/p/camelbox/" >code.google.com</a> весом ~ 100кб, запустить его. Перед Вами появится окно:</p>
<div><img class="aligncenter size-full wp-image-40" title="окно camelbox'а" src="http://losttower.ru/wp-content/uploads/2009/12/camelbox0.png" alt="окно camelbox'а" width="426" height="292" /></div>
<p>Жмём &#8220;Next&#8221;, соглашаемся с лицензией (GPL, если кому интересно). Получаем окно выбора пактов, которые нам понадобятся (и которые нужно будет установщику вытянуть из интернета).</p>
<div><img class="aligncenter size-full wp-image-44" title="camelbox01" src="http://losttower.ru/wp-content/uploads/2009/12/camelbox011.png" alt="camelbox01" width="426" height="292" /></div>
<p>После нажатия кнопки &#8220;Install&#8221; он их успешно скачивает и устанавливает.</p>
<div><img class="aligncenter size-full wp-image-42" title="окно camelbox'а" src="http://losttower.ru/wp-content/uploads/2009/12/camelbox.png" alt="окно camelbox'а" width="426" height="292" /></div>
<p>Ну и конец установки:</p>
<div><img class="aligncenter size-full wp-image-43" title="окно camelbox'а" src="http://losttower.ru/wp-content/uploads/2009/12/camelbox1.png" alt="окно camelbox'а" width="426" height="292" /></div>
<p>После чего мы можем найти свежеустановленный дистрибутив в папке C:/camelbox (ну или другой диск (какой у вас системный)).</p>
<h2>Теперь, чтобы начать использовать его библиотеки,</h2>
<p>их надо добавить в массив поиска библиотек. Делается это просто:</p>
<pre>BEGIN{
    @INC = (@INC,'C:/camelbox/site/lib');
}</pre>
<p>Именно там лежит файл Gtk2.pm. Напоминаю, что содержимое блока <code>BEGIN</code> выполняется до выполнения всего остального кода, поэтому во время вызова <code>use Gtk2 -init;</code> perl уже будет знать, где ему искать.</p>
<p>Ну и в конце &#8211; код, которым можно проверить, установился ли у вас Gtk2 или нет:</p>
<pre><span style="color: #444444;">#!/usr/bin/perl

</span><strong>BEGIN</strong><strong>{</strong>
    <span style="color: #2040a0;">@INC</span> = <strong>(</strong><span style="color: #2040a0;">@INC</span>,<span style="color: #008000;">'C:/camelbox/site/lib'</span><strong>)</strong>;
<strong>}</strong>

<strong>use</strong> strict;
<strong>use</strong> warnings;

<strong>use</strong> encoding <span style="color: #008000;">'cp1251'</span>;

<strong>use</strong> Gtk2 -init;

<strong>my</strong> <span style="color: #2040a0;">$window</span> = Gtk2::Window-&gt;<strong>new</strong><strong>(</strong><span style="color: #008000;">'toplevel'</span><strong>)</strong>;
<span style="color: #2040a0;">$window</span>-&gt;signal_connect<strong>(</strong> delete_event =&gt; sub <strong>{</strong> Gtk2-&gt;main_quit <strong>}</strong> <strong>)</strong>;

<strong>my</strong> <span style="color: #2040a0;">$button</span> = Gtk2::Button-&gt;<strong>new</strong><strong>(</strong><span style="color: #008000;">'Прощай, Мир!'</span><strong>)</strong>;
<span style="color: #2040a0;">$button</span>-&gt;signal_connect<strong>(</strong> clicked =&gt; sub <strong>{</strong>Gtk2-&gt;main_quit<strong>}</strong><strong>)</strong>;

<span style="color: #2040a0;">$window</span>-&gt;add<strong>(</strong><span style="color: #2040a0;">$button</span><strong>)</strong>;
<span style="color: #2040a0;">$window</span>-&gt;show_all<strong>(</strong><strong>)</strong>;

Gtk2-&gt;main<strong>(</strong><strong>)</strong>;</pre>
<p><strong>UPD</strong></p>
<p>Чтобы каждый раз не добавлять в @INC новый путь, можно скопировать C:/camelbox/site/lib в C:/perl/site/lib . Всё равно она по умолчанию пустая стоит&#8230;</p>
<img src="http://losttower.ru/?ak_action=api_record_view&id=39&type=feed" alt="" />

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/nemnogo-koda-perl-gtk2/' rel='bookmark' title='Permanent Link: Немного кода Perl-Gtk2'>Немного кода Perl-Gtk2</a></li><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на Perl/GTK+'>Создание кросс-платформенных графических интерфейсов на Perl/GTK+</a></li></ol></td></tr></table>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/perl/gui/ustanovka-perl-gtk2-na-windows-s-pomoshhyu-camelboxa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Что такое ООП?</title>
		<link>http://losttower.ru/method/chto-takoe-oop/</link>
		<comments>http://losttower.ru/method/chto-takoe-oop/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 08:02:44 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[Методы программирования]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=22</guid>
		<description><![CDATA[Объектно ориентированное программирование(ООП)&#8230;

Что это?
Из названия понятно, что это программирование, ориентированное на объекты.

Что есть объект?
Да хоть что! Все можно воспринимать как объект: стакан — объект, ложка в стакане — опять же объект, и даже ложка со стаканом так же может восприниматься как объект.

И чем же тогда нам может помочь понятие, включающее в себя всё? Ведь, говоря, [...]


Ничего похожего не нашёл.]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm;">Объектно ориентированное программирование(ООП)&#8230;</p>
<p style="margin-bottom: 0cm;">
<h2>Что это?</h2>
<p style="margin-bottom: 0cm;">Из названия понятно, что это программирование, ориентированное на объекты.</p>
<p style="margin-bottom: 0cm;">
<h2>Что есть объект?</h2>
<p style="text-indent: 0.49cm; margin-bottom: 0cm;">Да хоть что! Все можно воспринимать как объект: стакан — объект, ложка в стакане — опять же объект, и даже ложка со стаканом так же может восприниматься как объект.</p>
<p><span id="more-22"></span>
<p style="text-indent: 0.49cm; margin-bottom: 0cm;">И чем же тогда нам может помочь понятие, включающее в себя <strong>всё?</strong><span style="font-weight: normal;"> Ведь, говоря, что «всё — объект», мы лишаем уникальности любое подмножество этого «всего». Впринципе, так и есть: мы обезличиваем вещи, делаем их проще. Зачем? Да чтобы проще было с ними работать!</span></p>
<p style="text-indent: 0.49cm; margin-bottom: 0cm;"><span style="font-weight: normal;"><br />
</span></p>
<h2>Чем же этот поход к программированию хорош?</h2>
<p style="text-indent: 0.46cm;"><span style="font-weight: normal;">Тем, что такой подход наибоее близок к человеческому пониманию. Представьте, что я бы сказал, что стакан — это множество значений, таких как «высота», «ширина», «длина» и «объём». Такого представления стакана нам хватит, чтобы написать программу, подбирающую упаковку для стакана (размеры упаковки) + мы могли бы сделать возможность выбора (для пользователя) «какого объёма ему нужна тара». Впринципе, для интернет-магазина этого уже может и хватает&#8230; Итого, нам потребовалось 4 сущности для описания такой вещи как стакан. Мы их удерживали в голове как отдельные вещи&#8230; Думаю, не стоит Вам объяснять, что держать в голове 4 вещи сложнее, чем одну (стакан), пусть даже и подразумевая, что у него есть какие-то параметры&#8230;</span></p>
<p style="text-indent: 0.46cm;"><span style="font-weight: normal;">Что мы сделали, собрав воедино высоту, длину, ширину и объём? Мы абстрагировались от них  на новый уровень абстракции(извините за тавтологию) &#8211; «стакан», мы инкапсулировали 4 сущности в одну! «Абстракция данных» и «инкапсуляция» являются одними из принципов ООП.</span></p>
<p style="text-indent: 0.46cm;"><span style="font-weight: normal;">Хм&#8230; стакан — это, конечно, хорошо, но вот наш интернет-магазин набрал обороты, и наши покупатели не довольны, что у нас стаканы не различаются по цвету&#8230; Мы можем сказать «O&#8217;key, ща напишу новую абстракцию &#8216;цветной стакан&#8217;», но делать это «с нуля» глупо, лучше использовать наработки из «предыдущей серии». И вот мы берём наш старый тип абстракции «стакан» и, основываясь на нём, создаём новый, но с дополнительным пунктиком &#8211; «цвет». Но делаем это не банальным переписованием, а говорим «нам, пожалуйста, тип абстракции, основанный воооон на том, но с новым пунктом &#8216;цвет&#8217;». И у нас готов новый класс, как бы наследующий от предыдущего все качества. Этот принцип называется «наследование». Мы получили «ребёнка»(потомка) от родительского типа «стакан»(предок), который унаследовал все плохие и хорошие качества отца <img src='http://losttower.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p style="text-indent: 0.46cm;"><span style="font-weight: normal;">Отлично! Теперь  у нас есть механизм создания сложных иерархий(родов). Причём каждый следуйщий в роду наследует все качества предыдущего и добавляет некоторые свои&#8230; А вдруг унаследовалось что-то «плохое»(ненужное), или нам просто показалось, что в этом поколении какое-то свойство должно выполняться по-другому&#8230; Например, всё тот же тип «стакан», был у него метод(действие над ним) «запаковаться», где он брал свои габариты, выбирал коробку из какой-то базы и командовал «запаковать» вот в эту коробочку&#8230;</span></p>
<p style="text-indent: 0.46cm;"><span style="font-weight: normal;">Но пришли новогодние праздники и вы создали «стакан новогодний подарочный», наследуясь от «цветного стакана» (ну, вы помните, абзацем ранее мы его создали), а «цветной стакан» унаследовал метод упаковки от обычного стакана. Но нам то нужен не обычный способ! Всё-таки праздники <img src='http://losttower.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ! Мы, конечно, можем создать новый метод «упаковать празднично», а тот (предположим его звали «упаковать») оставить «на память» об эволюционном процессе (подобно копчику)&#8230; Но такой подход до добра не доведёт: ну ладно, 1 копчик&#8230; а представьте 10 <img src='http://losttower.ru/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Так что надо что-то делать! И тут нам ООП предлагает «полиморфизм» &#8211; это когда одному названию соответствует несколько вещей. В нашем случае — одному методу «упаковать» мы сопоставим 2 команды. То есть переопределим в нашем новогоднем типе этот метод по-своему (сбантиками и блёстками)&#8230; И никаких копчиков!</span></p>
<p style="text-indent: 0.46cm;"><span style="font-weight: normal;">И что же мы в итоге получили: абстракцию данных, инкапсуляцию, наследование и полиморфизм. Вот четыре принципа ООП, которые облегчают нам задачу проектирования сложных конструкций. А программирование с учётом этих четырёх принципов — и есть ООП.</span></p>
<img src="http://losttower.ru/?ak_action=api_record_view&id=22&type=feed" alt="" />

<p>Ничего похожего не нашёл.</p>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/method/chto-takoe-oop/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как работать с базами данных в Python.</title>
		<link>http://losttower.ru/python/kak-rabotat-s-bazami-dannyx-v-python/</link>
		<comments>http://losttower.ru/python/kak-rabotat-s-bazami-dannyx-v-python/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 10:33:55 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=3</guid>
		<description><![CDATA[
Пребполагается, что сам Python уже 	установлен и читатель владеет основами 	языка.
Устанавливаем модуль для работы с 	базами данных. Таких модулей несколько, 	мы будем использовать MySQLdb (пакет 	называется python-mysqldb). В Ubuntu достаточно сделать apt-get install python-mysqldb , чтобы установить данный пакет.
Когда пакет установлен, можно начать 	его использование. Для этого нужно его 	импортировать в наш код:
import _mysql

Чтобы подключиться [...]


Ничего похожего не нашёл.]]></description>
			<content:encoded><![CDATA[<ol>
<li>Пребполагается, что сам Python уже 	установлен и читатель владеет основами 	языка.</li>
<li>Устанавливаем модуль для работы с 	базами данных. Таких модулей несколько, 	мы будем использовать MySQLdb (пакет 	называется <code>python-mysqldb</code>). В Ubuntu достаточно сделать <code>apt-get install python-mysqldb</code> , чтобы установить данный пакет.</li>
<li>Когда пакет установлен, можно начать 	его использование. Для этого нужно его 	импортировать в наш код:
<pre>import _mysql</pre>
</li>
<li>Чтобы подключиться к базе данных 	используйте
<pre>db = _mysql.connect("localhost","user","password","dbname");</pre>
</li>
<li>Отправляем запрос базе командой
<pre>db.query("""SELECT * FROM table""")</pre>
</li>
<li>Принимаем ответ от базы с помощью 	<code>answ = db.store_result()</code> или <code>answ = db.use_result()</code>. Разница этих двух методов в том, что первый получит сразу весь ответ базы, а второй будет получать его построчно(с сервера). Визуально они выглядят одинаково: и первый и второй при вызове будут отдавать по одной записи (строке), но в реальности store_result() один лишь раз обратится к базе(и сразу весь ответ будет держать у себя), а db.use_result() будет построчно спрашивать у сервера баз данных.</li>
<li>Для реального получения данных 	используем <code>answ.fetch_row()</code>. При каждом вызове 	будет выводиться кортеж кортежей полей. 	То есть
<pre>(('поле 1', 'поле 2', … ,'поле n'),)</pre>
</li>
</ol>
<img src="http://losttower.ru/?ak_action=api_record_view&id=3&type=feed" alt="" />

<p>Ничего похожего не нашёл.</p>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/python/kak-rabotat-s-bazami-dannyx-v-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проверка почты на Perl</title>
		<link>http://losttower.ru/perl/proverka-pochty-na-perl/</link>
		<comments>http://losttower.ru/perl/proverka-pochty-na-perl/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 13:39:41 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[POP3]]></category>
		<category><![CDATA[Zenity]]></category>
		<category><![CDATA[исходник]]></category>
		<category><![CDATA[почта]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=15</guid>
		<description><![CDATA[Программа проверяет наличие новой почты. Проверяется кол-во сообщений. Если стало больше – у вас новое сообщение. Код писался с оглядкой на “читателя”, поэтому, возможно, комментируются и очевидные места.
Программа получает на вход параметры SERVER USER PASSWORD TIME. Последнее – время, через которое повторяются проверки. Программа работает по принципу “пока не остановишь”.
При написании использовалась утилита zenity(отрисовка графического [...]

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/protocol/komandy-protokola-pop3-priyom-pochty/' rel='bookmark' title='Permanent Link: Команды протокола POP3 (приём почты)'>Команды протокола POP3 (приём почты)</a></li></ol></td></tr></table>]]></description>
			<content:encoded><![CDATA[<p>Программа проверяет наличие новой почты. Проверяется кол-во сообщений. Если стало больше – у вас новое сообщение. Код писался с оглядкой на “читателя”, поэтому, возможно, комментируются и очевидные места.</p>
<p>Программа получает на вход параметры SERVER USER PASSWORD TIME. Последнее – время, через которое повторяются проверки. Программа работает по принципу “пока не остановишь”.</p>
<p><span id="more-15"></span>При написании использовалась утилита zenity(отрисовка графического окна), о которой уже <a href="http://losttower.ru/shell/zenity-sozdanie-gtk-interfejsov-pryamo-iz-konsoli/" >писалось ранее</a>. Соединение с серврером идёт по протоколу POP 3, с которым можно ознакомится <a href="http://losttower.ru/standarty-i-protokoly/komandy-protokola-pop3-priyom-pochty/" >здесь</a>.</p>
<p>При запуске программа говорит нам, что у нас новое письмо… Это баг. Мне лень его править. Возникает он из-за того, что по-началу $count – наш счётчик писем нулевой.</p>
<p>Ещё один момент: адрес сервера, на котором находится сервер вашей почты, может(и скорее всего) не совпадать с адресом POP 3 сервера. К примеру, для mail.ru следует запрашивать pop3.mail.ru, для yandex.ru – pop.yandex.ru, у нашего местного “мегасайта” e1.ru , так вообще mail.e1.ru. Как узнать? – Спрашивайте на своих серверах. А вообще, это обычно на них публикуется…</p>
<p>Код подкрашен утилитой code2html</p>
<pre><span style="color: #444444;">#!/usr/bin/perl
#
# Made by Helios aka h15 from UseUnix.RU
#
# параметры: Server User Pass Time

</span><strong>use</strong> strict; <span style="color: #444444;"># Эта прагма не даст вам писать "неправильно", т.е. следит за
            # объявлением переменных и прочими делами.

</span><strong>use</strong> IO::Socket; <span style="color: #444444;"># Для работы с сокетами высокого уровня.

</span><strong>my</strong><span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">$count</span>, <span style="color: #2040a0;">$sock</span><span style="color: #4444ff;"><strong>)</strong></span>; <span style="color: #444444;"># Глобальные переменные. Count - кол-во сообщений (именно
# так мы проверяем наличие нового), sock - сокет, который у нас один на всё.

</span><strong>while</strong><span style="color: #4444ff;"><strong>(</strong></span>1<span style="color: #4444ff;"><strong>)</strong></span><span style="color: #4444ff;"><strong>{</strong></span> <span style="color: #444444;"># Запускаем "вечный" цикл
    </span>pop3_conn<span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">@ARGV</span><span style="color: #4444ff;"><strong>[</strong></span>0..2<span style="color: #4444ff;"><strong>]</strong></span><span style="color: #4444ff;"><strong>)</strong></span>? <span style="color: #444444;"># коннектимся к серверу (+авторизация)
        </span><span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #008000;">"[+] Permissoin allowed!<span style="color: #77dd77;">\n</span>"</span>: <span style="color: #444444;"># Получилось!
        </span><strong>die</strong> <span style="color: #008000;">"[-] Permission denied<span style="color: #77dd77;">\n</span>"</span>;     <span style="color: #444444;"># Не получилось.

    </span>check_for_new_mail<span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">@ARGV</span><span style="color: #4444ff;"><strong>[</strong></span>0..2<span style="color: #4444ff;"><strong>]</strong></span><span style="color: #4444ff;"><strong>)</strong></span>; <span style="color: #444444;"># Непосредственно проверялка.

    </span>&amp;quit; <span style="color: #444444;"># Выходим (по протоколу POP 3)

    </span><span style="color: #a52a2a;"><strong>sleep</strong></span> <span style="color: #2040a0;">$ARGV</span><span style="color: #4444ff;"><strong>[</strong></span>3<span style="color: #4444ff;"><strong>]</strong></span>; <span style="color: #444444;"># ReUse timer
# P.S. В @ARGV лежат параметры, передаваемые программе, начиная с нуля.
</span><span style="color: #4444ff;"><strong>}</strong></span>

<span style="color: #444444;">########################### Подпрограммы ###########################

# Подпрограмма выдаёт вход на консоль и в информационное окно (создавая его)
#
</span><strong>sub<span> alert</span> {</strong>
    <strong>my</strong> <span style="color: #2040a0;">$msg</span> = <span style="color: #a52a2a;"><strong>shift</strong></span>;
    <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #008000;">"[!] <span style="color: #2040a0;">$msg</span><span style="color: #77dd77;">\n</span>"</span>;
<span style="color: #444444;"># текст, заключённый в `` будет исполнен в командной строке.
    </span>`zenity --info --title=<span style="color: #008000;">"Сообщение"</span> --text=<span style="color: #008000;">"<span style="color: #2040a0;">$msg</span>"</span>`;
<span style="color: #444444;"># Информацию по утилите zenity можно найти здесь:
# http://useunix.ru/zenity-sozdanie-gtk-interfejsov-pryamo-iz-konsoli/
</span><span style="color: #4444ff;"><strong>}</strong></span>

<strong>sub<span> quit</span> {</strong>
    <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #2040a0;">$sock</span> <span style="color: #008000;">"QUIT<span style="color: #77dd77;">\n</span>"</span>; <span style="color: #444444;"># Выходим
    </span><strong>my</strong> <span style="color: #2040a0;">$answ</span> = &lt;<span style="color: #2040a0;">$sock</span>&gt;;
    <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #008000;">"[i] Quit<span style="color: #77dd77;">\n</span>"</span>;
<span style="color: #4444ff;"><strong>}</strong></span>

<span style="color: #444444;"># Подпрограмма проверяет положительность ответа сервера
# На вход идёт ответ сервера
# На выходе - 0, если ответ положительный, 1 - в противном случае.
#
</span><strong>sub<span> Chk</span> {</strong>
    <strong>my</strong> <span style="color: #2040a0;">$is</span> = <span style="color: #a52a2a;"><strong>substr</strong></span> <span style="color: #a52a2a;"><strong>shift</strong></span>, 0, 1;<span style="color: #444444;"> # Берём 1ый символ
    </span><strong>return</strong> <span style="color: #2040a0;">$is</span> <strong>eq</strong> <span style="color: #008000;">'+'</span> ? 0 : 1;   <span style="color: #444444;"># Если это "+" - возвращаем 0, иначе - 1
</span><span style="color: #4444ff;"><strong>}</strong></span>

<span style="color: #444444;"># Подпрограмма создаёт соединение с сервером, авторизуется
# Вход - Сервер, Юзер, Пароль
# Выход - 1, в случае успеха, 0 - в противном.
#
</span><strong>sub<span> pop3_conn</span> {</strong>
    <strong>my</strong><span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">$srv</span>, <span style="color: #2040a0;">$user</span>, <span style="color: #2040a0;">$pass</span><span style="color: #4444ff;"><strong>)</strong></span> = <span style="color: #2040a0;">@_</span>;
<span style="color: #444444;"># Коннектимся к серверу $srv по TCP на порт 110 (порт протокола POP3). Т.е.
# создаём сокет(пару IP,ПОРТ).
#
# PeerPort можно было поставить "POP3" или "110", а можно и так, как сделали мы.
    </span><span style="color: #2040a0;">$sock</span> = IO::Socket::INET-&gt;<strong>new</strong><span style="color: #4444ff;"><strong>(</strong></span> <span style="color: #444444;"># Сделали $sock глобальной.
        </span>PeerAddr =&gt; <span style="color: #2040a0;">$srv</span>,
        Proto    =&gt; <span style="color: #008000;">"tcp"</span>,
        PeerPort =&gt; <span style="color: #008000;">"POP3 (110)"</span>
    <span style="color: #4444ff;"><strong>)</strong></span>   <strong>and</strong> <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #008000;">"[+] Connected!<span style="color: #77dd77;">\n</span>"</span>
        <strong>or</strong>  <strong>die</strong> <span style="color: #008000;">"[-] Can't connect to <span style="color: #2040a0;">$srv</span><span style="color: #77dd77;">\n</span>"</span>;
<span style="color: #444444;"># Ну, и, как обычно, если не смогли соединиться (вернули 0), умираем.

# Авторизуемся (по протоколу POP3)
    </span><strong>my</strong> <span style="color: #2040a0;">$answ</span> = &lt;<span style="color: #2040a0;">$sock</span>&gt;;        <span style="color: #444444;"># Получаем приглашение авторизации
    </span><strong>return</strong> <strong>if</strong> Chk <span style="color: #2040a0;">$answ</span>;    <span style="color: #444444;"># Проверяем положительный ли ответ пришёл

    </span><span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #2040a0;">$sock</span> <span style="color: #008000;">"USER <span style="color: #2040a0;">$user</span><span style="color: #77dd77;">\n</span>"</span>; <span style="color: #444444;"># Шлём на сервер user'а
    </span><span style="color: #2040a0;">$answ</span> = &lt;<span style="color: #2040a0;">$sock</span>&gt;;
    <strong>return</strong> <strong>if</strong> Chk <span style="color: #2040a0;">$answ</span>;

    <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #2040a0;">$sock</span> <span style="color: #008000;">"PASS <span style="color: #2040a0;">$pass</span><span style="color: #77dd77;">\n</span>"</span>; <span style="color: #444444;"># Шлём пароль
    </span><span style="color: #2040a0;">$answ</span> = &lt;<span style="color: #2040a0;">$sock</span>&gt;;
    <strong>return</strong> <strong>if</strong> Chk <span style="color: #2040a0;">$answ</span>;

    1 <span style="color: #444444;"># Возвращаем TRUE. Во всех предыдущих return летел FALSE.
</span><span style="color: #4444ff;"><strong>}</strong></span>

<strong>sub<span> get_mail_num</span> {</strong>
    <strong>my</strong><span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">$srv</span>, <span style="color: #2040a0;">$user</span>, <span style="color: #2040a0;">$pass</span>, <span style="color: #2040a0;">$err_cnt</span><span style="color: #4444ff;"><strong>)</strong></span> = <span style="color: #2040a0;">@_</span>; <span style="color: #444444;"># $err_cnt остаётся неинициированным
</span>STAT:
<span style="color: #444444;"># Если 10 раз не вышло переподключиться - ломаемся.
    </span>alert<span style="color: #4444ff;"><strong>(</strong></span><span style="color: #008000;">"Smth broke... Sorry, <span style="color: #2040a0;">$user</span>."</span><span style="color: #4444ff;"><strong>)</strong></span> <strong>and</strong> <strong>die</strong><span style="color: #4444ff;"><strong>(</strong></span><span style="color: #008000;">"[-] Smth broke... Sorry.<span style="color: #77dd77;">\n</span>"</span><span style="color: #4444ff;"><strong>)</strong></span> <strong>if</strong> ++<span style="color: #2040a0;">$err_cnt</span> &gt; 10;
    <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #2040a0;">$sock</span> <span style="color: #008000;">"STAT<span style="color: #77dd77;">\n</span>"</span>; <span style="color: #444444;"># Шлём на сервер запрос кол-ва сообщений и их размера.
    </span><strong>my</strong> <span style="color: #2040a0;">$answ</span> = &lt;<span style="color: #2040a0;">$sock</span>&gt;;
    pop3_conn<span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">@_</span><span style="color: #4444ff;"><strong>)</strong></span> <strong>and</strong> <strong>redo</strong> STAT <strong>if</strong> Chk <span style="color: #2040a0;">$answ</span>; <span style="color: #444444;"># При ошибке, переустанавливаем соединение

    </span><span style="color: #2040a0;">$answ</span> =~<span style="color: #b000d0;"> /^\s*\+\w+\s+(\d+)\s+/</span>; <span style="color: #444444;"># Достаем и ответа число писем

    </span><span style="color: #2040a0;">$1</span> <span style="color: #444444;"># Результат поиска лежит здесь, его возвращаем
</span><span style="color: #4444ff;"><strong>}</strong></span>

<span style="color: #444444;"># Подпрограмма проверяет наличие новых сообщений по кол-ву писем.
# Вход: Server, User, Password
# Выхода нет...
#
</span><strong>sub<span> check_for_new_mail</span> {</strong>
    <strong>my</strong><span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">$srv</span>, <span style="color: #2040a0;">$user</span>, <span style="color: #2040a0;">$pass</span><span style="color: #4444ff;"><strong>)</strong></span> = <span style="color: #2040a0;">@_</span>;
    <strong>my</strong> <span style="color: #2040a0;">$mails</span> = get_mail_num <span style="color: #2040a0;">@_</span>;
    <strong>if</strong> <span style="color: #4444ff;"><strong>(</strong></span><span style="color: #2040a0;">$mails</span> &gt; <span style="color: #2040a0;">$count</span><span style="color: #4444ff;"><strong>)</strong></span><span style="color: #4444ff;"><strong>{</strong></span>
        alert<span style="color: #4444ff;"><strong>(</strong></span><span style="color: #008000;">"New mail for <span style="color: #2040a0;">$user</span>"</span><span style="color: #4444ff;"><strong>)</strong></span>;
        <span style="color: #2040a0;">$count</span> = <span style="color: #2040a0;">$mails</span>;
    <span style="color: #4444ff;"><strong>}</strong></span>

    <span style="color: #a52a2a;"><strong>print</strong></span> <span style="color: #008000;">"[i] Mail counter = <span style="color: #2040a0;">$count</span><span style="color: #77dd77;">\n</span>"</span>;
<span style="color: #4444ff;"><strong>}</strong></span></pre>
<img src="http://losttower.ru/?ak_action=api_record_view&id=15&type=feed" alt="" />

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/protocol/komandy-protokola-pop3-priyom-pochty/' rel='bookmark' title='Permanent Link: Команды протокола POP3 (приём почты)'>Команды протокола POP3 (приём почты)</a></li></ol></td></tr></table>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/perl/proverka-pochty-na-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Команды протокола POP3 (приём почты)</title>
		<link>http://losttower.ru/protocol/komandy-protokola-pop3-priyom-pochty/</link>
		<comments>http://losttower.ru/protocol/komandy-protokola-pop3-priyom-pochty/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 13:32:23 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[Стандарты и протоколы]]></category>
		<category><![CDATA[POP3]]></category>
		<category><![CDATA[почта]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=12</guid>
		<description><![CDATA[




Команды протокола POP3



Команда
Синтаксис
Описание


STAT
Формат ответа: “+ОК nn mm”, где nn — количество сообщений, mm — их общий объем:С: STATS: +ОК 2 320
В этом примере РОРЗ -сервер сообщает, что в данном почтовом ящике находятся два сообщения общим объемом 320 байт.
После того как клиент успешно прошел процедуру аутентификации в РОРЗ- сервере, и РОРЗ- сервер “закрыл” определенный почтовый ящик [...]

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/proverka-pochty-na-perl/' rel='bookmark' title='Permanent Link: Проверка почты на Perl'>Проверка почты на Perl</a></li></ol></td></tr></table>]]></description>
			<content:encoded><![CDATA[<p><span id="more-12"></span></p>
<table border="0" cellpadding="7" width="100%" rules="all">
<tbody>
<tr>
<td colspan="3">
<h2>Команды протокола POP3</h2>
</td>
</tr>
<tr>
<td width="20%" valign="top">Команда</td>
<td width="40%" valign="top">Синтаксис</td>
<td width="40%" valign="top">Описание</td>
</tr>
<tr>
<td width="20%" valign="top">STAT</td>
<td width="40%" valign="top">Формат ответа: “+ОК nn mm”, где nn — количество сообщений, mm — их общий объем:С: STATS: +ОК 2 320</p>
<p>В этом примере РОРЗ -сервер сообщает, что в данном почтовом ящике находятся два сообщения общим объемом 320 байт.</td>
<td width="40%" valign="top">После того как клиент успешно прошел процедуру аутентификации в РОРЗ- сервере, и РОРЗ- сервер “закрыл” определенный почтовый ящик только для использования данным клиентом (для тех, кто работал с базами данных, это называется EXCLUSIVE ACCESS LOCK), РОРЗ- сессия переходит в режим TRANSACTION, и клиент может начать работу со своей почтойКоманда <strong>STAT</strong><strong> </strong> (без аргументов) используется для просмотра состояния текущего почтового ящика.В ответ РОРЗ- сервер возвращает строку, содержащую количество и общий размер в байтах сообщений, которые клиент может получить с РОРЗ- сервера. Сообщения, помеченные на удаление, не учитываются</td>
</tr>
<tr>
<td width="20%" valign="top">LIST [msg]</td>
<td width="40%" valign="top">С: LISTS: +ОК 2 messages (320 octets)S: 1 120</p>
<p>S: 2 200</p>
<p>S: .</p>
<p><em>ИЛИ</em></p>
<p>С: LIST 2</p>
<p>S: +ОК 2 200</p>
<p><em>ИЛИ</em></p>
<p><em> </em>С: LIST 3</p>
<p>S: -ERR no such message, only 2 messages in maildrop</td>
<td width="40%" valign="top">Команда <strong>LIST</strong><strong> </strong> может передаваться как с аргументом msg — номером сообщения, так и без аргумента.Если команда содержит аргумент, и сообщение с указанным номером существует, ответом на нее будет “информационная строка”, которая содержит номер сообщения и размер сообщения в байтах. Если аргумент не указан — ответом будет список информационных строк обо всех сообщениях в данном почтовом ящике. Сообщения, помеченные на удаление не фигурируют в этом списке</td>
</tr>
<tr>
<td width="20%" valign="top">RETR msg</td>
<td width="40%" valign="top">С: RETR 1S: +ОК 120 octetsS: &lt;text message&gt;</p>
<p>S: .</td>
<td width="40%" valign="top">Используется для передачи клиенту запрашиваемого сообщения. Аргумент команды — номер сообщения. Если запрашиваемого сообщения нет, возвращается отрицательный индикатор “-ERR”.</td>
</tr>
<tr>
<td width="20%" valign="top">DELE msg</td>
<td width="40%" valign="top">С: DELE 1S: +ОК message 1 deletedИЛИ</p>
<p>С: DELE 2</p>
<p>S: -ERR message 2 already deleted</td>
<td width="40%" valign="top">Аргумент команды— номер сообщения. Сообщения, помеченные на удаление, реально удаляются только после закрытия транзакции, на стадии UPDATE.</td>
</tr>
<tr>
<td width="20%" valign="top">NOOP</td>
<td width="40%" valign="top">С: NOOPS: +ОК</td>
<td width="40%" valign="top">Для проверки состояния соединения с РОРЗ- сервером используется команда <strong>NOOP</strong><strong> </strong>. При активном соединении ответом на нее будет положительный индикатор “+ОК”:</td>
</tr>
<tr>
<td width="20%" valign="top"><strong>RSET</strong><strong> </strong></td>
<td width="40%" valign="top">С: RSETS: +OK maildrop has 2 messages (320 octets)</td>
<td width="40%" valign="top">Для отката транзакции внутри сессии используется команда <strong>RSET</strong><strong> </strong> (без аргументов). Если пользователь случайно Пометил на удаление какие-либо сообщения, он может убрать эти пометки, отправив эту команду:</td>
</tr>
<tr>
<td width="20%" valign="top">TOP msg n</td>
<td width="40%" valign="top">С ТОР 1 10S +OKS &lt;header&gt;</p>
<p>S &lt;blank&gt;</p>
<p>S &lt;message body&gt;</p>
<p>S .</td>
<td width="40%" valign="top">По этой команде пользователь может получить “n” первых строк сообщения с номером “msg”. РОРЗ- сервер по запросу клиента отправляет заголовок сообщения, затем пустую строку, затем требуемое количество строк сообщения (если количество строк в сообщении меньше указанного в параметре “n”, пользователю передается все сообщение).</td>
</tr>
<tr>
<td width="20%" valign="top">USER name</td>
<td width="40%" valign="top">С: USER fratedS: -ERR sorry, no mailbox for frated here<em>ИЛИ </em></p>
<p>С: USER mrose</p>
<p>S: +OK mrose is a real hoopy frood</td>
<td width="40%" valign="top">Когда РОРЗ -сессия находится в состоянии аутентификации (AUTHORIZATION), и клиент должен зарегистрировать себя на РОРЗ -сервере. Это может быть выполнено либо с помощью команд USER и PASS — ввод открытых пользовательского идентификатора и пароля (именно этот способ используется чаще), либо командой АРОР — аутентификация цифровой подписью, на базе секретного ключа. Любой РОРЗ -сервер должен поддерживать хотя бы один из механизмов аутентификации.Аргументом — “name” является строка, идентифицирующая почтовый ящик системы. Этот идентификатор должен быть уникальным в данной почтовой системе РОРЗ -сервера. Если ответом на эту команду является строка индикатора “+OK”, клиент может отправлять команду PASS — ввод пароля или QUIT — завершить сессию. Если ответом является строка “-ERR”, клиент может либо повторить команду USER, либо закрыть сессию</td>
</tr>
<tr>
<td width="20%" valign="top">PASS string</td>
<td width="40%" valign="top">С: USER mroseS: +OK mrose is a real hoopy froodС: PASS secret</p>
<p>S: -ERR maildrop already locked</p>
<p><em>ИЛИ</em></p>
<p>С: USER mrose</p>
<p>S: +OK mrose is a real hoopy frood</p>
<p>C: PASS secret</p>
<p>S: +OK mrose’s maildrop has 2 messages (320 octets)</td>
<td width="40%" valign="top">Аргументом команды является строка пароля данного почтового ящика. После получения команды PASS, РОРЗ -сервер, на основании аргументов команд USER и PASS, определяет возможность доступа к заданному почтовому ящику. Если РОРЗ -сервер ответил “+OK”, это означает, что аутентификация клиента прошла успешно и он может работать со своим почтовым ящиком, т. е. сессия переходит в состояние TRANSACTION. Если РОРЗ- сервер ответил “-ERR”, то либо был введен неверный пароль, либо не найден указанный почтовый ящик</td>
</tr>
<tr>
<td width="20%" valign="top">АРОР name digest</td>
<td width="40%" valign="top">S: +OK РОРЗ server ready 1896.697170952@dbc.mtview.ca.usС: АРОР mrose c4c9334bac560ecc979e58001b3e22fbS: +OK maildrop has 1 message (369 octets)</p>
<p>Алгоритм на основании открытого ключа “tanstaaf и временной метки</p>
<p><sup>&lt;</sup> 1896.697170952@dbc.rnt.view.ca.us&gt; построил шифрованную строку “c4c9334bac560ecc979e5800Ib3e22fb”.</td>
<td width="40%" valign="top">Команда аутентификации пользователя <strong>АРОР</strong> не входит в список обязательно реализуемых команд РОРЗ -сервера. Эта команда предоставляет значительно больший (по сравнению с командами USER или PASS) уровень защиты аутентификации пользователя при открытии сессии AUTHORIZATION и используется только тогда, когда к обеспечению конфиденциальности доступа к информации почтовых ящиков предъявляются повышенные требования. Эта команда может быть передана клиентом РОРЗ -сервера после получения приветственного сообщения или после ошибки обработки команд USER/PASS.Аргументами команды являются: name — имя пользователя (то же, что и в команде USER), digest — шифрованная (по алгоритму MD5) строка пароля. Применяемый здесь алгоритм необратимого шифрования для построения секретного ключа использует открытый ключ и временную метку. Временные метки передаются хосту клиента вместе с сообщением приветствия. Например, для UNIX-машин временная метка может иметь вид: &lt;process-ID.clock@hostname&gt;, где process-ID — это идентификатор процесса, clock — состояние таймера на момент установления соединения, hostname — имя компьютера РОРЗ -сервера. Этот механизм позволяет достичь очень высокой степени защищенности. Далее показан пример работы команды АРОР</td>
</tr>
<tr>
<td width="20%" valign="top"><strong> </strong><strong>QUIT</strong><strong> </strong></td>
<td width="40%" valign="top">С: QUITS: +ОК dewey POP3 server signing off</td>
<td width="40%" valign="top">К командам состояния AUTHORIZATION может относиться команда закрытия РОРЗ- сессии — <strong>QUIT</strong><strong> </strong>, если она была отправлена в режиме AUTHORIZATION (например, при вводе неправильного пароля или идентификатора пользователя):Эта команда отправляется без аргументов и всегда имеет единственный ответ “+ОК”.</td>
</tr>
<tr>
<td colspan="3">
<h2>Пример сценария работы с POP-сервером</h2>
</td>
</tr>
<tr>
<td colspan="3" valign="top"><em>Ниже приведена стандартная сессия работы с РОРЗ -протоколом.</em><br />
<span style="font-family: 'Courier New';">S: &lt;wait for connection on TCP port 110&gt;C: &lt;open connection&gt;S: +OK РОРЗ server ready</p>
<p>С: USER<strong> </strong>mrose</p>
<p>S: +OK mrose is a real hoopy frood</p>
<p>С: PASS secret</p>
<p>S: +OK mrose’s maildrop has 2 messages (320 octets)</p>
<p>С: STAT</p>
<p>S: +OK 2 320</p>
<p>С: LIST</p>
<p>S: +OK 2 messages (320 octets)</p>
<p>S: 1 120</p>
<p>S: 2 200</p>
<p>S: .</p>
<p>С: RETR 1</p>
<p>S: +OK 120 octets</p>
<p>S: &lt;the РОРЗ server sends message 1&gt;</p>
<p>S: .</p>
<p>С: DELE 1</p>
<p>S: +OK message 1 deleted</p>
<p>С: RETR 2</p>
<p>S: +OK 200 octets</p>
<p>S: &lt;the РОРЗ server sends message 2&gt;</p>
<p>S: .</p>
<p>С: DELE 2</p>
<p>S: +OK message 2 deleted</p>
<p>С: QUIT</p>
<p>S: +OK dewey РОРЗ server signing off (maildrop empty)</p>
<p>С: &lt;close connection&gt;</p>
<p>S: &lt;wait for next connection&gt;</p>
<p></span></td>
</tr>
</tbody>
</table>
<img src="http://losttower.ru/?ak_action=api_record_view&id=12&type=feed" alt="" />

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/proverka-pochty-na-perl/' rel='bookmark' title='Permanent Link: Проверка почты на Perl'>Проверка почты на Perl</a></li></ol></td></tr></table>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/protocol/komandy-protokola-pop3-priyom-pochty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание кросс-платформенных графических интерфейсов на wxPerl</title>
		<link>http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-wxperl/</link>
		<comments>http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-wxperl/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 09:24:20 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[GUI]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[wxWidgets]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=24</guid>
		<description><![CDATA[Автор: Александр Симаков.
Ссылка на оригинал.
Введение
wxPerl &#8211; это Perl-интерфейс к C++ библиотеке wxWidgets. wxWidgets, в свою очередь, является OpenSource тулкитом для постоения кросс-платформенных графических интерфейсов. Лейтмотив wxWidgets &#8211; &#8220;Native Look and Feel&#8221;. Достигается это за счет использования стандартных виджетов той платформы, на которой в данный момент работает программа. К примеру, wx-приложение под Windows будет выглядеть так [...]

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на Perl/GTK+'>Создание кросс-платформенных графических интерфейсов на Perl/GTK+</a></li><li><a href='http://losttower.ru/ruby/gui-ruby/sozdanie-graficheskix-interfejsov-na-ruby-gtk2/' rel='bookmark' title='Permanent Link: Создание графических интерфейсов на Ruby/GTK2'>Создание графических интерфейсов на Ruby/GTK2</a></li></ol></td></tr></table>]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;">Автор: Александр Симаков.<br />
<a href="http://losttower.ru/goto/http://alexander-simakov.blogspot.com/2009/10/wxperl.html" >Ссылка на оригинал.</a></p>
<p><span style="font-weight: bold; font-size: 130%;">Введение</span></p>
<div style="text-align: justify;"><a href="http://losttower.ru/goto/http://wxperl.sourceforge.net/" >wxPerl</a> &#8211; это Perl-интерфейс к C++ библиотеке <a href="http://losttower.ru/goto/http://www.wxwidgets.org/" >wxWidgets</a>. wxWidgets, в свою очередь, является OpenSource тулкитом для постоения кросс-платформенных графических интерфейсов. Лейтмотив wxWidgets &#8211; &#8220;Native Look and Feel&#8221;. Достигается это за счет использования стандартных виджетов той платформы, на которой в данный момент работает программа. К примеру, wx-приложение под Windows будет выглядеть так же как и остальные Windows-приложения, а в Mac OS X &#8211; как другие приложения Mac OS X. К слову, для некоторых платформ существует сразу несколько портов wxWidgets. Так в Linux, wxWidgets может работать &#8220;поверх&#8221; GTK+, X11 или Motif. Первый вариант, однако, наиболее распространен. Не смотря на то, что wxWidgets является надстройкой над другими графическими тулкитами, разработчики уверяют, что накладные расходы будут минимальны.</div>
<p><span id="more-24"></span></p>
<div style="text-align: justify;">Ещё одна примечательная черта wxWidgets &#8211; удобный механизм для создания специализированных виджетов на базе существующих. Сам механизм чрезвычайно прост: достаточно отнаследоваться от базового класса и добавить к нему необходимый функционал. Разумеется, подобные возможности предоставляют и другие тулкиты, такие как Tk или GTK+, но в wxWidgets это делается проще чем в Tk и документировано лучше чем в GTK+. К слову, widget subclassing является стандартной идиомой при программировании на wxWidgets.</div>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Обзор wxWidgets</span></span></p>
<div style="text-align: justify;">Для того чтобы лучше понять wxPerl полезно представлять себе окружающий его контекст, прежде всего, проект wxWidgets. Первоначальным автором wxWidgets является Джулиан Смарт (Julian Smart). Джулиан начал работать над wxWidgets (раньше wxWidgets назывался wxWindows) в 1992 году, будучи студентом Artificial Intelligence Applications Institute в Эдинбурге. Изначально, целью его работы было создание специализированного CASE-инструмента, который, по задумке, должен был работать как в Windows так и в UNIX-системах. Спустя некоторое время, к проекту начали присоединяться и другие энтузиасты, которые, общими усилиями и превратили wxWidgets в то, чем он является сегодня. В настоящий момент над wxWidgets трудится целая <a href="http://losttower.ru/goto/http://www.wxwidgets.org/about/whowhat.htm" >команда</a> программистов, включая и Джулиана. Примечательно, что три наиболее активных разработчика руководят собственными консалтинговыми компаниями, специализирующимися на wxWidgets.</div>
<div style="text-align: justify;">Из приятных вещей стоит отметить наличие хорошей документации, предкомпилированных версий wxWidgets для разных платформ, а также наличие соответствующих RPM и DEB пакетов в большинстве Linux-дистрибутивов. Есть и достаточно популярные приложения, написанные на wxWidgets: например, аудио редактор Audacity и <a href="http://losttower.ru/goto/http://wiki.videolan.org/WxWindows" >медиа-плеер VLC</a>. Подборку скриншотов различных wx-приложений можно посмотреть <a href="http://losttower.ru/goto/http://www.wxwidgets.org/about/screensh.htm" >тут</a>.</div>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Обзор wxPerl</span></span></p>
<div style="text-align: justify;">Если вы программируете на C++, то можете &#8220;разговаривать&#8221; с wxWidgets без переводчика: этот язык является для него родным. В противном случае придется воспользоваться библиотеками-обёртками: для языка Perl &#8211; это wxPerl. Автором проекта wxPerl является Маттиа Бэрбон (Mattia Barbon). Проект стартовал в 2001 году и продолжает развиваться. Так последний релиз wxPerl (0.93) датируется 24 сентября 2009. С предкомпилированными версиями wxPerl не всё так гладко: иногда они отстают от последней версии wxPerl, особенно это относится к Windows. В самых свежих Linux- и BSD-дистрибутивах ситуация несколько лучше: так пакет с wxPerl версии 0.93 есть в <a href="http://losttower.ru/goto/http://fr2.rpmfind.net/linux/RPM/mandriva/devel/2010.0/SRPMS/contrib/release/perl-Wx-0.930.0-1mdv2010.0.src.html" >Mandriva 2010</a>, в портах <a href="http://losttower.ru/goto/http://www.openbsd.org/cgi-bin/cvsweb/ports/x11/p5-Wx/" >OpenBSD</a>, в <a href="http://losttower.ru/goto/http://packages.debian.org/ru/sid/libwx-perl" >Debian unstable (sid)</a>. В любом случае, собрать wxPerl в UNIX намного проще чем в Windows. Более подробно об установке wxPerl читайте в следующих разделах.</div>
<div style="text-align: justify;">Из неприятных моментов следует отметить <a href="http://losttower.ru/goto/http://wxperl.sourceforge.net/documentation.html" >документацию</a> по wxPerl, а точнее её отсутствие. На сайте wxPerl рекомендуется использовать документацию по wxWidgets и мысленно транслировать её на Perl, руководствуясь рядом правил. Также имеется несколько tutorial-ов и <a href="http://losttower.ru/goto/http://wxperl.pvoice.org/kwiki/" >wxPerl Wiki</a>. Последняя встречает посетителей следующим сообщением:</div>
<blockquote><p>The previous wxPerl wiki was not only spammed, but someone managed to entirely erase everything on disk that had to do with the kwiki-wiki. It&#8217;s now reinstalled and recovered as far as possible.</p>
<p>So&#8230;</p>
<p>please feel free to, create an account and start adding information!</p>
<p>Cheers.</p></blockquote>
<div style="text-align: justify;">Страница со <a href="http://losttower.ru/goto/http://wxperl.sourceforge.net/sshot01.html" >скриншотами</a> wxPerl также давно не обновлялась: на ней представлен wxPerl версий от 0.14 (апрель 2003) до 0.21 (декабрь 2004). Ну и, наконец, обидно, что по wxPerl нет книги, хотя по тому-же <a href="http://losttower.ru/goto/http://www.wxpython.org/" >wxPython</a> книга <a href="http://losttower.ru/goto/http://www.amazon.com/gp/product/1932394621/ref=cm_rdp_product" >есть</a>.</div>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Установка в Linux</span></span></p>
<div style="text-align: justify;">Если вам повезло и в вашем дистрибутиве оказался соответствующий пакет, то можете смело пропустить этот раздел. Если нет, то придется собрать wxPerl вручную из CPAN. Для начала необходимо установить саму библиотеку wxWidgets с заголовочными файлами. К примеру, в Mandriva Linux 2008 необходимые пакеты называются <tt>libwxgtku2.8</tt> и <tt>libwxgtku2.8-devel</tt> соответственно. Обратите внимание на букву &#8220;u&#8221; в названиях пакетов. Она означает, что wxWidgets скомпилирован с поддержкой Unicode. После того как библиотеки поставлены, установите следующие Perl-модули: <a href="http://losttower.ru/goto/http://search.cpan.org/perldoc?Wx" >Wx</a>, <a href="http://losttower.ru/goto/http://search.cpan.org/perldoc?Alien::wxWidgets" >Alien::wxWidgets</a> и <a href="http://losttower.ru/goto/http://search.cpan.org/perldoc?ExtUtils::XSpp" >ExtUtils::XSpp</a>.</div>
<p><span style="font-weight: bold; font-size: 130%;">Установка в Windows</span></p>
<div style="text-align: justify;">Прежде чем приступить к установке wxPerl, необходимо <a href="http://losttower.ru/goto/http://wxwidgets.org/downloads/" >скачать</a> и проинсталлировать библиотеку wxWidgets. Почти наверняка этот шаг не вызовет никаких сложностей. Далее следует установить wxPerl. Если вы пользуетесь дистрибутивом ActivePerl, то проще всего подключить <a href="http://losttower.ru/goto/http://www.wxperl.co.uk/ppm.html" >PPM-репозиторий</a>, который поддерживает Марк Дутсон (Mark Dootson), и установить модуль <tt>Wx</tt> отдуда. Однако, необходимо иметь в виду две вещи: во-первых, в репозитории может быть не самая последняя версия <tt>Wx</tt> (на момент написания этих строк &#8211; 0.89.1), а во-вторых, необходимо установить правильную версию пакета <tt>Alien-wxWidgets</tt>, от которого зависит <tt>Wx</tt>. На момент написания этих строк в репозитории находятся две версии <tt>Alien-wxWidgets</tt>: 0.39 и 0.44 По умолчанию, разрешая зависимости программа PPM выберет самую свежую версию &#8211; 0.44. Проблема в том, <tt>Alien-wxWidgets</tt> версии 0.44 не будет работать с <tt>Wx</tt> версии 0.89.1! Для того чтобы обойти эту неприятность следует явно установить <tt>Alien-wxWidgets</tt> версии 0.39, а затем уже установить <tt>Wx</tt>. На выяснение этого &#8220;очевидного&#8221; факта ушло более часа поисков. Впрочем, возможно на момент прочтения этих строк данная проблема будет уже устранена.</div>
<p><a href="http://losttower.ru/goto/http://1.bp.blogspot.com/_lc_7UApfk3o/SsZqtvH-DjI/AAAAAAAAAG8/dOcmYo7Kzc8/s1600-h/ppm.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388111338171928114" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 325px;" src="http://1.bp.blogspot.com/_lc_7UApfk3o/SsZqtvH-DjI/AAAAAAAAAG8/dOcmYo7Kzc8/s400/ppm.png" border="0" alt="" /></a></p>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Минимальное приложение на wxPerl</span></span></p>
<div style="text-align: justify;">Теперь, когда wxPerl установлен, можно опробовать его в действии. Тестовое приложение состоит из двух файлов (файлы должны находиться в одной директории).</div>
<p><tt>wx-minimal.pl</tt>:</p>
<div>
<pre style="background: #ffffff none repeat scroll 0% 0%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="color: #696969;">#!/usr/bin/perl</span>

<span style="color: #696969;">#</span>
<span style="color: #696969;"># Александр Симаков, &lt;xdr (тчк) box на Google Mail&gt;</span>
<span style="color: #696969;"># </span><span style="color: #5555dd;">http://alexander-simakov.blogspot.com/</span>
<span style="color: #696969;">#</span>
<span style="color: #696969;"># Простейшая программа использующая wxPerl</span>
<span style="color: #696969;">#</span>

<span style="color: #800000; font-weight: bold;">use</span> <span style="color: #800000; font-weight: bold;">strict</span><span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> warnings<span style="color: #800080;">;</span>

<span style="color: #800000; font-weight: bold;">use</span> <span style="color: #bb7977; font-weight: bold;">FindBin</span><span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> <span style="color: #bb7977; font-weight: bold;">lib</span> <span style="color: #0000e6;">"</span><span style="color: #0000e6;">$FindBin</span><span style="color: #808030;">::</span><span style="color: #0000e6;">Bin</span><span style="color: #0000e6;">"</span><span style="color: #800080;">;</span>

<span style="color: #800000; font-weight: bold;">use</span> Wx<span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> MinimalApp<span style="color: #800080;">;</span>

<span style="color: #800000; font-weight: bold;">sub </span>main<span style="color: #808030;">(</span><span style="color: #808030;">)</span> <span style="color: #800080;">{</span>
    <span style="color: #696969;"># Создаём экземпляр приложения и ...</span>
    <span style="color: #800000; font-weight: bold;">my</span> $minimal_app <span style="color: #808030;">=</span> MinimalApp<span style="color: #808030;">-&gt;</span>new<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>
    <span style="color: #696969;"># ... запускаем цикл обработки событий.</span>
    $minimal_app<span style="color: #808030;">-&gt;</span>MainLoop<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>
<span style="color: #800080;">}</span>

main<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span></pre>
</div>
<p><tt>MinimalApp.pm</tt>:</p>
<div>
<pre style="background: #ffffff none repeat scroll 0% 0%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="color: #800000; font-weight: bold;">package </span>MinimalApp<span style="color: #800080;">;</span>

<span style="color: #696969;">#</span>
<span style="color: #696969;"># Александр Симаков, &lt;xdr (тчк) box на Google Mail&gt;</span>
<span style="color: #696969;"># </span><span style="color: #5555dd;">http://alexander-simakov.blogspot.com/</span>
<span style="color: #696969;">#</span>
<span style="color: #696969;"># Минимальный класс приложения WxPerl</span>
<span style="color: #696969;">#</span>

<span style="color: #800000; font-weight: bold;">use</span> <span style="color: #800000; font-weight: bold;">strict</span><span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> warnings<span style="color: #800080;">;</span>

<span style="color: #800000; font-weight: bold;">use</span> utf8<span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> encoding <span style="color: #0000e6;">'utf8'</span><span style="color: #800080;">;</span>

<span style="color: #800000; font-weight: bold;">use</span> Wx<span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> base <span style="color: #800000; font-weight: bold;">qw</span><span style="color: #800000;">{</span><span style="color: #0000e6;"> Wx::App </span><span style="color: #800000;">}</span><span style="color: #800080;">;</span>

<span style="color: #800000; font-weight: bold;">sub </span>OnInit <span style="color: #800080;">{</span>
    <span style="color: #696969;"># Создаём окно</span>
    <span style="color: #800000; font-weight: bold;">my</span> $frame <span style="color: #808030;">=</span> <span style="color: #bb7977; font-weight: bold;">Wx</span><span style="color: #808030;">::</span><span style="color: #bb7977; font-weight: bold;">Frame</span><span style="color: #808030;">-&gt;</span>new<span style="color: #808030;">(</span>
        <span style="color: #800000; font-weight: bold;">undef</span><span style="color: #808030;">,</span>                              <span style="color: #696969;"># Родительское окно</span>
        <span style="color: #808030;">-</span><span style="color: #008c00;">1</span><span style="color: #808030;">,</span>                                 <span style="color: #696969;"># ID окна (-1 значит сгенерировать автоматически)</span>
        <span style="color: #0000e6;">'Минимальное приложение на wxPerl'</span><span style="color: #808030;">,</span> <span style="color: #696969;"># Заголовок окна</span>
        <span style="color: #808030;">[</span> <span style="color: #808030;">-</span><span style="color: #008c00;">1</span><span style="color: #808030;">,</span> <span style="color: #808030;">-</span><span style="color: #008c00;">1</span> <span style="color: #808030;">]</span><span style="color: #808030;">,</span>                         <span style="color: #696969;"># Позиция окна (значение по умолчанию)</span>
        <span style="color: #808030;">[</span> <span style="color: #008c00;">450</span><span style="color: #808030;">,</span> <span style="color: #008c00;">100</span> <span style="color: #808030;">]</span><span style="color: #808030;">,</span>                       <span style="color: #696969;"># Размер окна</span>
    <span style="color: #808030;">)</span><span style="color: #800080;">;</span>

    <span style="color: #696969;"># Отображаем его на экране</span>
    $frame<span style="color: #808030;">-&gt;</span>Show<span style="color: #808030;">(</span> <span style="color: #008c00;">1</span> <span style="color: #808030;">)</span><span style="color: #800080;">;</span>
<span style="color: #800080;">}</span>

<span style="color: #008c00;">1</span><span style="color: #800080;">;</span></pre>
</div>
<div style="text-align: justify;">Вот как выглядит результат запуска этой программы:</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://3.bp.blogspot.com/_lc_7UApfk3o/SsZwPURVR9I/AAAAAAAAAHE/vrRyUPhb7WY/s1600-h/wx-minimal-linux.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388117412637132754" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 116px;" src="http://3.bp.blogspot.com/_lc_7UApfk3o/SsZwPURVR9I/AAAAAAAAAHE/vrRyUPhb7WY/s400/wx-minimal-linux.png" border="0" alt="" /></a>Вид в Linux</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://4.bp.blogspot.com/_lc_7UApfk3o/SsZwXc06CII/AAAAAAAAAHM/-KFVw83XxTA/s1600-h/wx-minimal-windows.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388117552372779138" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 127px;" src="http://4.bp.blogspot.com/_lc_7UApfk3o/SsZwXc06CII/AAAAAAAAAHM/-KFVw83XxTA/s400/wx-minimal-windows.png" border="0" alt="" /></a>Вид в Windows</div>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Wx::Demo</span></span></p>
<div style="text-align: justify;">Для изучения wxPerl очень полезно ознакомится с подборкой демонстрационных программ. Все программы объединены под одним интерфейсом: сразу можно посмотреть как на внешний вид, так и на исходный текст приложения. Соответствующий модуль называется <a href="http://losttower.ru/goto/http://search.cpan.org/perldoc?Wx::Demo" >Wx::Demo</a>. Пользователи Windows могут установить этот модуль из упомянутого выше PPM-репозитория. На этот раз никаких сюрпризов нет. Запускной файл называется <tt>wxperl_demo.pl</tt></div>
<div style="text-align: justify;">Wx::Demo даёт хорошее представление о возможностях wxPerl, но также обнажает и некоторые недоработки. Сравните виджет wxComboCtrl в Linux и в Windows:</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://2.bp.blogspot.com/_lc_7UApfk3o/SsZ5PKnJkyI/AAAAAAAAAHU/JawXRddv7rQ/s1600-h/combo-ctrl-linux.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388127305648935714" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 260px;" src="http://2.bp.blogspot.com/_lc_7UApfk3o/SsZ5PKnJkyI/AAAAAAAAAHU/JawXRddv7rQ/s400/combo-ctrl-linux.png" border="0" alt="" /></a>Вид в Linux</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://4.bp.blogspot.com/_lc_7UApfk3o/SsZ5ZbCmQqI/AAAAAAAAAHc/qKVshxlHFEs/s1600-h/combo-ctrl-windows.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388127481857720994" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_lc_7UApfk3o/SsZ5ZbCmQqI/AAAAAAAAAHc/qKVshxlHFEs/s400/combo-ctrl-windows.png" border="0" alt="" /></a>Вид в Windows</div>
<div style="text-align: justify;">А вот ещё пара примеров: при масштабировании окна виджеты &#8220;наезжают&#8221; друг на друга:</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://3.bp.blogspot.com/_lc_7UApfk3o/SsZ9uNGSMdI/AAAAAAAAAHk/cVKtG91SL8w/s1600-h/listbook-linux.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388132236938850770" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 274px;" src="http://3.bp.blogspot.com/_lc_7UApfk3o/SsZ9uNGSMdI/AAAAAAAAAHk/cVKtG91SL8w/s400/listbook-linux.png" border="0" alt="" /></a>Вид в Linux</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://2.bp.blogspot.com/_lc_7UApfk3o/SsZ94IZByAI/AAAAAAAAAHs/mguHcs4AzeM/s1600-h/listbook-windows.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388132407473981442" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 326px;" src="http://2.bp.blogspot.com/_lc_7UApfk3o/SsZ94IZByAI/AAAAAAAAAHs/mguHcs4AzeM/s400/listbook-windows.png" border="0" alt="" /></a>Вид в Windows</div>
<div style="text-align: justify;">В целом, идея использования виджетов хост-системы очень логична. Однако, встречаются виджеты, специфичные для какой-то конкретной платформы. К таким виджетам, например, относится GtkExpander. Обратите внимание как выглядит этот виджет в Linux (напомню, в Linux wxWidgets базируется на GTK+) и в Windows:</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://2.bp.blogspot.com/_lc_7UApfk3o/SsZ_TqLH60I/AAAAAAAAAH0/SlJRhJrb3iU/s1600-h/expander-linux.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388133979910564674" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 299px;" src="http://2.bp.blogspot.com/_lc_7UApfk3o/SsZ_TqLH60I/AAAAAAAAAH0/SlJRhJrb3iU/s400/expander-linux.png" border="0" alt="" /></a>Вид в Linux</div>
<div style="text-align: center;"><a href="http://losttower.ru/goto/http://1.bp.blogspot.com/_lc_7UApfk3o/SsZ_4RVnDhI/AAAAAAAAAH8/bmMBHxni7lE/s1600-h/expander-windows.png"  onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5388134608898821650" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_lc_7UApfk3o/SsZ_4RVnDhI/AAAAAAAAAH8/bmMBHxni7lE/s400/expander-windows.png" border="0" alt="" /></a>Вид в Windows</div>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Выводы</span></span></p>
<div style="text-align: justify;">В целом, wxPerl достаточно интересный и перспективный проект. Вместе с тем, стоит признать, что пока уровень поддержки тулкита wx в языке Perl существенно скромнее чем, скажем, в Python или C++. Таким образом, остановив свой выбор на wxPerl будьте готовы приложить дополнительные усилия на установку и настройку своего окружения, а также на поиски документации и дргугих справочных материалов.</div>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Ссылки</span></span></p>
<ul>
<li><a href="http://losttower.ru/goto/http://wxperl.sourceforge.net/documentation.html" >Подборка tutorial-ов по wxPerl</a></li>
<li><a href="http://losttower.ru/goto/http://www.perl.com/pub/a/2001/09/12/wxtutorial1.html" >Статья: wxPerl: Another GUI for Perl</a></li>
<li><a href="http://losttower.ru/goto/http://kiev.pm.org:8000/Kiev.PM/wiki/WxPerl" >Статья: Создание GUIs средствами WxPerl</a></li>
<li><a href="http://losttower.ru/goto/http://www.ibm.com/developerworks/ru/library/l-wxwidgets/index.html" >Статья: Создание кросс-платформенных GUI-приложений с использованием wxWidgets</a></li>
<li><a href="http://losttower.ru/goto/http://m.habrahabr.ru/post/65433/" >Perl и GUI. Сравнение тулкитов</a></li>
<li><a href="http://www.nntp.perl.org/group/perl.wxperl.users/">wxPerl mailing list<br />
</a></li>
<li><a href="http://losttower.ru/goto/http://wxwidgets.blogspot.com/" >Официальный блог wxWidgets</a></li>
</ul>
<div style="text-align: justify;">Для интереса, вот ссылки на биндинги тулкита wx для других языков программирования:</div>
<ul>
<li><a href="http://losttower.ru/goto/http://www.wxpython.org/" >wxPython</a></li>
<li><a href="http://losttower.ru/goto/http://www.wxpython.org/" >wx.NET</a></li>
<li><a href="http://losttower.ru/goto/http://wxeuphoria.sourceforge.net/" >wxEuphoria</a></li>
<li><a href="http://losttower.ru/goto/http://wxlua.sourceforge.net/" >wxLua</a></li>
<li><a href="http://losttower.ru/goto/http://wxbasic.sourceforge.net/" >wxBasic</a></li>
</ul>
<p><em>Статья опубликована на портале <a href="http://losttower.ru/goto/http://citforum.ru/internet/perl/wx/" >CITForum</a></em></p>
<img src="http://losttower.ru/?ak_action=api_record_view&id=24&type=feed" alt="" />

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на Perl/GTK+'>Создание кросс-платформенных графических интерфейсов на Perl/GTK+</a></li><li><a href='http://losttower.ru/ruby/gui-ruby/sozdanie-graficheskix-interfejsov-na-ruby-gtk2/' rel='bookmark' title='Permanent Link: Создание графических интерфейсов на Ruby/GTK2'>Создание графических интерфейсов на Ruby/GTK2</a></li></ol></td></tr></table>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-wxperl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zenity – создание GTK+ интерфейсов прямо из консоли!</title>
		<link>http://losttower.ru/shell/zenity-sozdanie-gtk-interfejsov-pryamo-iz-konsoli/</link>
		<comments>http://losttower.ru/shell/zenity-sozdanie-gtk-interfejsov-pryamo-iz-konsoli/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 12:55:28 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[Shell]]></category>
		<category><![CDATA[Gtk+]]></category>
		<category><![CDATA[Zenity]]></category>
		<category><![CDATA[консоль]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=8</guid>
		<description><![CDATA[Классная утилита создания графических интерфейсов прямо из sh скриптов. Пользоваться ей просто:
zenity [OPTION...]
Для начала вызов help’а:
 -?, --help                      Показать параметры справки
 --help-all             [...]


Ничего похожего не нашёл.]]></description>
			<content:encoded><![CDATA[<p>Классная утилита создания графических интерфейсов прямо из sh скриптов. Пользоваться ей просто:</p>
<pre>zenity [OPTION...]</pre>
<p><span id="more-8"></span>Для начала вызов help’а:</p>
<pre> -?, --help                      Показать параметры справки
 --help-all                      Показать все параметры справки
 --help-general                  Показывать общие параметры
 --help-calendar                 Показывать параметры календаря
 --help-entry                    Показывать параметры ввода текста
 --help-error                    Показывать параметры диалога вывода ошибки
 --help-info                     Показывать параметры диалога вывода информации
 --help-file-selection           Показывать параметры диалога выбора файлов
 --help-list                     Показывать параметры списка
 --help-notification             Показывать параметры значка уведомления
 --help-progress                 Показывать параметры хода процесса
 --help-question                 Показывать параметры запроса
 --help-warning                  Показывать параметры диалога для вывода предупреждения
 --help-scale                    Показывать параметры масштаба
 --help-text-info                Показывать параметры текстовой информации
 --help-misc                     Показывать прочие параметры
 --help-gtk                      Показать параметры GTK+</pre>
<p>Ну и непосредственно параметры для отрисовки GTK окна</p>
<pre> --calendar                      Отобразить диалог для выбора даты
 --entry                         Отобразить диалог для ввода текста
 --error                         Отобразить диалог для вывода ошибки
 --info                          Отобразить диалог для вывода информации
 --file-selection                Отобразить диалог для выбора файла
 --list                          Отобразить диалог со списком
 --notification                  Отобразить диалог уведомления
 --progress                      Отобразить диалог хода процесса
 --question                      Отобразить диалог с вопросом
 --warning                       Отобразить диалог с предупреждением
 --scale                         Отобразить диалог масштаба
 --text-info                     Отобразить диалог с текстовой информацией
 --display=DISPLAY               X display to use</pre>
<p>Примеры:<br />
<code>zenity --info --title="Пример" --text="Это текст для примера"</code><br />
<a href="http://losttower.ru/goto/http://useunix.ru/goto/http://wiki.linux.uz/index.php/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5:Zenity_info_example.png" title="Изображение:zenity info example.png" rel="nofollow"  target="_blank"><img src="http://wiki.linux.uz/images/Zenity_info_example.png" border="0" alt="Изображение:zenity info example.png" width="249" height="152" /></a><br />
<code>ls `zenity --entry --title="Пример ввода" --text="Напишите, например '/media':"`</code><br />
(zenity выводит в консоль содержимое поля, как на примере – если ввести путь, то zenity передаст его команде “ls”)<br />
<a href="http://losttower.ru/goto/http://useunix.ru/goto/http://wiki.linux.uz/index.php/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5:Zenity_entry_example.png" title="Изображение:zenity entry example.png" rel="nofollow"  target="_blank"><img src="http://wiki.linux.uz/images/Zenity_entry_example.png" border="0" alt="Изображение:zenity entry example.png" width="250" height="140" /></a></p>
<img src="http://losttower.ru/?ak_action=api_record_view&id=8&type=feed" alt="" />

<p>Ничего похожего не нашёл.</p>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/shell/zenity-sozdanie-gtk-interfejsov-pryamo-iz-konsoli/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание кросс-платформенных графических интерфейсов на Perl/GTK+</title>
		<link>http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/</link>
		<comments>http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 09:56:24 +0000</pubDate>
		<dc:creator>helios</dc:creator>
				<category><![CDATA[GUI]]></category>
		<category><![CDATA[Gtk+]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://losttower.ru/?p=28</guid>
		<description><![CDATA[Автор: Александр Симаков.
Ссылка на оригинал.
Введение
В этой статье приводится обзор библиотеки GTK+ и её интерфейса к языку Perl &#8211; Gtk2-Perl. Поскольку GUI-приложения написанные на Gtk2-Perl довольно большая редкость, собирать информацию приходится по крупицам. Цель статьи &#8211; постараться дать объективную оценку связке Perl/GTK+: отметить сильные и слабые стороны, предупредить о возможных сложностях и проблемах.
Библиотека GTK+
Изначально библиотека GTK+ [...]

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-wxperl/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на wxPerl'>Создание кросс-платформенных графических интерфейсов на wxPerl</a></li><li><a href='http://losttower.ru/ruby/gui-ruby/sozdanie-graficheskix-interfejsov-na-ruby-gtk2/' rel='bookmark' title='Permanent Link: Создание графических интерфейсов на Ruby/GTK2'>Создание графических интерфейсов на Ruby/GTK2</a></li><li><a href='http://losttower.ru/perl/gui/ustanovka-perl-gtk2-na-windows-s-pomoshhyu-camelboxa/' rel='bookmark' title='Permanent Link: Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а'>Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а</a></li></ol></td></tr></table>]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;">Автор: Александр Симаков.<br />
<a href="http://alexander-simakov.blogspot.com/2009/08/perlgtk.html">Ссылка на оригинал.</a></p>
<p><span style="font-size: 130%;"><span style="font-weight: bold;">Введение</span></span></p>
<div style="text-align: justify;">В этой статье приводится обзор библиотеки <a href="http://www.gtk.org/">GTK+</a> и её интерфейса к языку Perl &#8211; <a href="http://gtk2-perl.sourceforge.net/">Gtk2-Perl</a>. Поскольку GUI-приложения написанные на Gtk2-Perl довольно большая редкость, собирать информацию приходится по крупицам. Цель статьи &#8211; постараться дать объективную оценку связке Perl/GTK+: отметить сильные и слабые стороны, предупредить о возможных сложностях и проблемах.</div>
<p><span id="more-28"></span><span style="font-size: 130%;"><span style="font-weight: bold;">Библиотека GTK+</span></span></p>
<div style="text-align: justify;">Изначально библиотека GTK+ была разработана Питером Матисом (Peter Mattis) и Спенсером Кимбелом (Spencer Kimball) для нужд графического редактора GIMP (GNU Image Manipulation Program), но потом была выделена в отдельный проект. Сама библиотека GTK+ написана на C, но существуют языковые привязки (language bindings) и для многих других языков программирования, в их числе и Perl.</div>
<div style="text-align: justify;">Судя по графику релизов и количеству баг-фиксов проект GTK+ развивается достаточно активными темпами. За время существования проекта вокруг него сформировалось внушительное сообщество, что также является положительным моментом. В настоящее время <a href="http://www.gtk.org/development.html">команда ключевых разработчиков</a> состоит из десяти человек, представляющих такие компании как Red Hat, Novell и Intel Open Source Technology Center.</div>
<div style="text-align: justify;">Следует отметить хорошую поддержку механизмов интернационализации и локализации: обратите внимание на использование кодировки UTF-8 в примере.</div>
<div style="text-align: justify;"><a href="http://www.gtk.org/documentation.html">Документация</a> по библиотекам, входящим в состав GTK+, поддерживается в актуальном состоянии, однако тут есть один нюанс. Разработчики языковых привязок зачастую считают документацию по своим интерфейсам &#8220;производной&#8221; от документации по оригинальным библиотекам GTK+ и поэтому не всегда поддерживают её в актуальном состоянии. Именно такая ситуация наблюдается с Gtk2-Perl.</div>
<p><span style="font-weight: bold; font-size: 130%;">Установка в Linux/BSD</span></p>
<div style="text-align: justify;">Поскольку GTK+ родом из страны UNIX, проблем с её установкой в UNIX-подобных системах обычно не возникает. Вполне может быть, что все необходимые библиотеки и модули у вас уже установлены. Если нет, то наверняка поставщик вашего дистрибутива подготовил пакет со всем необходимым. К примеру, в Mandriva Linux соответствующий пакет называется <tt>perl-Gtk2</tt>, а в OpenBSD &#8211; <tt>p5-Gtk2</tt>.</div>
<p><span style="font-weight: bold; font-size: 130%;"><br />
Установка в Windows</span></p>
<div style="text-align: justify;">В Windows всё несколько сложнее. Поскольку Windows-машина с установленным компилятором языка C и необходимым для сборки окружением скорее исключение чем правило, надеяться приходится только на то, что кто-то заботливо скомпилировал для нас все необходимые библиотеки и языковые привязки к ним. Самое интересное, что на момент написания этих строк в ActivePerl, самом популярном Perl-дистрибутиве для Windows, такого пакета нет! Компиляция этого пакета со всеми зависимостями под Windows &#8211; нетривиальная и достаточно хлопотная процедура. На сайте Gtk-perl в разделе <a href="http://gtk2-perl.sourceforge.net/win32/">Win32 Support</a> даются ссылки на альтернативные PPM-репозитории для ActivePerl, однако это тоже не помогло. Что же делать? Обратите внимание на проект <a href="http://code.google.com/p/camelbox/">Camelbox</a>. Это Perl-дистрибутив под Windows, в состав которого уже включена поддержка самой последней версии GTK+. Если вы хотите использовать ActivePerl, придется приложить дополнительные усилия.</div>
<p><span style="font-size: 130%;"><br />
<span style="font-weight: bold;">Минимальное приложение</span></span></p>
<div style="text-align: justify;">Продемонстрируем работу Gtk2-Perl на простом примере: окне с кнопкой. Этот пример дает первоначальное представление об API библиотеки и служит своего рода тестом: если программа запустилась, значит все необходимые библиотеки установлены и работают правильно.</div>
<div style="text-align: justify;">Приведенный пример запускается без модификаций как минимум на трёх платформах: Linux, OpenBSD и Windows. Как правило и с более сложными приложениями проблем не возникает. Итак, исходный код:</div>
<div>
<pre><span style="color: #696969;">#!/usr/bin/perl</span>

<span style="color: #696969;">#</span>
<span style="color: #696969;"># Александр Симаков, &lt;xdr (тчк) box на Google Mail&gt;</span>
<span style="color: #696969;"># </span><span style="color: #5555dd;">http://alexander-simakov.blogspot.com/</span>
<span style="color: #696969;">#</span>
<span style="color: #696969;"># Простейшая программа использующая Gtk2-Perl</span>
<span style="color: #696969;">#</span>

<span style="color: #800000; font-weight: bold;">use</span> <span style="color: #800000; font-weight: bold;">strict</span><span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> warnings<span style="color: #800080;">;</span>

<span style="color: #696969;"># Включаем поддержку Unicode</span>
<span style="color: #800000; font-weight: bold;">use</span> utf8<span style="color: #800080;">;</span>
<span style="color: #800000; font-weight: bold;">use</span> encoding <span style="color: #0000e6;">'utf8'</span><span style="color: #800080;">;</span>

<span style="color: #696969;"># Загрузка и инициализация библиотеки Gkt2. Инициализация</span>
<span style="color: #696969;"># библиотеки (параметр -init) должна выполняться ровно</span>
<span style="color: #696969;"># один раз.</span>
<span style="color: #800000; font-weight: bold;">use</span> Gtk2 <span style="color: #808030;">-</span>init<span style="color: #800080;">;</span>

<span style="color: #800000; font-weight: bold;">sub </span>main<span style="color: #808030;">(</span><span style="color: #808030;">)</span> <span style="color: #800080;">{</span>
<span style="color: #696969;">    # Создаем главное окно</span>
<span><span style="color: #696969;">    </span></span><span style="color: #800000; font-weight: bold;">my</span> $window <span style="color: #808030;">=</span> <span style="color: #bb7977; font-weight: bold;">Gtk2</span><span style="color: #808030;">::</span><span style="color: #bb7977; font-weight: bold;">Window</span><span style="color: #808030;">-&gt;</span>new<span style="color: #808030;">(</span><span style="color: #0000e6;">'toplevel'</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>

<span><span style="color: #696969;">    </span></span><span style="color: #696969;"># Устанавливаем обработчик сигнала закрытия окна</span>
<span><span style="color: #696969;">    </span></span>$window<span style="color: #808030;">-&gt;</span>signal_connect<span style="color: #808030;">(</span> delete_event <span style="color: #808030;">=</span><span style="color: #808030;">&gt;</span> <span style="color: #800000; font-weight: bold;">sub</span> <span style="color: #800080;">{</span> Gtk2<span style="color: #808030;">-&gt;</span>main_quit <span style="color: #800080;">}</span> <span style="color: #808030;">)</span><span style="color: #800080;">;</span>

<span><span style="color: #696969;">    </span></span><span style="color: #696969;"># Создаем кнопку</span>
<span><span style="color: #696969;">    </span></span><span style="color: #800000; font-weight: bold;">my</span> $button <span style="color: #808030;">=</span> <span style="color: #bb7977; font-weight: bold;">Gtk2</span><span style="color: #808030;">::</span><span style="color: #bb7977; font-weight: bold;">Button</span><span style="color: #808030;">-&gt;</span>new<span style="color: #808030;">(</span><span style="color: #0000e6;">'Тест'</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>

<span><span style="color: #696969;">    </span></span><span style="color: #696969;"># Устанавливаем обработчик на кнопку</span>
<span><span style="color: #696969;">    </span></span>$button<span style="color: #808030;">-&gt;</span>signal_connect<span style="color: #808030;">(</span> clicked <span style="color: #808030;">=</span><span style="color: #808030;">&gt;</span> <span style="color: #800000; font-weight: bold;">sub</span> <span style="color: #800080;">{</span>
<span style="color: #800000; font-weight: bold;">    </span><span><span style="color: #696969;">    </span></span><span style="color: #800000; font-weight: bold;">print</span><span style="color: #808030;">(</span><span style="color: #0000e6;">"Тест Gtk2-Perl</span><span style="color: #0f69ff;">\n</span><span style="color: #0000e6;">"</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>
<span><span style="color: #696969;">    </span></span><span style="color: #800080;">}</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>

<span><span style="color: #696969;">    </span></span><span style="color: #696969;"># Помещаем кнопку на окно</span>
<span><span style="color: #696969;">    </span></span>$window<span style="color: #808030;">-&gt;</span>add<span style="color: #808030;">(</span>$button<span style="color: #808030;">)</span><span style="color: #800080;">;</span>

<span><span style="color: #696969;">    </span></span><span style="color: #696969;"># Делаем окно, а также все дочерние виджеты видимыми</span>
<span><span style="color: #696969;">    </span></span>$window<span style="color: #808030;">-&gt;</span>show_all<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>

<span><span style="color: #696969;">    </span></span><span style="color: #696969;"># Запускаем цикл обработки событий</span>
<span><span style="color: #696969;">    </span></span>Gtk2<span style="color: #808030;">-&gt;</span>main<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span>
<span style="color: #800080;">}</span>

main<span style="color: #808030;">(</span><span style="color: #808030;">)</span><span style="color: #800080;">;</span></pre>
</div>
<div style="text-align: justify;">Вид приложения в Linux:</div>
<p><a href="http://3.bp.blogspot.com/_lc_7UApfk3o/SkkM00CMvmI/AAAAAAAAAFs/psrHiZNWXhc/s1600-h/hello-gtk-linux.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5352823733567143522" style="margin: 0px auto 10px; text-align: center; width: 151px; display: block; height: 66px; cursor: pointer;" src="http://3.bp.blogspot.com/_lc_7UApfk3o/SkkM00CMvmI/AAAAAAAAAFs/psrHiZNWXhc/s400/hello-gtk-linux.png" border="0" alt="" /></a>Вид приложения в OpenBSD:</p>
<p><a href="http://4.bp.blogspot.com/_lc_7UApfk3o/SoMg0o9wjUI/AAAAAAAAAF8/pwOwo1Eds5c/s1600-h/hello-gtk-obsd.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5369171269477502274" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 165px; height: 53px;" src="http://4.bp.blogspot.com/_lc_7UApfk3o/SoMg0o9wjUI/AAAAAAAAAF8/pwOwo1Eds5c/s400/hello-gtk-obsd.png" border="0" alt="" /></a><br />
Вид приложения в Windows:</p>
<p><a href="http://1.bp.blogspot.com/_lc_7UApfk3o/SkkNF93-OeI/AAAAAAAAAF0/nTyhzr14jjA/s1600-h/hello-gtk-windows.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img id="BLOGGER_PHOTO_ID_5352824028266379746" style="margin: 0px auto 10px; text-align: center; width: 123px; display: block; height: 60px; cursor: pointer;" src="http://1.bp.blogspot.com/_lc_7UApfk3o/SkkNF93-OeI/AAAAAAAAAF0/nTyhzr14jjA/s400/hello-gtk-windows.png" border="0" alt="" /></a><span style="font-weight: bold; font-size: 130%;">Выводы</span></p>
<div style="text-align: justify;">В целом, приложения, написанные с использованием GTK+, выглядят довольно современно и красиво. Проект GTK+ имеет давнюю историю и продолжает развиваться. Также стоит отметить хорошую поддержку интернационализации и локализации.</div>
<div style="text-align: justify;">Несколько расстраивают сложности с установкой библиотек и языковых привязок Gtk2-Perl под Windows. Также нужно учитывать, что в отличии от оригинальной документации по GTK+, документация по Gtk2-perl не всегда актуальна и точна.</p>
<p>Еще один пробел &#8211; это отсутствие добротной книги по Gtk2-Perl. Из за отсутствия книги, информацию приходится собирать по крупицам из самых разных источников: оригинальная документация по GTK+, различные tutorial-ы и HOW-TO, сообщения в форумах и т.д.</p></div>
<p><span style="font-weight: bold; font-size: 130%;">Ссылки</span></p>
<ul>
<li><a href="http://www.gtk.org/">Домашняя страница проекта GTK+</a></li>
<li><a href="http://gtk2-perl.sourceforge.net/">Домашняя страница проекта Gtk2-perl</a></li>
<li><a href="http://www.activestate.com/activeperl/">ActivePerl от ActiveState</a></li>
<li><a href="http://code.google.com/p/camelbox/">Домашняя страница Camelbox</a></li>
<li><a href="http://live.gnome.org/GTK2-Perl/FrequentlyAskedQuestions">Gtk2-perl FAQ</a></li>
<li><a href="http://forgeftp.novell.com//gtk2-perl-study/documentation/html/index.html">Gtk2-perl tutorial by Dirk van der Walt</a></li>
<li><a href="http://gtk2-perl.sourceforge.net/doc/yapc-2004-perl-gtk2/slides.html">Gtk2-perl tutorial by Dov Grobgeld</a></li>
<li><a href="http://gtk2-perl.sourceforge.net/doc/gtk2-perl-tut/">Gtk2-perl tutorial by Emmanuele Bassi</a></li>
<li><a href="http://gtk2-perl.sourceforge.net/doc/subclassing_widgets_in_perl.html">Статья: Subclassing Widgets In Perl</a></li>
</ul>
<p><em>Статья опубликована на портале <a href="http://citforum.ru/internet/perl/gtk/">CITForum</a></em></p>
<img src="http://losttower.ru/?ak_action=api_record_view&id=28&type=feed" alt="" />

<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr valign=top><td style="width:110px;padding-top:13px"> Похожие записи:</td><td><ol><li><a href='http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-wxperl/' rel='bookmark' title='Permanent Link: Создание кросс-платформенных графических интерфейсов на wxPerl'>Создание кросс-платформенных графических интерфейсов на wxPerl</a></li><li><a href='http://losttower.ru/ruby/gui-ruby/sozdanie-graficheskix-interfejsov-na-ruby-gtk2/' rel='bookmark' title='Permanent Link: Создание графических интерфейсов на Ruby/GTK2'>Создание графических интерфейсов на Ruby/GTK2</a></li><li><a href='http://losttower.ru/perl/gui/ustanovka-perl-gtk2-na-windows-s-pomoshhyu-camelboxa/' rel='bookmark' title='Permanent Link: Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а'>Установка Perl-Gtk2 на Windows с помощью CamelBox&#8217;а</a></li></ol></td></tr></table>]]></content:encoded>
			<wfw:commentRss>http://losttower.ru/perl/gui/sozdanie-kross-platformennyx-graficheskix-interfejsov-na-perl-gtk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
