<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Research Perl, Business and Career</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/" />
    <link rel="self" type="application/atom+xml" href="http://aninatalie.ru/research/atom.xml" />
    <id>tag:aninatalie.ru,2009-06-15:/research//1</id>
    <updated>2010-08-30T12:22:21Z</updated>
    <subtitle>Портал perl-программиста для perl-программистов: документация, исследования, разработки</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.26-ru</generator>

<entry>
    <title>Что такое map в perl и как с ним работать</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/08/chto-takoe-map-v-perl-i-kak-s-nim-rabotat.html" />
    <id>tag:aninatalie.ru,2010:/research//1.65</id>

    <published>2010-08-30T12:19:22Z</published>
    <updated>2010-08-30T12:22:21Z</updated>

    <summary> Заметки для начинающих...</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[ <p><i>Заметки для начинающих</i></p>]]>
        <![CDATA[<h2>Синтаксис</h2>
<pre>
map BLOCK LIST
map EXPR, LIST
</pre>

<h2>Описание</h2>

<p>Функция <font color="#00aa00">map</font> вычисляет BLOCK или EXPR для каждого элемента списка LIST, и возвращает
список, который содержит преобразованные элементы LIST. </p>

<pre>
#!/usr/bin/perl -w

use strict;

my @list = qw(нет ни лета ни зимы ни весны);

my @names = map {split ''} @list;

foreach (@list) {print $_." "}; print "\n";

foreach (@names) {print $_." "}; print "\n";
</pre>
<p>Вывод:</p>
<pre>
%perl map.pl
нет ни лета ни зимы ни весны
н е т н и л е т а н и з и м ы н и в е с н ы
</pre>

<p>По приниципу работы <font color="#00aa00">map</font> напоминает <font color="#00aa00">foreach</font>. 
В случае сложных вычислений, использование
<font color="#00aa00">foreach</font> может оказаться более предпочтительным, т.к. оно более наглядно 
и доступно для понимания.</p>

<p>От <font color="#00aa00">grep</font> функция <font color="#00aa00">map</font> 
отличается тем, что <font color="#00aa00">map</font> возвращает список, который является 
результатом вычислений в рамках EXPR
или  BLOCK. А <font color="#00aa00">grep</font> возвращает список элементов LIST, которые соответствуют заданному условию поиска
в EXPR или BLOCK.</p>

<p>Т.е. по сути, <font color="#00aa00">grep</font> используется в основном для поиска в заданном списке, 
а <font color="#00aa00">map</font> - для преобразований.</p>

<h2>Примеры использования map</h2>
<h3>Хэш на выходе</h3>
<pre>
my @list = qw(нет ни лета ни зимы ни весны);

my %names = map {$_ => 1} @list;

foreach (keys %names) {print $_." = ". $names{$_}."\n"};
</pre>
<p>Вывод:</p>
<pre>
%perl map.pl
весны = 1
лета = 1
зимы = 1
ни = 1
нет = 1
</pre>

<h3>Преобразование ссылок</h3>

<pre>
#!/usr/bin/perl -w

use strict;

my @list = qw(&lt;href=&quot;http://aninatalie.ru&quot;&gt;MainPage&lt;/a&gt;);

map { s/\&/&amp;/g;
          s/</&lt;/g;
          s/>/&gt;/g;
          s/\"/&quot;/g;
          s/\015//g;} @list;


foreach (@list) {print $_.""};
</pre>
<p>Вывод:</p>
<pre>
%perl map.pl
&amp;lt;href=&amp;quot;http://aninatalie.ru&amp;quot;&amp;gt;MainPage&amp;lt;/a&amp;gt;
</pre>
]]>
    </content>
</entry>

<entry>
    <title>Что такое grep в perl и как его использовать</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/08/chto-takoe-grep-v-perl-i-kak-ego-ispol-zovat.html" />
    <id>tag:aninatalie.ru,2010:/research//1.64</id>

    <published>2010-08-26T07:52:27Z</published>
    <updated>2010-08-26T07:56:17Z</updated>

    <summary> Заметки для начинающих...</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[ <p><i>Заметки для начинающих</i></p>]]>
        <![CDATA[<h2>Название</h2>

<p><font color="#00aa00">grep</font> - это встроенная в Perl функция, которая ищет в списке элементы, удовлетворяющие
заданному условию. Используется для извлечения и преобразования данных.
</p><p>
Отличается от стандартной unix-программы <font color="#00aa00">grep</font> тем, что 
стандартный <font color="#00aa00">grep</font> выполняет поиск строк в одном или нескольких файлах, соответствующие заданному
регулярному выражению.</p>

<h2>Синтаксис</h2>

<pre>
grep EXPR, LIST
grep BLOCK LIST
</pre>

<h2>Описание</h2>

<p>Функция вычисляет EXPR или BLOCK для каждого элемента LIST.</p><p>В списковом контексте
возвращает элементы, для которых выражение EXPR или BLOCK является истинным.
В скалярном контексте возвращает число - сколько элементов LIST соответствует заданному условию.
</p>

<pre>
#!/usr/bin/perl -w

use strict;

my @list = qw(письма и телеграммы сгорели очень быстро и дотла
                были их килограммы теперь осталась только лишь зола);

my @result = grep /и/i, @list;
my $result_num = grep /и/i, @list;

foreach (@result) {print $_." "};

print "\n".$result_num."\n";
</pre>
<p>Вывод:</p>
<pre>
%perl grep.pl
письма и сгорели и были их килограммы лишь
8
%
</pre>

<p>Во время работы функция <font color="#00aa00">grep</font> поочередно присваивает переменной $_ значения элементов из списка,
и проверяет это значение на соответствие заданному условию. Одновременно с отбором элементов, можно
вносить в них изменения.</p>

<p>Главное при этом помнить, что EXPR или BLOCK могут 
выполнять модификацию исходного списка. </p>

<pre>
my @list = qw(письма и телеграммы сгорели очень быстро и дотла
                были их килограммы теперь осталась только лишь зола);


my @result = grep s/и/i/, @list;

foreach (@list) {print $_." "};
</pre>
<p>Вывод:</p>
<pre>
%perl grep.pl
пiсьма i телеграммы сгорелi очень быстро i дотла былi iх кiлограммы теперь осталась только лiшь зола
</pre>


<h2>Примеры</h2>
<h3>Поиск в сложной структуре данных</h3>
<p>Есть список кандидатов на вакансию. Каждый кандидат обладает определенными навыками.
Надо найти имена тех кандидатов, которые обладают списком заданных навыков
(например: perl и mysql).</p>

<pre>
#!/usr/bin/perl -w

use strict;

my %persons = (
        'Мария' => [qw(html css mysql php perl xml apache)],
        'Сергей' => [qw(perl ruby apache nginx xml)],
        'Василий' => [qw(php html mysql)],
        'Захарий' => [qw(mysql oracle perl)],
);

my @names = grep {
                grep /mysql/, @{$persons{$_}} if grep /perl/, @{$persons{$_}};
        } keys %persons;


foreach (@names) {print $_." "};
</pre>
<p>Вывод:</p>
<pre>
Захарий Мария
</pre>

<h3>Поиск в сложной структуре данных - 2</h3>

<p>Требуется вывести имена сотрудников, специализирующихся на работе с oracle.</p>
<pre>
my @dbs = (
        {
                'name' => 'Natalie Ani',
                'specialization' => 'perl',
                'phone' => '4633',
        },
        {
                'name' => 'Mary Smirnova',
                'specialization' => 'ruby',
                'phone' => '4323',
        },
        {
                'name' => 'Alex Kravchik',
                'specialization' => 'oracle',
                'phone' => '4566',
        },
        {
                'name' => 'Alex Orlikov',
                'specialization' => 'oracle',
                'phone' => '4567',
        },
);

my @res = grep {
        $dbs[$_]->{'specialization'} eq 'oracle'
} 0..$#dbs;

foreach (@res) {print $dbs[$_]->{'name'}." "};
</pre>

<p>Вывод:</p>
<pre>
%perl grep.pl
Alex Kravchik Alex Orlikov
</pre>

<h3>Поиск одновременно в нескольких массивах</h3>
<pre>
my @names = grep /^А/, (@women_names, @men_names);
</pre>


<h3>Поиск элементов по численному значению</h3>
<pre>
my @num = qw(12 13 500 76 27 262 1 5 150 89 8);

my @res = grep {$_ < 100} @num;
</pre>


<h2>Полезные ссылки</h2>
<noindex>
<p><a href="http://perl.find-info.ru/perl/014/grep.htm">perl.find-info.ru: Функция grep</a><br>

<a href="http://www.opennet.ru/man.shtml?topic=grep&category=1">opennet.ru: grep (freebsd)</a></p>
</noindex>
]]>
    </content>
</entry>

<entry>
    <title>Отличный пляж для perl-программиста</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/08/otlichnij-pljazh-dlja-perl-programmista.html" />
    <id>tag:aninatalie.ru,2010:/research//1.63</id>

    <published>2010-08-23T04:59:17Z</published>
    <updated>2010-08-26T07:57:56Z</updated>

    <summary>Впрочем, пляж просто отличный для любого желающего. Одно из лучших моих воспоминаний прошедшего лета. Рекомендую. Располагается на Пироговском водохранилище.Тут и далее - несколько фото....</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Прочее" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[Впрочем, пляж просто отличный для любого желающего. Одно из лучших моих воспоминаний прошедшего лета. Рекомендую. Располагается на Пироговском водохранилище.<br /><br />Тут и далее - несколько фото.<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="maliby_logo.jpg" src="http://aninatalie.ru/research/maliby_logo.jpg" class="mt-image-none" style="" width="500" height="375" /></span><br /><div><br /></div>]]>
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="maliby_fregat.jpg" src="http://aninatalie.ru/research/maliby_fregat.jpg" class="mt-image-none" style="" width="500" height="375" /></span><div><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="maliby_tea_house.jpg" src="http://aninatalie.ru/research/maliby_tea_house.jpg" class="mt-image-none" style="" width="500" height="335" /></span><br /></div><div><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="maliby_for_child.jpg" src="http://aninatalie.ru/research/maliby_for_child.jpg" class="mt-image-none" style="" width="500" height="375" /></span><br /></div><div><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="maliby_water.jpg" src="http://aninatalie.ru/research/maliby_water.jpg" class="mt-image-none" style="" width="500" height="375" /></span><br /></div><div><br /><br /></div>
<p><noindex><a href="http://octopusreefs.ru/">"Малибу". Официальный сайт</a></noindex></p>]]>
    </content>
</entry>

<entry>
    <title>CGI::Application и Template Toolkit. Использование плагина CGI::Application::Plugin::TT</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/08/cgiapplication-i-template-toolkit-ispol-zovanie-plagina-cgiapplicationplugintt.html" />
    <id>tag:aninatalie.ru,2010:/research//1.60</id>

    <published>2010-08-04T11:51:33Z</published>
    <updated>2010-08-04T12:04:53Z</updated>

    <summary> Публикация - в значительной мере - перевод официальной документации CGI::Application::Plugin::TT. Все примеры - оригинальные, разработанные специально для данного документа и проверенные на работоспособность....</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[ <p><i>Публикация - в значительной мере - перевод официальной документации CGI::Application::Plugin::TT.
Все примеры - оригинальные, разработанные специально для данного документа и 
проверенные на работоспособность.</i></p>
]]>
        <![CDATA[<p>Оглавление</p>
<ul>
<li><a href="#methods">Методы</a>
	<ul>
	<li><a href="#tt_process">tt_process</a></li>
	<li><a href="#tt_config">tt_config</a>
		<ul>
		<li><a href="#TEMPLATE_OPTIONS">TEMPLATE_OPTIONS</a></li>
		<li><a href="#TEMPLATE_NAME_GENERATOR">TEMPLATE_NAME_GENERATOR</a></li>
		</ul>
	</li>
	<li><a href="#tt_obj">tt_obj</a></li>
	<li><a href="#tt_params">tt_params</a></li>
	<li><a href="#tt_clear_params">tt_clear_params</a></li>
	<li><a href="#tt_pre_process">tt_pre_process</a></li>
	<li><a href="#tt_post_process">tt_post_process</a></li>
	<li><a href="#tt_template_name">tt_template_name</a></li>
	<li><a href="#tt_include_path">tt_include_path</a></li>
	</ul>
</li>
<li><a href="#links">Полезные ссылки</a></li>
</ul>

<p>CGI::Application поддерживает работу с шаблонами Template Toolkit 
с помощью CGI::Application::Plugin::TT .</p>

<a name="methods"></a><h2>Методы</h2>

<a name="tt_process"></a><h3>tt_process</h3>

<p><font color="#00aa00">tt_process()</font> - это "обертка" вокруг стандартного метода <font color="#00aa00">process()</font> от Template Toolkit. 
Использование <font color="#00aa00">tt_process()</font> похоже на использование <font color="#00aa00">process()</font>. 
Методу <font color="#00aa00">tt_process</font> можно передать 
до двух параметров. Первый - это имя вызываемого шаблона, второй
- ссылка на хэш с передаваемыми в шаблон данными. Оба параметра являются не обязательными.</p>

<p>Если не указано имя шаблона, имя будет сгенерировано автоматически, с помощью функции 
<font color="#00aa00">$self->tt_template_name</font> .</p>
<pre>
...
my $tt_params = {};
$tt_params->{'block'} = 'show_result';

return $self->tt_process('template.tt', $tt_params);
...
</pre>
<p><font color="#00aa00">tt_process()</font> возвращает скалярную ссылку на готовый к выводу пользователю код шаблона.</p>
<p>Пример:</p>
<pre>
...
my $scalar_link = $self->tt_process('template.tt', $tt_params);
print ${$scalar_link};
...
</pre>
<p>Вывод:</p>
<pre>
< html >

< head >
< meta http-equiv="Content-Type" content=" text/html; charset=windows-1251" / >

< title>Нумерология...< /title >

< style type="text/css" >
body {font-family: Verdana, Arial Cyr, Arial, Helvetica; font-weight: normal; font-size: 9pt;}

</ style >
</ head >

< body bgcolor="#ffffff" >
< center >
...
</pre>
<p>Фактически, полученный код не обязательно отправлять на вывод пользователю. 
Можно сохранить данные в файл, или разместить и отправить в электронном письме.</p>

<a name="tt_config"></a><h3>tt_config</h3>

<p>Метод <font color="#00aa00">tt_config()</font> позволяет задать некоторые параметры работы плагина CGI::Application::Plugin::TT и
Template Toolkit. Рекомендуется вызывать метод <font color="#00aa00">tt_config()</font> до того, как будут
выполнены первые обращения к методам <font color="#00aa00">tt_process()</font> и <font color="#00aa00">tt_obj()</font>. 
Если хотите получить ошибку - сделайте наоборот.</p>

<a name="TEMPLATE_OPTIONS"></a><h4>TEMPLATE_OPTIONS</h4>

<p><font color="#00aa00">TEMPLATE_OPTIONS</font> позволяет определить параметры для объекта Template. В списке
можно указывать все классические конфигурационные опции Template Toolkit. </p>

<pre>
package App2;
...
sub setup {
	my $self = shift;
	$self->start_mode('on_start');	

	$self->tt_config(
		TEMPLATE_OPTIONS => {
			INCLUDE_PATH 	=> '/home/aninatalie.ru/templates',
		},
	);

	$self->run_modes(
		on_start	=> \&on_start,
		AUTOLOAD	=> sub { return 'Запрошенной страницы не существует' }
	);

}
...
</pre>


<a name="TEMPLATE_NAME_GENERATOR"></a><h4>TEMPLATE_NAME_GENERATOR</h4>

<p><font color="#00aa00">TEMPLATE_NAME_GENERATOR</font> позволяет указать ссылку на функцию, которая будет генерировать имя
файла шаблона. Данная функция будет выполняться, если метод <font color="#00aa00">tt_process()</font>
будет вызван без указания имени шаблона.</p>

<p>Если специальная функция не назначена, а <font color="#00aa00">tt_process()</font> все-таки вызван без параметров - по-умолчанию
будет сгенерировано имя шаблона на основе имен текущего модуля и метода.</p>

<pre>
package App2;
...
sub setup {
	my $self = shift;

	$self->mode_param('step');
	$self->start_mode('on_start');	

	$self->tt_config(
		TEMPLATE_NAME_GENERATOR => \&my_own_generator,
	);

	$self->run_modes(
		on_start	=> \&on_start,
		AUTOLOAD	=> sub { return 'Запрошенной страницы не существует' }
	);
}

sub my_own_generator {
	my $self = shift;	
	return 'error.tt',
}

sub on_start {
	my $self = shift;

	return $self->tt_process();
}

</pre>

<a name="tt_obj"></a><h3>tt_obj</h3>

<p>Метод <font color="#00aa00">tt_obj()</font> возвращает ссылку на основной объект Template Toolkit. Используется, 
в основном, в процессе отладки приложения.</p>

<a name="tt_params"></a><h3>tt_params</h3>

<p>Метод <font color="#00aa00">tt_params()</font> определяет список параметров, которые будут 
передаваться в каждый вызываемый шаблон.</p>

<p>Как правило, при вызове метода <font color="#00aa00">tt_process()</font>, ему передается ссылка 
на хэш с параметрами. 
Параметры, определенные с помощью <font color="#00aa00">tt_params()</font> будут добавляться в этот хэш.</p>
<pre>
sub setup {
	my $self = shift;

	$self->mode_param('step');
	$self->start_mode('on_start');

	$self->tt_params(block => 'secret_page');

	$self->run_modes(
		on_start	=> \&on_start,
		AUTOLOAD	=> sub { return 'Запрошенной страницы не существует' }
	);
}
sub on_start {
	my $self = shift;
	my $q = $self->query();
	my $tt_params = {}; # к значениям данного хэша будут добавлены значения, заданные в tt_params()
	...
	return $self->tt_process('template2.tt', $tt_params);
}
</pre>
<p>Если один и тот же параметр определен дважды - преимуществом будет пользоваться 
параметр, который входит в хэш, передаваемый непосредственно <font color="#00aa00">tt_process()</font>.</p>

<p>Пример:</p>
<pre>
sub setup {
	my $self = shift;
	...
	$self->tt_params(block => 'show_result');
}

sub start {
	my $self = shift;
	my $tt_params = {
		block => 'show_form',
	};

	return $self->tt_process('template.tt', $tt_params);
}

</pre>
<p>В результате выполнения данного блока кода, в шаблоне будет использоваться 
параметр block со значением: "show_form".</p>

<a name="tt_clear_params"></a><h3>tt_clear_params</h3>
<p>Метод <font color="#00aa00">tt_clear_params()</font> удалит все сохранившиеся до текущего 
времени параметры, установленные методом <font color="#00aa00">tt_params()</font>.</p>

<pre>
$self->tt_clear_params;
</pre>

<a name="tt_pre_process"></a><h3>tt_pre_process</h3>

<p>Метод <font color="#00aa00">tt_pre_process()</font> действует аналогично методу <font color="#00aa00">cgiapp_prerun()</font>. 
<font color="#00aa00">tt_pre_process()</font> 
вызывается и отрабатывается непосредственно перед началом обработки шаблона. </p>
<p>Выполнение <font color="#00aa00">tt_pre_process()</font> будет запущено автоматически, а на вход будут переданы те же 
параметры, которые передаются методу <font color="#00aa00">tt_process()</font>. При желании, можно внести последние 
изменения в список передаваемых шаблону параметров.</p>

<pre>
sub tt_pre_process {
	my ($self, $file, $vars) = @_;
	$vars->{block}='show_result';
	print STDERR "start template process: $file \n";
	return;
}

</pre>

<a name="tt_post_process"></a><h3>tt_post_process</h3>
<p>Метод <font color="#00aa00">tt_post_process()</font> аналогичен методу 
<font color="#00aa00">cgiapp_postrun()</font>. Вызывается автоматически после 
завершения обработки шаблона, но до отправления результата клиенту. На вход принимает скалярную 
ссылку на обработанный шаблон - готовый к выводу html-код.</p>
<pre>
sub tt_post_process {
	my ($self, $htmlref) = @_;

	print $htmlref;

	return;
}
</pre>


<a name="tt_template_name"></a><h3>tt_template_name</h3>
<p>Метод генерирует название шаблона на основе имени вызывающих его класса и метода.</p>

<p>Например:</p>
<pre>
package App;

use base 'CGI::Application';
use CGI::Application::Plugin::TT;
 
sub setup {
	my $self = shift;

	$self->run_modes(
		on_start => 'start',
		...
	);
 
}

...
sub start {
	my $self = shift;

	my $template_name = $self->tt_template_name();
	return $self->tt_process($template_name);

}
</pre>
<p>Результат: Для вывода будет запрошен шаблон App/start.tmpl .</p>

<p><font color="#00aa00">tt_template_name()</font> позволяет формировать и использовать определенную иерархию шаблонов, 
зависимую от структуры самого приложения.</p>

<p>Можно заставить <font color="#00aa00">tt_template_name()</font> сгенерировать название шаблона на основе не 
вызывающего метода, а вышестоящего по уровню. На сколько уровней выше - задается с помощью 
числа в качестве параметра. </p>

<p>Пример:</p>
<pre>
my $template_name = $self->tt_template_name(1);
</pre>
<p>Результат в файле error.log:</p>
<pre>
[Wed Jun  9 15:56:55 2010] [error] Error executing run mode 'on_start': file error - App/(eval)
.tmpl: not found at /home/aninatalie/aninatalie.ru/cgi-bin/app.cgi line 8\n
</pre>

<p><font color="#00aa00">tt_template_name()</font> вызывается автоматически, если при вызове 
метода <font color="#00aa00">tt_process()</font> не было указано имя шаблона.</p>

<a name="tt_include_path"></a><h3>tt_include_path</h3>
<p>Метод <font color="#00aa00">tt_include_path()</font> позволяет указать путь к месторасположению шаблонов. Причем, 
на этапе, когда объект TT уже существует. Обычно для указания пути используют INCLUDE_PATH.</p>

<p>Вызов <font color="#00aa00">tt_include_path()</font> внесет изменения в INCLUDE_PATH, что можно использовать во всех 
последующих вызовах объекта TT.</p>
<pre>
my $dir = '/home/aninatalie/aninatalie.ru/templates';
$self->tt_include_path( [$dir] );
</pre>

<a name="links"></a><h2>Полезные ссылки</h2>
<noindex>
<p>
<a href="http://search.cpan.org/~ceeshek/CGI-Application-Plugin-TT-1.04/lib/CGI/Application/Plugin/TT.pm">http://search.cpan.org/~ceeshek/CGI-Application-Plugin-TT-1.04/lib/CGI/Application/Plugin/TT.pm</a><br>
<a href="http://www.redantigua.com/cookies.html">Примеры работ на CGI::Application</a><br>
<a href="http://search.cpan.org/~abw/Template-Toolkit-2.22/lib/Template.pm">http://search.cpan.org/~abw/Template-Toolkit-2.22/lib/Template.pm</a>
</p>
</noindex>]]>
    </content>
</entry>

<entry>
    <title>Использование CGI::Application::Plugin::DBH. Краткий обзор, примеры кода</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/07/ispol-zovanie-cgiapplicationplugindbh-kratkij-obzor-primeri-koda.html" />
    <id>tag:aninatalie.ru,2010:/research//1.59</id>

    <published>2010-07-22T12:49:23Z</published>
    <updated>2010-07-22T12:51:04Z</updated>

    <summary></summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
         
        <![CDATA[<p>Терминология</p>

<p><font color="#00aa00">Дескриптор - handle</font> - это уникальный номер, который используется для идентификации объектов.
Обычно дескриптор используется при работе с API, при этом смысл значения дескриптора скрыт 
за этим API.</p>
<p>Смысл существования дескрипторов в том, чтобы как-то различать единообразные объекты
между собой. Например, при открытии нескольких файлов для чтения, или при установлении 
нескольких соединений с базами данных.</p>


<p><font color="#00aa00">CGI::Application::Plugin::DBH</font> - используется для простого доступа 
к дескриптору <font color="#00aa00">DBI - dbh</font>. Особенность работы с 
<font color="#00aa00">CGI::Application::Plugin::DBH</font> состоит в том,
что соединение с заранее определенной БД не устанавливается до тех пор, пока к этой БД
не будет сделан хотя бы один запрос. Если приложение отработает без обращений к БД с запросами 
(например, на ранней стадии будет обнаружена ошибка и выполнение приложения будет прервано) - 
соединение не будет установлено. Экономия времени выполнения и ресурсов сервера очевидна.
</p>

<h2>Методы</h2>
<h3>dbh</h3>
<pre>
	my @row_ary = $self->dbh->selectrow_array("SELECT * FROM table_name LIMIT 1");
</pre>

<p>Метод возвращает дескриптор базы данных DBI. Дескриптор создается при первом вызове данного метода,
и просто возвращается при последующих обращениях к методу.</p>

<p>Если требуется использовать сразу несколько разных баз данных и, соответственно, дескрипторов,
можно назначать для дескрипторов разные имена, и в дальнейшем обращаться к дескриптору по имени.</p>

<pre>
use CGI::Application::Plugin::DBH (qw/dbh_config dbh/);
...

sub cgiapp_init  {
	my $self = shift;

	$self->dbh_config('first_db_handle', 
		['DBI:mysql:database=bd1;host=localhost', 'user1', 'super_parol']);
	$self->dbh_config('second_db_handle',
		["DBI:mysql:database=bd2;host=localhost", 'user2', 'prosto_parol']);
}
...

sub on_start {
	my $self = shift;

	my $tt_params = {
		block => 'show_form',
	};

	my @row_ary = $self->dbh('first_db_handle')->selectrow_array("SELECT * FROM any_table LIMIT 1");
	$tt_params->{'info'} = \@row_ary;


	my $dbh2 = $self->dbh('second_db_handle');
	my @row_ary2 = $dbh2->selectrow_array("SELECT * FROM some_table LIMIT 1");
	$tt_params->{'info2'} = \@row_ary2;

	return $self->tt_process('template2.tt', $tt_params);
}

</pre>
<pre>
	my ($login) = $self->dbh->selectrow_array(
		"SELECT login FROM auth WHERE contract_id=$contract_id LIMIT 1");
</pre>
<pre>
	my $rows = $self->dbh->do("INSERT INTO auth (login, pass) VALUES (?, ?)", 
		undef, ($login, $pass));
</pre>
<pre>
	my $sql = "UPDATE auth SET contract_id=$contract_id WHERE login=$login";
	my $sth = $self->dbh->prepare($sql);
	$sth->execute;
</pre>

<h3>dbh_config</h3>

<pre>
sub cgiapp_init  {
	my $self = shift;

	$self->dbh_config("DBI:mysql:database=main_bd;host=localhost", 
		'main_user', 'main_user_password');
}
</pre>

<p>Метод dbh_config используется для установки параметров подключения к БД. Рекомендуется 
использовать метод внутри cgiapp_init. Главное, чтобы этот метод был выполнен задолго до того, как
произойдет первый вызов dbh() , иначе все закончится очень печально - "500. Ошибочка вышла".</p>


<h3>dbh_default_name</h3>

<p>Метод dbh_default_name() указывает название дескриптора, который будет возвращаться "по-умолчанию", если имя дескриптора
при вызове метода dbh() не указано. Используется при работе с двумя и более дескрипторами
в одном приложении - очень удобно.</p>

<p>Если задать метод без параметров - вернет имя дескриптора, который назначен для вызова "по-умолчанию".</p>

<pre>
use CGI::Application::Plugin::DBH (qw/dbh_config dbh dbh_default_name/);

sub setup {
	my $self = shift;

	$self->dbh_default_name('first_db_handle');
	$self->dbh_config('first_db_handle', 
		['DBI:mysql:database=bd1;host=localhost', 'user1', 'super_parol']);
	$self->dbh_config('second_db_handle',
		["DBI:mysql:database=bd2;host=localhost", 'user2', 'prosto_parol']);

	$self->mode_param('step');
...
}
...

sub on_start {
	my $self = shift;

	my @row_ary = $self->dbh->selectrow_array("SELECT * FROM any_table LIMIT 1");

	my $dbh2 = $self->dbh('second_db_handle');
	my @row_ary2 = $dbh2->selectrow_array("SELECT * FROM some_table LIMIT 1");
...
}

</pre>


<h2>Полезные ссылки</h2>
<p><noindex>
<a href="http://search.cpan.org/perldoc?DBI">http://search.cpan.org/perldoc?DBI</a><br>
<a href="http://search.cpan.org/~markstos/CGI-Application-4.31/lib/CGI/Application.pm">http://search.cpan.org/~markstos/CGI-Application-4.31/lib/CGI/Application.pm</a><br>
<a href="http://search.cpan.org/~markstos/CGI-Application-Plugin-DBH-4.00/lib/CGI/Application/Plugin/DBH.pm">http://search.cpan.org/~markstos/CGI-Application-Plugin-DBH-4.00/lib/CGI/Application/Plugin/DBH.pm</a>
</noindex>
</p>
]]>
    </content>
</entry>

<entry>
    <title>CGI::Application и cookies</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/07/cgiapplication-i-cookies.html" />
    <id>tag:aninatalie.ru,2010:/research//1.54</id>

    <published>2010-07-20T09:51:32Z</published>
    <updated>2010-07-20T09:58:58Z</updated>

    <summary></summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
         
        <![CDATA[<h2>Работа с cookies и CGI::Application</h2>
<h3>Установка cookies</h3>
<pre>
sub on_set_cookies {
	my $self = shift;
	my $query = $self->query();

	my $auth_cookie = $query->cookie( # подготавливаем cookie
			-name=>'alisa',
			-value=>'pass',
			-expires=>'+1h',
			-path=>'/cgi',
			-domain=>'.aninatalie.ru',
	);

	$self->header_props(-cookie=>[$auth_cookie]); # устанавливаем у клиента

	return $self->tt_process('template2.tt');
}

</pre>
<br><br>
<h3>Получение информации из cookies</h3>
<pre>
sub on_set_cookies {
	my $self = shift;
	my $query = $self->query();

	my $auth_cookie = $query->cookie('alisa');
		# Значение переменной $auth_cookie будет равно 'pass'. 
		# Т.е. мы получим только значение -value .

	...
	return $self->tt_process('template2.tt');
}
</pre>
<br><br>
<h3>Обновление данных cookies</h3>
Чтобы обновить значение <font color="#00aa00">cookie</font>, надо просто записать новые данные поверх 
существующих. 
Для этого указываем <font color="#00aa00">-name</font> нужной <font color="#00aa00">cookie</font>, и 
задаем новые параметры для нее.
<br><br>
<h3>Удаление cookies</h3>
Удалить <font color="#00aa00">cookie</font> тоже просто - обновляем значение нужной 
<font color="#00aa00">сookie</font> и <font color="#00aa00">-expires</font> присваиваем 
отрицательное значение, например, <font color="#00aa00">-1d</font>. Браузер примет обновление 
<font color="#00aa00">сookie</font> и, увидев отрицательное время,
посчитает, что он давным давно уже должен был удалить <font color="#00aa00">сookie</font> 
(в данном случае, еще вчера). И удалит.

<pre>
sub on_set_cookies {
	my $self = shift;
	my $query = $self->query();

	my $auth_cookie = $query->cookie(
			-name=>'alisa',
			-value=>'pass',
			-expires=>'-1h',
			-path=>'/cgi',
			-domain=>'.aninatalie.ru',
	);

	$self->header_props(-cookie=>[$auth_cookie]);

	return $self->tt_process('template2.tt');
}
</pre>
<br><br>
<h2>Памятка</h2>

<h3>Что такое cookies</h3>

<p><font color="#00aa00">Cookie</font> является решением одной из наследственных проблем HTTP протокола (HyperText Transfer Protocol). 
Проблема заключается в непостоянстве соединения между клиентом и сервером.</p>

<p>Используя <font color="#00aa00">cookie</font>, можно эмулировать сессию по HTTP протоколу. Коротко принцип эмуляции сессии 
таков: на первом запросе выдается соотвествующее значение <font color="#00aa00">cookie</font>, а при каждом 
последующем запросе 
это значение читается из переменной окружения HTTP_COOKIE и соответствующим образом обрабатывается.</p>

<p><font color="#00aa00">Cookie</font> - это небольшая порция текстовой информации, которую сервер передает браузеру. Браузер будет 
хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка.</p>

<p>Некоторые <font color="#00aa00">cookie</font> могут храниться только в течение одной сессии, они удаляются после закрытия 
браузера. Другие, установленные на определенный период времени, записываются в файл(ы).</p>
<br>
<h3>Формат и синтаксис cookie</h3>


<font color="#00aa00">Сookie является частью HTTP заголовка</font>. Полное описание поля Set-Cookie HTTP заголовка:
<pre>
Set-Cookie: name=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
</pre>

Минимальное описание поля Set-Cookie HTTP заголовка:
<pre>
Set-Cookie: name=VALUE;
</pre>

<ul>
<li><b>name=VALUE</b> - строка символов, исключая перевод строки, запятые и пробелы. NAME-имя 
cookie, VALUE - значение. Не допускается использование двоеточия, запятой и пробела.</li>

<li><b>expires=DATE</b> - время хранения cookie, т.е. вместо DATE должна стоять дата в формате 
"expires=Monday, DD-Mon-YYYY HH:MM:SS GMT", после которой истекает время хранения cookie. Если 
этот атрибут не указан, то cookie хранится в течение одного сеанса, до закрытия броузера. </li>

<li><b>domain=DOMAIN_NAME</b> - домен, для которого значение cookie действительно. Например, 
"domain=cit-forum.com".
Если этот атрибут опущен, то по умолчанию используется доменное имя сервера, на котором было 
задано значение cookie.</li>

<li><b>path=PATH</b> - атрибут устанавливает подмножество документов, для которых действительно 
значение cookie. Для того, чтобы cookie отсылались 
при каждом запросе к серверу, необходимо указать корневой каталог сервера, например, "path=/".
Если этот атрибут не указан, то значение cookie распространяется только на документы в той же 
директории, что и документ, в котором было установлено значение cookie. </li>

<li><b>secure</b> - если стоит этот маркер, то информация cookie пересылается только через 
HTTPS (HTTP с использованием SSL - Secure Socket Level), в защищенном режиме. Если этот 
маркер не указан, то информация пересылается обычным способом.</li>
</ul>

<noindex>
<a href="http://citforum.ru/internet/html/cookie.shtml">Что такое cookies и как с ними работать. Андрей А.Аликберов</a>
<br><br><br>
<h2>Полезные ссылки</h2>

<a href="http://www.redantigua.com/cookies.html Cookies with CGI::Application">http://www.redantigua.com/cookies.html Cookies with CGI::Application</a><br>
<a href="http://search.cpan.org/~markstos/CGI-Application-4.31/lib/CGI/Application.pm">http://search.cpan.org/~markstos/CGI-Application-4.31/lib/CGI/Application.pm</a><br>
<a href="http://search.cpan.org/~lds/CGI.pm-3.49/lib/CGI.pm#HTTP_COOKIES">http://search.cpan.org/~lds/CGI.pm-3.49/lib/CGI.pm#HTTP_COOKIES</a>
</noindex>]]>
    </content>
</entry>

<entry>
    <title>Том Демарко, Тимоти Листер. Человеческий фактор. Успешные проекты и команды. Отзыв</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/07/tom-demarko-timoti-lister-chelovecheskij-faktor-uspeshnie-proekti-i-komandi-otziv.html" />
    <id>tag:aninatalie.ru,2010:/research//1.53</id>

    <published>2010-07-20T08:30:38Z</published>
    <updated>2010-07-20T10:04:29Z</updated>

    <summary> Книга понравилась своими размышлениями на тему организации рабочего пространства для сотрудников. Более того, в ней приводятся результаты разного рода экспериментов на тему организации рабочих мест. Наконец-то я могу открыто говорить о том, что не люблю &quot;open space&quot; и аргументировать...</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Личная библиотека Perl-программиста" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[ <p>Книга понравилась своими размышлениями на тему организации рабочего пространства 
для сотрудников. Более того, в ней приводятся результаты разного рода экспериментов на тему организации 
рабочих мест.</p>
<p>Наконец-то я могу открыто говорить о том, что не люблю "open space" и аргументировать 
эти заявления не субъективными фразами: "ну не знаю... я так чувствую", а отсылать оппонента
ко вполне убедительным результатам исследований. И эти исследования говорят: <font color="#00aa00">"Open space - зло"</font>. Шутка. :)
Но то, что <font color="#00aa00">"open space" неплохо снижает общую производительность программистов - факт</font>.</p>

]]>
        <![CDATA[<p>Еще очень было забавно прочитать цитату одного программиста, опубликованную в книге: <font color="#00aa00">"Целый день с утра наш 
офис - просто зоопарк, зато к шести вечера все стихает и можно, наконец, что-то сделать."</font>
И все ничего, если бы две недели назад я не прочитала почти слово в слово такую же фразу на сообществе
менеджеров. Книга актуальна по сей день... </p>

<p>Еще одна цитата, приведенная в книге: <font color="#00aa00">"Лучше всего мне работается ранним утром - до того 
как приходят остальные."</font> Это мои собственные мысли. Почему в 9 утра я уже на работе? Потому что, так 
хорошо работать, когда в большом офисе тихо и никто не отвлекает...</p>

<p>Вторая половина книги посвящена вопросам формирования команд. Пересказывать нет смысла: это надо читать 
лично. К моменту прочтения второй части книги слов уже не остается - одни эмоции: "Как классно!" и 
"Я тоже так хочу! Хочу работать в такой команде!!!"</p>

<p>В целом, если вдуматься, эта книга необходима современным менеджерам, работающим с программистами
и прочим IT-людом. 
Обычным программистам она тоже необходима, поскольку позволяет понять, на что обратить внимание, если есть
желание повысить свою эффективность.</p>

<p>Одна из лучших книг, прочитанных мною за последние два месяца.</p>

<p><i>Человеческий фактор. Успешные проекты и команды / Том Демарко, Тимоти Листер. - Символ-Плюс, 2009 г. - 256 с.</i>
<a href="http://www.ozon.ru/context/detail/id/2338486/?partner=aninatalie">(Описание на ozon.ru)</a></p>
]]>
    </content>
</entry>

<entry>
    <title>Избранные цитаты (Аристотель Онассис)</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/07/izbrannie-citati-aristotel--onassis.html" />
    <id>tag:aninatalie.ru,2010:/research//1.45</id>

    <published>2010-07-04T14:40:59Z</published>
    <updated>2010-07-04T14:46:30Z</updated>

    <summary>Чтобы быть успешным, выглядите загорелым, живите в элегантном здании (пусть даже на чердаке), появляйтесь в хороших ресторанах (даже если пьете один напиток) и, если вы чем-то занимаетесь, - делайте это по-крупному....</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Прочее" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="Избранныецитаты" label="Избранные цитаты" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[<p>Чтобы быть успешным, выглядите загорелым, живите в элегантном здании <br>(пусть даже на чердаке), появляйтесь в хороших ресторанах (даже если пьете <br>один напиток) и, если вы чем-то занимаетесь, - делайте это по-крупному.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Стас Давыдов. Не мешайте мне работать. Отзыв</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/06/stas-davidov-ne-meshajte-mne-rabotat--otziv.html" />
    <id>tag:aninatalie.ru,2010:/research//1.40</id>

    <published>2010-06-18T08:41:13Z</published>
    <updated>2010-06-18T08:47:25Z</updated>

    <summary>Эту книгу я прочитала примерно года 2 назад. С тех пор ее регулярно перечитываю. Когда за окном дождь, середина рабочей недели, а успешно запущенный проект никто не заметил и не оценил, нет ничего лучше, чем налить чашку чая и прочитать...</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Личная библиотека Perl-программиста" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[<p>Эту книгу я прочитала примерно года 2 назад. С тех пор ее регулярно перечитываю.
Когда за окном дождь, середина рабочей недели, а успешно запущенный проект никто не заметил и не оценил, нет ничего лучше, чем налить чашку чая и прочитать пару глав из этой книги.</p>

<p><font color="#00aa00">"Не мешайте мне работать"</font> - написана не профессиональным менеджером по персоналу, а совершенно обычным менеджером проектов. IT-специалистом. И этим прекрасна. Это взгляд на проблему с тех позиций, с которых ее видят тысячи и тысячи обычных офисных служащих. <font color="#00aa00">Забавная, легкая, оптимистичная, с целой коллекцией веселых историй из жизни.</font></p>

<p>Обычно принято цитировать классиков. Но, да простят меня классики и их потомки, ни у одного из них я не позаимствовала столько интересных и красивых цитат, как из этой книги.</p>

<p>Рекомендую эту книгу всем, кто устал от офисной рутины и кого интересует тема мотивации персонала.</p>

<p>Кстати, в конце книги приводятся удобные таблицы, которые позволят Вам оценить уровень замотивированности Ваших коллег и подчиненных.</p>
]]>
        <![CDATA[<p>Официальный сайт книги: <a href="http://motivateme.ru">motivateme.ru</a></p>]]>
    </content>
</entry>

<entry>
    <title>FUN: Астрология для программистов</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/05/fun-astrologija-dlja-programmistov.html" />
    <id>tag:aninatalie.ru,2010:/research//1.37</id>

    <published>2010-05-27T05:54:44Z</published>
    <updated>2010-08-23T05:20:31Z</updated>

    <summary>Специальный гороскоп для разработчиков программного обеспечения. Просто удивительно, но описание моего знака зодиака полностью совпадает с реальностью....</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Прочее" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[<p>Специальный гороскоп для разработчиков программного обеспечения.</p>
<p>Просто удивительно, но описание моего знака зодиака полностью совпадает 
с реальностью.</p>
]]>
        <![CDATA[<p><font color="#009900"><b>Овен</b></font> - 21 марта - 19 апреля</p>
<pre>
Овны - отличные профессионалы в области разработки программного обеспечения.
Они способны выполнять сложную и ответственную работу.
Овнов отличает высокий интеллект, выраженные притязания на роль лидера,
искренняя заинтересованность в результативности проектов, инициативность.
Из недостатков можно отметить нетерпеливость.
Главными мотиваторами являются хорошая зарплата, интересная работа и
личность руководителя. Если Овен считает своего руководителя некомпетентным,
не уважает его, а в деятельности компании видит стратегические ошибки - он
увольняется при первой возможности.
</pre>

<br>
<p><font color="#009900"><b>Телец</b></font> - 20 апреля - 20 мая</p>
<pre>
Тельцы - самые сильные, надежные профессионалы в IT-индустрии. Они незаменимы,
когда требуется довести проблемный проект до благополучного завершения.
Тельцы основательны, упрямы, выносливы, легко приспосабливаются к любым
обстоятельствам.
Могут работать практически с любой платформой и любым языком программирования,
если им дать достаточно времени для их изучения.
Тельцы с глубоким уважением относятся к своему руководству, однако, ненавидят,
когда им приказывают.
Главные мотивирующие факторы: интересная работа, высокая зарплата, признание
заслуг и уважение со стороны начальства.
</pre>

<br>
<p><font color="#009900"><b>Близнецы</b></font> - 21 мая - 21 июня</p>
<pre>
Из Близнецов получаются плохие программисты. Лучше всего Близнецы реализуют себя
в качестве руководителей IT-проектов, менеджеров.
Близнецы имеют отличные способности для работы с большими объемами информации.
Интуитивность и склонность к анализу приводят к тому, что они умеют видеть
слабые места проекта и будущие затруднения раньше любых других знаков Зодиака.
Близнецы легко приспосабливаются к изменениям, могут работать над несколькими
задачами одновременно. Умеют делегировать обязанности и легко это делают.
Хорошо относятся к людям, коммуникабельны.
Как у всех воздушных знаков, у них высокое самомнение. Близнецы страдают от
ревности, когда видят, что кто-то добился значительно больших успехов, чем они.
Близнецы часто меняют работу, легко проходят собеседования.
Некомфортно чувствуют себя в одной команде с Тельцом или Овном.
</pre>


<br>
<p><font color="#009900"><b>Рак</b></font> - 22 июня - 22 июля</p>
<pre>
Раки, как правило, лучше проявляют себя в качестве организаторов, менеджеров,
руководителей проектов, чем разработчиков программного обеспечения.
У них хорошо развиты управленческие навыки.
Так же, как и Близнецы, они умеют делегировать обязанности, мотивировать своих
сотрудников, вести переговоры.
Раки разумны, практичны и очень эмоциональны. Ревнивы к чужим успехам.
Стоит отметить честность Раков. Если они не способны выполнить порученную
работу, если возникли проблемы в проекте - они немедленно скажут об этом.
Впрочем, если они считают, что Вы поступаете неверно - об этом Вам тоже
честно сообщат. Без оглядки на Ваш статус.
Раки чувствительны к признанию и проявлению уважения. Если в компании Раку
оказывается больше уважения, чем он того реально заслуживает - компания
получает очень лояльного сотрудника.
</pre>


<br>
<p><font color="#009900"><b>Лев</b></font> - 23 июля - 23 августа</p>
<pre>
Львы становятся отличными профессионалами в разработке программных продуктов.
Они знают, что нужно делать и как это делать. А также как уложиться
в минимально возможный срок.
У Львов высокие творческие, умственные и организаторские способности. Но,
несмотря на хорошие задатки в сфере непосредственно программирования, они
предпочитают самореализовываться в качестве менеджеров.
Львы - ярко выраженные лидеры. Им нравится быть в центре событий, эгоистичны,
высокомерны, любят вмешиваться в чужую работу. Иногда они преувеличивают
проблемы и слишком остро реагируют на возникающие препятствия, но в целом
сохраняют позитивное отношение к ситуации.
Кроме того, Львы упрямы и горды, не любят сдаваться, что способствует
успешному завершению проектов, в которых они участвуют.
Главные мотивирующие факторы: высокая зарплата и ... признание
заслуг, признание заслуг, признание заслуг.
</pre>

<br>
<p><font color="#009900"><b>Дева</b></font> - 24 августа - 22 сентября</p>
<pre>
Девы - хорошие профессионалы в сфере разработки программного обеспечения.
Имеют склонность к наставничеству. Легко делают карьеру в компании.
Девы трудолюбивы, эффективны, логичны, надежны, требовательны к себе и
другим. Лучше всего проявляют себя в небольших командах и проектах.
Застенчивы и скромны. Они не способны привлечь внимание к своим заслугам,
продемонстрировать свою компетентность, потребовать прибавки к
зарплате. Нервничают и перевозбуждаются, если им приходится выступать
перед аудиторией. Стремятся к совершенству. Иногда могут уделять слишком
много внимания мелким деталям, затрачивая на них огромное количество
времени.
</pre>

<br>
<p><font color="#009900"><b>Весы</b></font> - 23 сентября - 22 октября</p>
<pre>
Лучшие сотрудники для работы над крупными и серьезными проектами.
Интеллектуалы. Проявляют себя как отличные координаторы, руководители
проектов.
Дипломатичны, стремятся к гармонии, умеют находить компромиссы,
легко приспосабливаются к обстоятельствам. При возникновении конфликтов
стремятся их уладить наилучшим образом, выслушивают каждую из конфликтующих
сторон.
К сожалению, Весы не всегда способны грамотно определить свои рабочие цели
и задачи, поэтому для них является важным наличие четкого и конкретного
технического задания для каждого проекта.
Для Весов очень важна благоприятная рабочая атмосфера и достойная зарплата.
Пока это условие соблюдается, они остаются лояльными сотрудниками компании.
</pre>


<br>
<p><font color="#009900"><b>Скорпион</b></font> - 23 октября - 21 ноября</p>
<pre>
Отличные профессионалы в области разработки программного обеспечения, с
мощной интуицией.
Не любят подчиняться, стремятся занять кресло руководителя. Индивидуалисты.
Плохо работают в команде: упрямы, склонны к соревновательности и
конкурированию, скрытны и мстительны, не умеют приспосабливаться к ситуации.
В работе над проектами проявляют себя не лучшим образом: если возникают
серьезные и регулярные трудности, теряют интерес и могут покинуть команду
в самый ответственный момент.
Скорпионы с удовольствием работают только тогда, когда имеют подчиненных,
которыми можно управлять и о которых можно заботиться.
</pre>

<br>
<p><font color="#009900"><b>Стрелец</b></font> - 22 ноября - 21 декабря</p>
<pre>
Из Стрельцов получаются отличные разработчики программного
обеспечения. Стрельцы общительны, легко приспосабливаются к любым
обстоятельствам.
Главным мотивирующим фактором является возможность саморазвития. Они
постоянно изучают что-то новое, намного больше, чем им требуется для
выполнения своих обязанностей. Как только Стрелец поймет, что в текущей
организации ему учиться больше нечему, так сразу заскучает и начнет
раздумывать об увольнении.
Стрельцы плохо переносят ограничения. Чтобы Стрелец растерял остатки
лояльности к компании, необходимо жестко регламентировать его рабочий день
и обязанности, контролировать время прихода и ухода с работы, добавить
строгий дресс-код.
</pre>
<br>
<p><font color="#009900"><b>Козерог</b></font> - 22 декабря - 19 января</p>
<pre>
Козероги - отличные профессионалы, могут проявить себя и в качестве
разработчиков программного обеспечения, и на административной работе.
Козероги практичны, реалистичны, осторожны и честолюбивы. Они знают,
чего хотят, и любой проект рассматривают как очередной этап на пути к
своему жизненному успеху, самореализации.
Козероги способны к упорному труду, на них можно положиться. Имеют отличные
организационные способности, терпеливы и целеустремленны.
Иногда Козероги склонны к чрезмерной властности. Могут пренебрежительно
относиться к менее амбициозным людям, чем они сами.
</pre>

<br>
<p><font color="#009900"><b>Водолей</b></font> - 20 января - 18 февраля</p>
<pre>
Из Водолеев получаются хорошие руководители IT-проектов, координаторы.
Они способны много и упорно трудиться на благо организации.
Водолеи любят осваивать новые технологии, применять их в работе и обсуждать
с окружающими. Часто представители этого знака Зодиака бывают слишком
самоуверенны, чувствительны к критике.
Главным мотивирующим фактором для Водолеев является хороший коллектив. 
</pre>

<br>
<p><font color="#009900"><b>Рыбы</b></font> - 19 февраля - 20 марта</p>
<pre>
Рыбы - хорошие разработчики, созданы для работы в команде. 
Они исполнительны, ответственны, имеют широкий кругозор, 
склонность к аналитике.
Если поручить им работу, они выполнят ее именно так, как требуется.
Рыбам важно чувствовать себя в центре событий. Если отстранить их
от участия в рабочих совещаниях, принятия решений, они могут потерять
всякий интерес к работе.
Рыбы плохо переносят давление со стороны руководства.
</pre>
]]>
    </content>
</entry>

<entry>
    <title>Путь собственника. От предпринимателя до председателя совета директоров. Отзыв</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/05/put--sobstvennika-ot-predprinimatelja-do-predsedatelja-soveta-direktorov-otziv.html" />
    <id>tag:aninatalie.ru,2010:/research//1.35</id>

    <published>2010-05-17T04:34:10Z</published>
    <updated>2010-05-17T04:45:35Z</updated>

    <summary>Я знаю, что у моего ресурса не так уж много читателей. Но тем, кто ко мне все же иногда заглядывает, хочу сделать небольшой подарок - рекомендовать книгу &quot;Путь собственника. От предпринимателя до председателя совета директоров&quot;....</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Личная библиотека Perl-программиста" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[<p>Я знаю, что у моего ресурса не так уж много читателей. Но тем, кто ко мне все же иногда заглядывает,
хочу сделать небольшой подарок - рекомендовать книгу <b>"Путь собственника. От предпринимателя до 
председателя совета директоров"</b>.</p>
]]>
        <![CDATA[<p>Менеджеры и предприниматели бывают разные. Существуют и те, глядя на которых учишься: <b>как не надо строить бизнес</b>. Именно парочка таких горе-предпринимателей, а так же собственный "успешный" опыт, 
привели меня 
к тому, что когда я захотела создать свое собственное небольшое дело, в первую очередь решила улучшать свои бизнес-навыки.</p>

<p>Среди несчетного количества руководств по менеджменту нашла настоящую жемчужину: <b>"Путь собственника. От предпринимателя до председателя совета директоров"</b>.</p>

<p>Книга о том, как происходит развитие компании. С первых шагов, до момента, когда компания станет поглощать
другие предприятия. О том, какие проблемы возникают на этом пути, какие ошибки совершают предприниматели, и как
этих ошибок избежать.</p>

<p>Впрочем, все эти рекомендации можно легко перенести на деятельность не предприятия, а одного из его подразделений. По тем же принципам (и с теми же ошибками) происходит развитие интернет-ресурсов.</p>

<p>Рекомендую книгу к изучению. Прочитайте, и сделайте все возможное, чтоб ее не прочитали Ваши конкуренты. Это шутка, конечно :)</p>


<p><i>Путь собственника. От предпринимателя до председателя совета директоров / Кэтрин Кэтлин, Джейна Мэтьюз. - Манн, Иванов и Фербер, 2008. - 176 с. </i> (<a href="http://www.ozon.ru/context/detail/id/4302176/?partner=aninatalie">Описание на ozon.ru</a>) </p>]]>
    </content>
</entry>

<entry>
    <title>Как создать собственный фильтр для шаблонов Template Toolkit</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2010/05/kak-sozdat--sobstvennij-fil-tr-dlja-shablonov-template-toolkit.html" />
    <id>tag:aninatalie.ru,2010:/research//1.34</id>

    <published>2010-05-14T04:45:15Z</published>
    <updated>2010-06-17T16:57:54Z</updated>

    <summary> Материалов по теме &quot;Как создать собственный фильтр для шаблонов Template Toolkit&quot; достаточно, как на русском, так и на английском языках. А вот примеров кода реально работающего фильтра практически нет. Восполняю этот пробел, возможно кому-нибудь пригодится....</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[ <p>Материалов по теме <b>"Как создать собственный фильтр для шаблонов Template Toolkit"</b> достаточно, как на русском, так и на английском языках.</p>

<p>А вот примеров кода реально работающего фильтра практически нет. Восполняю этот пробел, возможно кому-нибудь пригодится.</p>
]]>
        <![CDATA[<p>Далее изложено 3 варианта создания фильтра, все - работающие. Разъяснений и комментариев в этот раз не будет.
Для изучения теории создания шаблонов рекомендую несколько публикаций, ссылки на которые приведены
в заключительной части.</p>

<h2>Варианты кода для создания фильтра</h3>

<p>Примеры разработаны для решения задачи:<br>
<i>Есть строка текста неопределенной длины. Надо эту строку сократить до определенного администратором 
числа символов.</i></p>

<h3>Вариант 1. Самый простой</h3>

<p>1) В модуле, где происходит создание объекта шаблона, создать подпрограмму-фильтр. </p>

<p>Например:</p>
<pre>
$MAX_LENGTH = 30;

sub filter {
	my $text = shift;

	if (length($text) > $MAX_LENGTH) {
		...
		# обработка переменной $text регулярными выражениями,
		# формирование ее нового значения
		...
	}
	return $text;
}
</pre>
<p>Фильтр, в данном случае, выполняет следующие действия: принимает данные для обработки, проводит обработку,
возвращает измененные данные. В общем, это самая обыкновенная функция.</p>

<p>Кстати, можно разместить фильтр в другом модуле, а потом его просто подключить с помощью use.</p>

<p>2) В опции, которые задаются при создании объекта TemplateToolkit, добавляем параметр FILTERS.</p> 
Пример:
<pre>
...
	my $template_options = {
		...
		INCLUDE_PATH 	=> $templ_path,
		FILTERS => {
			'new_filter'  => \&filter,
		},
		...
	};

	my $template = Template->new($template_options) || do {
		$ERROR = "Can't create Template object: ".$Template::ERROR; 
		return undef;
	};
...
</pre>

<p>3) Фильтр создан и его можно использовать в шаблонах Template Toolkit, как любой другой фильтр:</p>
<pre>
[%- 'очень_длинная_фраза_которую_надо_укоротить' | new_filter -%]
</pre>


<h3>Вариант 2</h3>

<p>Создаем фильтр в виде подключаемого в шаблонах плагина.</p>

<p>1) Создаем плагин.</p>

<pre>
package Template_Plugin::MyNewFilter;

use Template::Plugin::Filter;

use base qw( Template::Plugin::Filter );

use vars qw(
	$FIRST_PART_LENGTH
	$LAST_PART_LENGTH
	$MAX_LENGTH
);

$FIRST_PART_LENGTH = 15;
$LAST_PART_LENGTH = 7;
$MAX_LENGTH = 30;

sub filter {
	my ($self, $text) = @_;

	if (length($text) > $MAX_LENGTH) {
		$text =~ /^(.{$FIRST_PART_LENGTH}).+(.{$LAST_PART_LENGTH})$/i;
		$text = $1.'...'.$2;
	}
	return $text;
}

1;
</pre>

<p>2) Плагин-фильтр должен располагаться пространстве имен, которое задается опциями, 
при создании объектов Template Toolkit.</p>

<pre>
...
	my $template_options = {
		...
		PLUGIN_BASE 	=> $TTPluginBase,
		...
	};
	my $template = Template->new($template_options) || 
		do {$ERROR = "Can't create Template object: 
		".$Template::ERROR; return undef;};
...
</pre>

<p>3) Используем получившийся плагин в шаблонах Template Toolkit.</p>
<pre>

[%- USE MyNewFilter -%]

[% FILTER $MyNewFilter %]очень_длинное_название_продукта_
которое_не_помещается_в_одной_строке[% END %]

</pre>

<h3>Вариант 3. Самый правильный</h3>
<p>Не знаю, как Вам, но мне не нравится указывать в шаблонах фильтр, с помощью знака доллара:
FILTER $MyNewFilter . Если уж добавлять фильтр, как плагин, то и использовать, как обычный стандартный 
фильтр: FILTER MyNewFilter.</p> 

<p>Поэтому, продолжаем поиски. И находим третий вариант создания фильтра.</p>

1) Создаем модуль плагина-фильтра:
<pre>
package Template_Plugin::MyNewFilter;

use strict;
use Template::Plugin::Filter;
use base qw( Template::Plugin::Filter );

use vars qw(
	$FIRST_PART_LENGTH
	$LAST_PART_LENGTH
	$MAX_LENGTH
);

$FIRST_PART_LENGTH = 15;
$LAST_PART_LENGTH = 5;
$MAX_LENGTH = 30;

sub new {
	my ($class, $context, @params) = @_;

	my $self = {
		_CONTEXT => $context,
		_DYNAMIC => 1,
	};
       	bless $self, $class;
	$self->install_filter('MyNewFilter');

	return $self;
}

sub filter {
	my ($self, $text) = @_;

	if (length($text) > $MAX_LENGTH) {
		$text =~ /^(.{$FIRST_PART_LENGTH}).+(.{$LAST_PART_LENGTH})$/i;
		$text = $1.'...'.$2;
	}

	return $text;
}

1;
</pre>

<p>Стоит отметить, что метод install_filter предлагают использовать многие руководства 
по Template::Plugin::Filter,
однако ни одно из них даже словом не упоминает, что необходимо создавать метод new, а так же - как 
его создавать. А без new стабильно работать будет только 500-ая ошибка сервера.
</p>
<p>2) Не забываем, что плагин-фильтр должен быть размещен в определенном опцией PLUGIN_BASE пространстве имен.
</p>
<p>3) Вот оно счастье - красивое использование фильтра:</p>
<pre>
[%- USE MyNewFilter -%]
[%- 'это-название-ни-в-какие-рамки-не-лезет' FILTER MyNewFilter -%]
или
[%- 'это-название-ни-в-какие-рамки-не-лезет' | MyNewFilter -%]
</pre>

<h3>Полезные ссылки</h3>

<p>Разнообразные теоретические аспекты создания фильтров можно узнать по приведенным ниже адресам:</p>
<p>
<a href="http://www.template-toolkit.ru/Modules/Template/Plugin/Filter.html">http://www.template-toolkit.ru/Modules/Template/Plugin/Filter.html</a><br>

<a href="http://www.template-toolkit.ru/Modules/Template/Plugin/Filter.html">http://www.template-toolkit.ru/Modules/Template/Plugin.html</a><br>

<a href="http://www.template-toolkit.ru/Modules/Template/Plugin/Filter.html">http://search.cpan.org/~abw/Template-Toolkit-2.22/lib/Template/Plugin/Filter.pm</a><br>

Книга: <b>Perl Template Toolkit - O'Reilly - By Darren Chamberlain, David Cross, Andy Wardley</b>
</p>]]>
    </content>
</entry>

<entry>
    <title>Как написать свой собственный обработчик (handler) Apache, используя mod_perl? Краткий обзор</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2009/12/kak-napisat--svoj-sobstvennij-obrabotchik-handler-apache-ispol-zuja-mod-perl-kratkij-obzor.html" />
    <id>tag:aninatalie.ru,2009:/research//1.33</id>

    <published>2009-12-17T13:25:52Z</published>
    <updated>2010-06-17T17:06:32Z</updated>

    <summary></summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apache" label="Apache" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mod_perl" label="mod_perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
         
        <![CDATA[<ol>
<li><a href="#new">Создание обработчика</a></li>
<li><a href="#start">Запуск обработчика</a></li>
<li><a href="#links">Полезные ссылки</a></li>
</ol>

<p>Иногда возникает необходимость добавить Apache специфичную функциональность, и одним из вариантов
решения данного вопроса является создание нового обработчика.</p>

<p>Подключенный к серверу, mod_perl предоставляет Perl-интерфейс к API Apache.
Благодаря Perl-интерфейсу API Apache можно получить доступ к внутренней деятельности Apache из perl-скриптов.</p>

<p>Физически Apache Perl API представляет собой модуль, который работает под управлением mod_perl 
- <font color="#009900">Apache.pm</font>. <font color="#009900">Apache.pm</font> и еще 
несколько модулей, включены в пакет поставки mod_perl.</p>

<p>Apache Perl API позволяет создавать обработчики Apache на Perl для любой фазы обработки запроса.</p>


<a name="new"></a><h2>Создание обработчика</h2>

<p>Внутренняя структура обработчика на perl представляет собой обычный модуль, 
со специальным методом внутри - <font color="#009900">sub handler</font>. </p>

<p>Пример кода обработчика:</p>
<pre>
package Apache::MyHandler;

use strict;
use Apache;
use Apache::Constants qw(:common OK);

sub handler {
	my $r = shift;
	...
	return OK;
}
1;
</pre>
<p>Если метод обработчика имеет отличное от <font color="#009900">handler()</font> - название, необходимо 
сделать соответствующие дополнения при конфигурировании сервера.</p>

<pre>
например
PerlHandler Apache::MyHandler::not_standart_handler_name
вместо
PerlHandler Apache::MyHandler
</pre>

<p>Для реализации взаимодействия с Apache подключаем основной модуль - <font color="#009900">Apache.pm</font>, 
и дополнительные 
(<font color="#009900">Apache::Constants, Apache::Connection, Apache::Server</font> и т.д.) 
 - по необходимости.</p>

<p>Согласно неофициальным стандартам, модуль создаваемого обработчика помещается в пространство имен Apache
(<font color="#009900">package Apache::</font>).</p>

<p>При вызове обработчика Apache передает ему информацию о текущей транзакции и конфигурации сервера,
в виде ссылки на объект. Обработчик может манипулировать этими данными по своему усмотрению. 
Согласно сложившимся традициям, ссылка на объект передается переменной, которую называют 
<font color="#009900">$r</font>.</p>

<p>После завершения работы, метод <font color="#009900">handler</font> должен вернуть серверу определенный статусный код. Для удобства работы
с кодами можно использовать модуль <font color="#009900">Apache::Constants</font>.</p>

<a name="start"></a><h2>Запуск обработчика</h2>

<p>Для задания perl-обработчика определенному этапу обработки запроса, в конфигурационном файле сервера
(<font color="#009900">httpd.conf</font>)
используются директивы
<font color="#009900">Perl*Handler</font>. Название каждой директивы позволяет однозначно определить, 
для какой стадии 
обработки запроса назначен обработчик.</p>

<p>Директивы <font color="#009900">Perl*Handler</font> предоставляются mod_perl, 
и не доступны на сервере, где mod_perl
не установлен.</p>

<p>Список допустимых директив <font color="#009900">Perl*Handler</font>:</p>

<ul>
<li>PerlChildInitHandler</li>
<li>PerlPostReadRequestHandler</li>
<li>PerlInitHandler</li>
<li>PerlTransHandler</li>
<li>PerlHeaderParserHandler</li>
<li>PerlAccessHandler</li>
<li>PerlAuthenHandler</li>
<li>PerlAuthzHandler</li>
<li>PerlTypeHandler</li>
<li>PerlFixupHandler</li>
<li>PerlHandler</li>
<li>PerlLogHandler</li>
<li>PerlCleanupHandler</li>
<li>PerlChildExitHandler</li>
</ul>

<p><b>Пример подключения обработчиков:</b></p>
<pre>
< Directory /home/aninatalie/aninatalie.ru/cgi>
	SetHandler perl-script
	PerlInitHandler Apache::StatINC
	PerlHandler Apache::Registry
...
< / Directory>
</pre>

<p>Обработчик <font color="#009900">perl-script</font>, указанный директивой 
<font color="#009900">SetHandler</font>, означает, что запросы к файлам 
каталога <font color="#009900">/home/aninatalie/aninatalie.ru/cgi</font> будут обрабатываться 
с помощью mod_perl. 
Директива <font color="#009900">PerlInitHandler</font> назначает обработчик 
<font color="#009900">Apache::StatINC</font> для стадии запроса "Header parsing". Для стадии генерации содержимого 
и ответа клиенту, директивой <font color="#009900">PerlHandler</font> назначается обработчик 
<font color="#009900">Apache::Registry</font>. </p>

<p>Стоит отметить, что директивы <font color="#009900">Perl*Handler</font> не обеспечивают 
автоматическую загрузку модуля обработчика.
Для загрузки модуля необходимо предварительно использовать директиву 
<font color="#009900">PerlModule</font>.</p>



<a name="links"></a><h2>Полезные ссылки</h2>
<noindex>
<p>
<a href="http://httpd.apache.org/docs/2.2/handler.html">Что такое обработчик (handler) Apache?</a><br>

<a href="http://www.iakovlev.org/index.html?p=583&m=1">Архитектура Apache Module API</a><br>

<a href="http://xpoint.ru/forums/programming/perl/mod_perl/faq.xhtml">http://xpoint.ru/forums/programming/perl/mod_perl/faq.xhtml</a>
</p>
</noindex>
]]>
    </content>
</entry>

<entry>
    <title>Клаус Кобьелл. Мотивация в стиле ЭКШН. Восторг заразителен. Отзыв</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2009/12/klaus-kob-ell-motivacija-v-stile-ekshn-vostorg-zarazitelen-otziv.html" />
    <id>tag:aninatalie.ru,2009:/research//1.32</id>

    <published>2009-12-04T13:27:29Z</published>
    <updated>2009-12-04T13:51:51Z</updated>

    <summary>Увлекшись изучением стратегического менеджмента, совсем перестала заниматься Apache. Зато, прочитала интересную книгу Клауса Кобьелла - &quot;Мотивация в стиле экшн&quot;. Отличное произведение. Автор - владелец небольшого отеля, если не ошибаюсь, в Баварии. Отель очень успешен, в первую очередь благодаря его сотрудникам....</summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Личная библиотека Perl-программиста" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
        <![CDATA[<p><i>Увлекшись изучением стратегического менеджмента, совсем перестала заниматься Apache. Зато, прочитала интересную книгу Клауса Кобьелла - "Мотивация в стиле экшн". Отличное произведение.</i></p>
<p>Автор - владелец небольшого отеля, если не ошибаюсь, в Баварии. <font color="#00aa00">Отель очень успешен, в первую очередь благодаря его сотрудникам.</font> Подход к сотрудникам там... именно как к сотрудникам, партнерам, а не как бесправному стаду баранов - что очень часто практикуется в России.</p>

<p>Честно говоря, книга читается <font color="#00aa00">как научная фантастика - замечательно, здорово, но не правда!</font> Ну не может так быть! Шампанское, букет цветов в первый рабочий день для нового сотрудника - Вы издеваетесь, что ли???</p>
]]>
        <![CDATA[<p>Примечательно, что книга не новая. Речь в ней идет о деятельности отеля в 1994 году и ранее. В России сейчас 2009 год, но о таком уровне отношений между сотрудниками и работодателями, остается только мечтать.</p>

<p>И ведь, наверняка, никто не будет спорить, что успех дела часто зависит только от людей, которые это дело реализуют. Но почему же, почему, рядовым сотрудникам обычно уделяется так мало внимания?</p>

<p>Особенно сейчас, в эпоху виртуализации, когда <font color="#00aa00">плохая мотивация и обида одного-единственного сотрудника может привести к огромным убыткам?</font> Достаточно просто качественно нахамить одному клиенту, и новость об этом разнесется по всем социальным сетям... Или разгневанный сисадмин порушит корпоративную сеть и уволится. Или менеджер скопирует базу данных и начнет работу на недавнего конкурента. И часто, люди, доведенные до крайности, так и делают.</p>

<p>И тогда корпорации начинают бояться - выстаивают службу безопасности, контроля, ограничения полномочий... Чем еще больше демотивируют людей, унижая их недоверием. Замкнутый круг.</p>

<p>В общем, рекомендую книгу к прочтению. Очень легкий и увлекательный стиль изложения. Много практических примеров. Книги, подобные этой, надо читать и обычным сотрудникам, и их руководителям. Ведь только общими усилиями можно изменить ситуацию к лучшему.</p>

<p><i>Мотивация в стиле ЭКШН. Восторг заразителен / Клаус Кобьелл. - Альпина Бизнес Букс, 2008 г. - 192 с.</i> (<a href="http://www.ozon.ru/context/detail/id/3964335/?partner=aninatalie">Описание на ozon.ru</a>)</p>]]>
    </content>
</entry>

<entry>
    <title>Как Apache обрабатывает поступивший запрос - 2. Модель процессов prefork</title>
    <link rel="alternate" type="text/html" href="http://aninatalie.ru/research/2009/11/kak-apache-obrabativaet-postupivshij-zapros---2-model--processov-prefork.html" />
    <id>tag:aninatalie.ru,2009:/research//1.31</id>

    <published>2009-11-12T11:50:30Z</published>
    <updated>2010-06-17T17:02:02Z</updated>

    <summary></summary>
    <author>
        <name>Aninatalie</name>
        
    </author>
    
        <category term="Perl программирование" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apache" label="Apache" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mod_perl" label="mod_perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ru" xml:base="http://aninatalie.ru/research/">
         
        <![CDATA[<p>Сервер <font color="#009900">Apache 1.X на Unix-платформах использует для работы модель процессов <b>prefork</b></font>.</p>

<p><font color="#009900">При запуске сервера стартует один-единственный процесс (родительский).</font> 
Его главное назначение - создавать (с помощью <font color="#009900"><b>fork()</b></font> ) и завершать дочерние процессы по мере необходимости. 
Конфигурационные директивы Apache позволяют контролировать количество порождаемых процессов.</p>

<p><font color="#009900">Обработкой клиентских запросов занимаются дочерние процессы</font>. Один дочерний процесс в один момент времени
может обрабатывать только один запрос. Чтобы обслужить в один момент времени, например, 1000 клиентов, 
требуется 1000 одновременно работающих процессов. 
Срок жизни порожденного процесса определяется директивой <font color="#009900"><b>MaxRequestsPerChild</b></font>. 
Директива определяет количество запросов, 
которое будет обработано процессом, после чего процесс заменяется новым.</p>

<p>После запуска сервера, <font color="#009900">родительский процесс создает пул дочерних процессов</font>, готовых обрабатывать 
входящие запросы клиентов.</p>

<p>Когда Apache получает запрос, <font color="#009900">родительский процесс ищет свободный дочерний процесс и 
поручает ему обработку запроса</font>. Если свободные процессы отсутствуют, родительский процесс 
проверяет - не исчерпан ли лимит на количество единовременно существующих процессов, и если 
возможно - создает новый процесс и поручает ему поступившую задачу. Если лимит исчерпан - поступивший 
запрос ставится в очередь на обработку.</p>

<p>Максимальная длина очереди ограничивается директивой <font color="#009900"><b>ListenBacklog</b></font>. 
Если очередь достигает максимальной длины, клиенту, приславшему новый запрос будет возвращаться ошибка с сообщением 
о недоступности сервера.</p>

<p>Для управления пулом дочерних процессов Apache предоставляет директивы:</p>
<ol>
<li><font color="#009900"><b>StartServers</b></font> - директива определяет число порожденных процессов, создаваемых Apache при запуске сервера. </li>
<li><font color="#009900"><b>MinSpareServers</b></font> - директива устанавливает минимальное число процессов Apache, которые должны 
быть доступны в любой момент времени. Если все процессы заняты обработкой клиентских запросов, 
Apache запускает новые процессы, сохраняя пул доступных серверов на минимальном уровне. </li>
<li><font color="#009900"><b>MaxSpareServers</b></font> - директива устанавливает максимальное число процессов Apache, которые 
могут бездействовать в любой момент времени.</li>
<li><font color="#009900"><b>MaxClients</b></font> - определяет максимальное число дочерних процессов, которые будут созданы для обработки 
запросов.</li>
</ol>

<h2>Достоинства и недостатки модели prefork</h2>

<p><font color="#009900">Модель <b>prefork</b> отличается высокой надежностью</font>. Программный код, обеспечивающий функционирование
родительского процесса, очень прост и надежен, и вероятность возникновения ошибок на данном уровне
крайне мала. Программный код дочерних процессов, наоборот, достаточно сложен. При подключении
дополнительных модулей к серверу, запуске некорректных скриптов, существует вероятность возникновения 
ошибок и конфликтов, которые могут привести к неожиданному и преждевременному завершению дочернего процесса. 
Однако, исправно функционирующий родительский процесс сможет отследить ситуацию 
и своевременно создаст еще одного "ребенка". Кроме того, дочерние процессы изолированы друг от друга. 
Возникновение ошибки или аварийное завершение одного процесса никак не скажется на других процессах, 
и значит, обслуживание других клиентов не будет прервано.</p>

<p>Одним из основных недостатков модели <b>prefork</b> является ее <font color="#009900">требовательность к ресурсам памяти.</font></p>


<h2>Полезные ссылки</h2>
<p>EN</p>
<noindex>
<p><a href="http://www-01.ibm.com/software/webservers/httpservers/doc/v1326/manual/ibm/9atperf.htm">Looking at 
the Apache V1.3 process model in the IBM HTTP Server</a><br>
<a href="http://httpd.apache.org/docs/1.3/misc/perf-tuning.html">http://httpd.apache.org/docs/1.3/misc/perf-tuning.html</a>
</p>

<p>RU</p>
<p>
<a href="http://www.nestor.minsk.by/sr/2005/05/sr50522.html">Обработка запросов в Apache</a><br>
<a href="http://ru.wikipedia.org/wiki/Apache">http://ru.wikipedia.org/wiki/Apache</a>
</p>
</noindex>
]]>
    </content>
</entry>

</feed>
