<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Heeppy</id>
		<title>Linuxformat - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Heeppy"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Heeppy"/>
		<updated>2026-05-13T15:30:03Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/Linuxformat:%D0%9F%D0%BE%D1%80%D1%82%D0%B0%D0%BB_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0</id>
		<title>Linuxformat:Портал сообщества</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/Linuxformat:%D0%9F%D0%BE%D1%80%D1%82%D0%B0%D0%BB_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0"/>
				<updated>2008-05-21T09:36:51Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Обязательно к прочтению: [[Информация для авторов]]&lt;br /&gt;
{| class=&amp;quot;standart&amp;quot;&lt;br /&gt;
|+Координационная таблица (красных ссылок)&lt;br /&gt;
|-&lt;br /&gt;
! ||Январь||Февраль||Март||Апрель||Май||Июнь||Июль||Август||Сентябрь||Октябрь||Ноябрь||Декабрь&lt;br /&gt;
|-&lt;br /&gt;
! 2005&lt;br /&gt;
| || || || || || || ||&lt;br /&gt;
| [[LXF70]]&lt;br /&gt;
| [[LXF71]]&lt;br /&gt;
| [[LXF72]]&lt;br /&gt;
| [[LXF73]]&lt;br /&gt;
|-&lt;br /&gt;
! 2006&lt;br /&gt;
| [[LXF74-75]]&lt;br /&gt;
| [[LXF76]]&lt;br /&gt;
| [[LXF77]]&lt;br /&gt;
| [[LXF78]]&lt;br /&gt;
| [[LXF79]]&lt;br /&gt;
| [[LXF80]]&lt;br /&gt;
| [[LXF81]]&lt;br /&gt;
| [[LXF82]]&lt;br /&gt;
| [[LXF83]]&lt;br /&gt;
| [[LXF84]]&lt;br /&gt;
| [[LXF85]]&lt;br /&gt;
| [[LXF86]]&lt;br /&gt;
|-&lt;br /&gt;
! 2007&lt;br /&gt;
| [[LXF87-88]]&lt;br /&gt;
| [[LXF89]]&lt;br /&gt;
| [[LXF90]]&lt;br /&gt;
| [[LXF91]]&lt;br /&gt;
| [[LXF92]]&lt;br /&gt;
| [[LXF93]]&lt;br /&gt;
| [[LXF94]]&lt;br /&gt;
| [[LXF95]]&lt;br /&gt;
| [[LXF96]]&lt;br /&gt;
| [[LXF97]]&lt;br /&gt;
| [[LXF98]]&lt;br /&gt;
| [[LXF99]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Следующие номера Linux Format являются &amp;quot;занятыми&amp;quot; &amp;amp;ndash; т.е. для них уже нашелся человек, желающий конвертировать их в формат Wiki:&lt;br /&gt;
&lt;br /&gt;
# [[LXF70|Linux Format 70, Сентябрь 2005]] [[Изображение:75%.png]]&lt;br /&gt;
# [[LXF71|Linux Format 71, Октябрь 2005]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF72|Linux Format 72, Ноябрь 2005]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF73|Linux Format 73, Декабрь 2005]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF74-75|Linux Format 74-75, Январь 2006]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF76|Linux Format 76, Февраль 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF77|Linux Format 77, Март 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF78|Linux Format 78, Апрель 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF79|Linux Format 79, Май 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF80|Linux Format 80, Июнь 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF81|Linux Format 81, Июль 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF82|Linux Format 82, Август 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF83|Linux Format 83, Сентябрь 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF84|Linux Format 84, Октябрь 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF85|Linux Format 85, Ноябрь 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF86|Linux Format 86, Декабрь 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF87-88|Linux Format 87-88, Январь 2007]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF89|Linux Format 89, Февраль 2007]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF90|Linux Format 90, Март 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF91|Linux Format 91, Апрель 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF92|Linux Format 92, Май 2007]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF93|Linux Format 93, Июнь 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF94|Linux Format 94, Июль 2007]] [[Изображение:75%.png]]&lt;br /&gt;
# [[LXF95|Linux Format 95, Август 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF96|Linux Fromat 96, Сентябрь 2007]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF97|Linux Format 97, Октябрь 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF98|Linux Format 98, Ноябрь 2007]] [[Изображение:50%.png]]&lt;br /&gt;
# [[LXF99|Linux Format 99, Декабрь 2007]] [[Изображение:100%.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[Изображение:00%.png]]||Меньше 3 статей&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:25%.png]]||Больше 3 статей&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:50%.png]]||Все статьи выложены, у большинства статей нет иллюстраций&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:75%.png]]||Все статьи выложены, у нескольких статей нет иллюстраций&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:100%.png]]||Все статьи оформлены и проиллюстрированы полностью&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Следующие материалы или серии материалов также являются &amp;quot;занятыми&amp;quot;:&lt;br /&gt;
* Учебник Java, LXF84-LXF87/88 &amp;amp;ndash; выполнено&lt;br /&gt;
* Учебник Subversion ([[LXF70:Subversion1|части 1]],[[LXF70:Subversion2|2]]), LXF70 &amp;amp;ndash; выполнено&lt;br /&gt;
&lt;br /&gt;
Для пробы wiki-разметки: [[Песочница]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/Linuxformat:%D0%9F%D0%BE%D1%80%D1%82%D0%B0%D0%BB_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0</id>
		<title>Linuxformat:Портал сообщества</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/Linuxformat:%D0%9F%D0%BE%D1%80%D1%82%D0%B0%D0%BB_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0"/>
				<updated>2008-04-29T09:48:29Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Обязательно к прочтению: [[Информация для авторов]]&lt;br /&gt;
{| class=&amp;quot;standart&amp;quot;&lt;br /&gt;
|+Координационная таблица (красных ссылок)&lt;br /&gt;
|-&lt;br /&gt;
! ||Январь||Февраль||Март||Апрель||Май||Июнь||Июль||Август||Сентябрь||Октябрь||Ноябрь||Декабрь&lt;br /&gt;
|-&lt;br /&gt;
! 2005&lt;br /&gt;
| || || || || || || ||&lt;br /&gt;
| [[LXF70]]&lt;br /&gt;
| [[LXF71]]&lt;br /&gt;
| [[LXF72]]&lt;br /&gt;
| [[LXF73]]&lt;br /&gt;
|-&lt;br /&gt;
! 2006&lt;br /&gt;
| [[LXF74-75]]&lt;br /&gt;
| [[LXF76]]&lt;br /&gt;
| [[LXF77]]&lt;br /&gt;
| [[LXF78]]&lt;br /&gt;
| [[LXF79]]&lt;br /&gt;
| [[LXF80]]&lt;br /&gt;
| [[LXF81]]&lt;br /&gt;
| [[LXF82]]&lt;br /&gt;
| [[LXF83]]&lt;br /&gt;
| [[LXF84]]&lt;br /&gt;
| [[LXF85]]&lt;br /&gt;
| [[LXF86]]&lt;br /&gt;
|-&lt;br /&gt;
! 2007&lt;br /&gt;
| [[LXF87-88]]&lt;br /&gt;
| [[LXF89]]&lt;br /&gt;
| [[LXF90]]&lt;br /&gt;
| [[LXF91]]&lt;br /&gt;
| [[LXF92]]&lt;br /&gt;
| [[LXF93]]&lt;br /&gt;
| [[LXF94]]&lt;br /&gt;
| [[LXF95]]&lt;br /&gt;
| [[LXF96]]&lt;br /&gt;
| [[LXF97]]&lt;br /&gt;
| [[LXF98]]&lt;br /&gt;
| [[LXF99]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Следующие номера Linux Format являются &amp;quot;занятыми&amp;quot; &amp;amp;ndash; т.е. для них уже нашелся человек, желающий конвертировать их в формат Wiki:&lt;br /&gt;
&lt;br /&gt;
# [[LXF70|Linux Format 70, Сентябрь 2005]] [[Изображение:75%.png]]&lt;br /&gt;
# [[LXF71|Linux Format 71, Октябрь 2005]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF72|Linux Format 72, Ноябрь 2005]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF73|Linux Format 73, Декабрь 2005]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF74-75|Linux Format 74-75, Январь 2006]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF76|Linux Format 76, Февраль 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF77|Linux Format 77, Март 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF78|Linux Format 78, Апрель 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF79|Linux Format 79, Май 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF80|Linux Format 80, Июнь 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF81|Linux Format 81, Июль 2006]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF82|Linux Format 82, Август 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF83|Linux Format 83, Сентябрь 2006]] [[Изображение:75%.png]]&lt;br /&gt;
# [[LXF84|Linux Format 84, Октябрь 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF85|Linux Format 85, Ноябрь 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF86|Linux Format 86, Декабрь 2006]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF87-88|Linux Format 87-88, Январь 2007]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF89|Linux Format 89, Февраль 2007]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF90|Linux Format 90, Март 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF91|Linux Format 91, Апрель 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF92|Linux Format 92, Май 2007]] [[Изображение:00%.png]]&lt;br /&gt;
# [[LXF93|Linux Format 93, Июнь 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF94|Linux Format 94, Июль 2007]] [[Изображение:75%.png]]&lt;br /&gt;
# [[LXF95|Linux Format 95, Август 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF96|Linux Fromat 96, Сентябрь 2007]] [[Изображение:100%.png]]&lt;br /&gt;
# [[LXF97|Linux Format 97, Октябрь 2007]] [[Изображение:25%.png]]&lt;br /&gt;
# [[LXF98|Linux Format 98, Ноябрь 2007]] [[Изображение:50%.png]]&lt;br /&gt;
# [[LXF99|Linux Format 99, Декабрь 2007]] [[Изображение:100%.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[Изображение:00%.png]]||Меньше 3 статей&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:25%.png]]||Больше 3 статей&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:50%.png]]||Все статьи выложены, у большинства статей нет иллюстраций&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:75%.png]]||Все статьи выложены, у нескольких статей нет иллюстраций&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:100%.png]]||Все статьи оформлены и проиллюстрированы полностью&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Следующие материалы или серии материалов также являются &amp;quot;занятыми&amp;quot;:&lt;br /&gt;
* Учебник Java, LXF84-LXF87/88 &amp;amp;ndash; выполнено&lt;br /&gt;
* Учебник Subversion ([[LXF70:Subversion1|части 1]],[[LXF70:Subversion2|2]]), LXF70 &amp;amp;ndash; выполнено&lt;br /&gt;
&lt;br /&gt;
Для пробы wiki-разметки: [[Песочница]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF83:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-26T08:41:22Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Врезка&lt;br /&gt;
|Заголовок= Наши эксперты&lt;br /&gt;
|Содержание=Наши эксперты найдут ответ на самый трудный ваш вопрос. Если у вас проблемы с установкой, настройкой модема, сетью или еще чем-нибудь – просто напишите нам, а обо всем остальном мы позаботимся.&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{!}}[[Изображение:img_83_106_1.jpg|thumb|Владея Интернет провайдером, а заодно подрабатывая редактором дисков для LXF, Нейл Ботвик скромно зовет себя мастером на все руки.]]&lt;br /&gt;
{{!}}[[Изображение:img_83_106_2.jpg|thumb|Для административных вопросов: Кингс Коблер является системным инженером и администратором Linux в Rackspace, и использует Linux 10 лет.]]&lt;br /&gt;
{{!}}}&lt;br /&gt;
|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
=== Fedora без сети ===&lt;br /&gt;
:* Я установил Fedora Core 5, и все вроде прекрасно, кроме одного. Когда я пытаюсь выполнить Add/Remove Programs (Добавить/Удалить программы) или Packager Updater (Обновление пакетов), у меня запрашивается пароль root. Затем я получаю сообщение об ошибке: «Не могу получить информацию о приложении» или «Не могу получить информацию об обновлении». Единственным отступлением от стандартной установки является отказ от Logical Volume Manager; вместо этого я вручную разбил диск на /boot (100 MБ), / (38 ГБ) и swap (1024 МБ). Да еще мой ПК не подключен к Интернету. Я пытался установить и с CD, и с вашего DVD приложения. Но получаю те же ошибки. '''Альфред Мифсуд [Alfred Mifsud]'''&lt;br /&gt;
&lt;br /&gt;
Отсутствие Интернет-соединения и есть причина этих сообщений. Обе программы при работе пытаются прочитать информацию из online-репозитория программ. В случае Software Updater это неизбежно: по самой своей природе обновления новее пакетов на установочных носителях, так что без соединения с Интернетом не обойтись.&lt;br /&gt;
&lt;br /&gt;
Во избежание этой ошибки с Add/Remove Programs, вам нужно отредактировать файлы репозитория: отключить все online-источники и добавить DVD. Делается это из-под root. Загрузите /etc/yum.repos.d/fedora-core.repo в ваш любимый текстовый редактор, найдите начало раздела [core] и закомментируйте строки baseurl и mirrorlist, поместив в начало каждой строки #. Затем добавьте новую строку вида&lt;br /&gt;
&lt;br /&gt;
 baseurl=file:///media/disk&lt;br /&gt;
&lt;br /&gt;
Создастся новый репозиторий на /media/disk, где смонтирован DVD. Затем вам следует отредактировать другие .repo-файлы и изменить все вхождения enabled=1 на enabled=0. Теперь единственный активный репозиторий – это DVD, и запуск Add/Remove Software должен позволить вам установить приложения с диска. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Черепашья почта ===&lt;br /&gt;
:* Мой почтовый сервер на основе Qmail отправляет почту с большой задержкой. Я пытался ускорять его, но ничего не вышло. Не могли бы вы перечислить, что может вызывать задержку? '''Т.Мэтьюс [T Matthews]'''&lt;br /&gt;
&lt;br /&gt;
Наиболее вероятная причина задержек – запросы DNS. Первое и главное, убедитесь, что имя сервера нормально разрешается. Кроме того, для IP-адреса, используемого сервером для отправки почты, должна быть создана PTR-запись. Вы также можете ускорить запросы, запустив собственный локальный кэширующий сервер имен.&lt;br /&gt;
&lt;br /&gt;
Также можно отключить DNS-запросы вообще. Если вы запускаете qmail-smtpd через tcpserver, то добавьте в его опции флаг -H, чтобы он не искал имена хостов в DNS, и удалите переменную среды $TCPREMOTEHOST. Во избежание зацикливания вы должны использовать эту опцию для серверов по TCP-порту 53. Если это не так, то вы, вероятно, запускаете его через inetd/xinetd; и можете добавить в конфигурацию флаг -Rt0, в пункте server_args конфигурационного файла вашего inetd/xinetd. Это запретит Qmail выполнять запросы ident при установлении SMTP-соединения. Проделанные действия проявляют себя в задержке между установлением TCP-соединения и появлением приглашения.&lt;br /&gt;
&lt;br /&gt;
А если ваша очередь постоянно переполняется, можете добавить файл '''/var/qmail/control/queuelifetime''' и установить в нем срок менее семи дней (срок по умолчанию, означающий, что попытки отправки всех поступающих писем будут повторяться в течение недели). Одного или двух дней вполне хватит. Эти шаги должны снизить время, необходимое Qmail для отображения приглашения. '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Реаниматор ===&lt;br /&gt;
:* Мой друг владеет маленькой юридической фирмой (шесть пользователей, использующих Windows XP Pro, Linux proxy/mail сервер). Они часто портят компьютеры, и он зовет меня чинить их. Обычно это означает резервирование всех документов, сохраненных где попало, и переустановку Windows.&lt;br /&gt;
&lt;br /&gt;
:Поэтому я пытаюсь найти и установить полностью автоматизированную систему на базе Linux для восстановления после сбоев, которая бы производила резервирование после каждой установки (типа Ghost или G4L) и еженощно резервировала бы каждую рабочую станцию, чтобы, если кто-то навредил, нужно было только загрузиться с другого компьютера в сети или с CD и восстановить систему из образов с backup-сервера. '''Кристос Иоанну [Christos Ioannou]'''&lt;br /&gt;
&lt;br /&gt;
Здесь две отдельных проблемы. Первая – это создание резервной копии на CD или в сети, чтобы полностью переустановить систему в серьезном случае. Вторая – регулярное резервирование данных.&lt;br /&gt;
&lt;br /&gt;
Вы не ошибетесь, если для первого пути выберите Partition Image – [http://www.partimage.org www.partimage.org]. Это Linux-программа, имеющая клиент-серверные функции. Вы можете запустить сервер на вашем Linux-компьютере и использовать Live CD для создания образов дисков каждой Windows-машины. Вам понадобится Live-CD дистрибутив, который можно будет использовать для восстановления диска из файл-образа на сервере. RIP (Recovery Is Possible [«восстановление возможно»; также Rest In Peace – покойся с миром – надпись на надгробье; см. стр. 48 – прим. ред.]) вполне подойдет ([http://www.tux.org/pub/people/kent-robotti/looplinux/rip www.tux.org/pub/people/kent-robotti/looplinux/rip]). Документация содержит детальные инструкции изменения CD-образа под ваши нужды; вы можете добавить небольшой скрипт командной оболочки и вызвать его из /etc/rc.d/rc.local, чтобы автоматизировать полное восстановление системы при загрузке с CD.&lt;br /&gt;
&lt;br /&gt;
Для ночного инкрементного резервирования хорошим выбором будет BackupPC ([http://backuppc.sourceforge.net http://backuppc.sourceforge.net]). Она запускается на Linux сервере и не требует специального ПО, установленного на Windows ПК, т.к. доступ к нему осуществляет Samba. Нужно только настроить на ПК совместное использование, чтобы BackupPC смог заполучить файлы. Вся работа выполняется на Linux-машине, так что ночным резервированием сможет управлять простое задание Cron. BackupPC обладает web-интерфейсом, и пользователям не придется учить загадочные команды для восстановления файлов из резервной копии.&lt;br /&gt;
&lt;br /&gt;
Эта программа особенно хороша при резервировании некоторого числа схожих ПК, поскольку хранит одну копию файла, находящегося на нескольких компьютерах. Вместе со сжатием это значительно уменьшает требуемое пространство для резервирования узлов сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Захват экрана ===&lt;br /&gt;
:* Ищу приложение, которое бы записывало все, что я делаю на машине, в небольшой фильм. Можете ли вы что-то порекомендовать? '''Мак-Скрафф [McScruff]''', с форума&lt;br /&gt;
&lt;br /&gt;
Для этого существует множество решений, в зависимости от предназначения фильма. Если вы хотите опубликовать его в Интернете, лучшим выбором будет Vnc2swf. Она записывает VNC-сессию как Flash-анимацию. Вам нужно будет установить VNC (или Tightvnc с [http://www.tightvnc.com www.tightvnc.com]). VNC создан для удаленного рабочего стола, но вы также можете использовать его на одном компьютере. Запустите VNC-сессию&lt;br /&gt;
&lt;br /&gt;
 vncserver -depth 16 -geometry 800x600&lt;br /&gt;
&lt;br /&gt;
и увидите строку вида:&lt;br /&gt;
&lt;br /&gt;
 New ‘X’ desktop is yourhostname:N&lt;br /&gt;
&lt;br /&gt;
Последняя часть – имя хоста (yourhostname) и номер дисплея. Если ваш компьютер не подключен к сети, можете использовать localhost. Теперь начните сессию командой&lt;br /&gt;
&lt;br /&gt;
 vnc2swf -startrecording -geometry 800x600 -depth 16 -framerate 5 demo.swf yourhostname:N.0&lt;br /&gt;
&lt;br /&gt;
Убедитесь, что разрешение (geometry), глубина цвета (depth), имя хоста (yourhostname) и дисплей соответствуют только что запущенному вами VNC-серверу. '''.0''' в конце обязателен. Появится новое окно, содержащее рабочий стол VNC-сессии, и все, что вы будете делать в нем, запишется в demo.swf. Завершите запись, закрыв это окно. Программа выведет некоторый HTML-код для просмотра Flash-анимации в web-браузере, который вы при желании можете перенаправить в файл. Размер и количество кадров определяется web-браузером, но для вывода демонстрации локально на монитор или проектор вы можете захотеть увеличить и то и другое.&lt;br /&gt;
&lt;br /&gt;
Для генерации фильма можете использовать Vncrec. Работает она по той же схеме, что и Vnc2swf, но создает файл в своем собственном формате, который вы может перекодировать в AVI или MPEG при помощи transcode.&lt;br /&gt;
&lt;br /&gt;
 vncrec -record demo.vnc&lt;br /&gt;
 transcode -x vnc --use_rgb -y xvid - k --dvd_access_delay 5 -f 10 -i demo.vnc -o demo.avi&lt;br /&gt;
&lt;br /&gt;
Используемое разрешение опять-таки должно совпадать с разрешением, в котором запущен сервер. Ключ -f устанавливает количество кадров в секунду для видео. Получившийся файл может быть просмотрен в любом видеопроигрывателе, например, MPlayer или Xine.&lt;br /&gt;
&lt;br /&gt;
Какое бы записывающее приложение вы ни выбрали, если вы хотите, чтобы в начале записи запускалась некоторая программа, то пропишите ее в ~/.vnc/xstartup:&lt;br /&gt;
&lt;br /&gt;
 ooimpress sample.pps&lt;br /&gt;
&lt;br /&gt;
Другая возможность – Istanbul с [http://live.gnome.org/Istanbul http://live.gnome.org/Istanbul]. Это программа для Gnome, но работает и на других рабочих столах. Она помещает иконку на панели: нажмите ее для начала записи, а повторное нажатие остановит запись. Результат сохраняется под именем ~/desktop-recording.ogg, в формате Theora. Она может показаться примитивной по сравнению с альтернативами, но настраивается быстро и легко. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Лишенец прав! ===&lt;br /&gt;
:* Я недавно перешел с Xandros на Fedora Core 5. Я перекачал 3 ГБ данных и обнаружил, что все файлы в моем домашнем каталоге имеют владельца и принадлежат к группе root. Есть ли скрипт, который поможет мне изменить права доступа на мое имя пользователя? '''Д.Ригли [D Wrigley]'''&lt;br /&gt;
&lt;br /&gt;
Если вы скопировали свой домашний каталог (к примеру, /home/dave) с одной машины на другую, наилегчайший способ восстановить владельца в этом каталоге – рекурсивно выполнить chown от имени root в /home/dave с корректными именем и группой владельца. Это можно безопасно сделать в вашем домашнем каталоге, поскольку он обычно содержит только файлы и каталоги, принадлежащие пользователю и группе пользователя, к которому относится этот каталог.&lt;br /&gt;
&lt;br /&gt;
 chown -R macdaddy:macdaddy /home/macdaddy&lt;br /&gt;
&lt;br /&gt;
Если у вас много файлов и каталогов, принадлежащих другим пользователям и группам, необходимо выполнить поиск с заменой. Так что если пользователь ‘dave’ имеет множество файлов и каталогов в '''/var/www/html''' и вы хотите сменить владельца этих файлов на пользователя и группу ‘bigmac’, следует применить chown -R для смены владельца каталогов. Беда в том, что заодно поменяют владельца и те файлы, которые вам трогать не хотелось. Чтобы каталоги, не принадлежащие Dave, остались без изменений, для поиска и смены владельца используйте команду find,:&lt;br /&gt;
&lt;br /&gt;
 find /var/www/html -user dave -group dave -exec chown bigmac:bigmac {} \;&lt;br /&gt;
&lt;br /&gt;
Эта команда найдет любой каталог или файл в /var/www/html, принадлежащий пользователю и группе dave, а затем сменит владельца на bigmac. {} указано для замены найденных файлов, соответствующих критериям -user и -group, а \; необходимо во избежание интерпретации ; командной оболочкой, и чтобы сообщить find, что список параметров закончился.&lt;br /&gt;
&lt;br /&gt;
Итак, для стандартных домашних каталогов наилегчайший способ сменить владельца единовременно – использовать команду chown -R. Помните, что этот метод применим не во всех частях файловой системы! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Пропал Thunderbird ===&lt;br /&gt;
:* Щелкая на email-адресе в KDE, я получаю ошибку: ‘Kdeinit can not start /usr/share/application/Thunderbird/Thunderbird’. Thunderbird установлен в /opt/Thunderbird. Был у меня SUSE, но в сейчас я использую Gentoo, и когда я переносил каталог /home, вероятно, что-то затер в Kdeinit, но не могу понять что. Не могли бы вы сказать мне, как сделать, чтобы Kdeinit искал в нужном месте? '''Стюарт [Stewart]'''&lt;br /&gt;
&lt;br /&gt;
Похоже, что KDE не там ищет Thunderbird. Как и большинство опций KDE, вы можете изменить это в Центре управления KDE; хотя найти нужное место в Центре Управления трудно – там столько всего, и не всегда там, где вы ожидаете увидеть. Центр Управления содержит функцию поиска, которая обычно помогает, но не в этом случае (по крайней мере не в KDE 3.5.3). Нужная вам опция находится в Компоненты &amp;gt; Выбор Компонентов &amp;gt; Email-клиент. Выберите радиокнопку Использовать другой Email-клиент, затем щелкните на маленькой иконке справа от строки ввода чтобы открыть окно выбора приложения. Выбрав программу таким образом, вы установите верный путь.&lt;br /&gt;
&lt;br /&gt;
Thunderbird откроется, но без адреса получателя или любой другой информации. Чтобы исправить это, добавьте следующее в строку запуска Thunderbird:&lt;br /&gt;
&lt;br /&gt;
 -compose “mailto:%t?subject=%s&amp;amp; body=%B”&lt;br /&gt;
&lt;br /&gt;
Задержите курсор мыши над строкой ввода, чтобы увидеть доступные опции. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Спутанные карты ===&lt;br /&gt;
:* Только что установил Fedora Core 5, и слегка в недоумении: какая из моих сетевых карт работает. У меня их две, и при предыдущих установках по умолчанию использовалась eth0. Вот результат выполнения ifconfig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0 Link encap:Ethernet HWaddr 00:30:18:58:4A:A3&lt;br /&gt;
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
UP BROADCAST MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
eth1 Link encap:Ethernet HWaddr 00:50:BA:B3:B1:A5&lt;br /&gt;
inet addr:192.168.1.152 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::250:baff:feb3: b1a5/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:258479 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:264885 errors:0 dropped:0 overruns:13 carrier:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
: Мне кажется, что при работе в сети весь трафик идет через eth1. Можете ли вы пролить свет на это? '''pk_fox'''&lt;br /&gt;
&lt;br /&gt;
Вы используете DHCP на обеих сетевых картах? Если да, то вот что скорее всего происходит:&lt;br /&gt;
# Обнаруживается первая сетевая карта (NIC) и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
# Определяется вторая NIC и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
&lt;br /&gt;
Четвертый шаг переписывает шлюз по умолчанию в таблице маршрутизации, забивая установки, сделанные на втором шаге. Вы можете проверить это, выполнив&lt;br /&gt;
&lt;br /&gt;
 route -n&lt;br /&gt;
&lt;br /&gt;
Строка, показывающая расположение 0.0.0.0, завершается интерфейсом, используемым по умолчанию. Есть ли причина, по которой вы используете две NIC? Если да, то вам, видимо, придется настроить шлюз по умолчанию вручную. Или же отключите опцию activate device when computer starts для одной из NIC в программе настройки сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Сам себе браузер? ===&lt;br /&gt;
:* Я управляю сервисом хостинга, на нем более 100 доменов. Последние несколько дней стало казаться, что наш сервер тормозит. Я выполнил несколько предварительных тестов (используя netstat) и обнаружил множество соединений с моего сервера по TCP-порту 80 к моему серверу по временным портам. Из полученных результатов я понял, что имеются соединения от Apache по порту 80 к другим портам моего сервера. Но почему? Как мой сервер может просматривать мои собственные web-сайты? Используется Apache 2 под Red Hat Enterprise Linux 3. '''Джон [John]'''&lt;br /&gt;
&lt;br /&gt;
Весьма похоже, что это поведение спровоцировал один из ваших новых web-сайтов. Из описанного вами отчета netstat я делаю вывод, что некий код вызывает соединения с вашим сервером. Проанализировав деятельность сервера Apache, мы можем сравнить число netstat-соединений с обслуживаемыми Apache. Для этого поместим следующее в конфигурационный файл Apache (/etc/httpd/conf/httpd.conf):&lt;br /&gt;
&lt;br /&gt;
 ExtendedStatus on&lt;br /&gt;
 &amp;lt;Location /server-status&amp;gt;&lt;br /&gt;
  SetHandler server-status&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы откроете страницу www.domain.com/server-status?refresh=5, то статус вашего сервера будет обновляться раз в пять секунд. Уделите особое внимание загруженности процессора и числу секунд с начала нового запроса (SS). Также, сравнивая число соединений выдаваемых netstat с числом соединений на отдельном виртуальном хосте, вы быстро найдете виновника! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Саботаж Sendmail ===&lt;br /&gt;
:* Я создаю сервер для размещения управляющего ПО нашей лаборатории (я написал его на PHP, благодаря урокам в LXF!). Установил сервер Kubuntu с Sendmail – и начались проблемы.&lt;br /&gt;
&lt;br /&gt;
:Я выполнил простую настройку Sendmail, оставив все как есть, поскольку почти ничего не понимаю в настройке Sendmail! Он отправляет почту людям в локальной сети (например, john@localnet.co.uk), но во внешний мир ничего не исходит (например, на john@hotmail.com). Был бы очень благодарен за совет – а может, и за учебник по установке почтового сервера? '''Джон Клейтон [John Clayton]'''&lt;br /&gt;
&lt;br /&gt;
Sendmail – не лучший выбор для вас. Это несомненно мощный почтовый сервер, но, увы, трудно настраиваемый. Postfix или Exim больше подойдут вам, они оба доступны через репозиторий Ubuntu (Postfix – стандартный почтовый сервер и находится на установочных дисках Ubuntu). Эти сервера отлично документированы, файлы настроек имеют обычный текстовый формат, и изучить их настройки проще, чем продираться сквозь множество опций настройки Sendmail.&lt;br /&gt;
&lt;br /&gt;
Какой бы сервер вы ни выбрали, вам следует настраивать его через Webmin, он предоставляет опции в дружественной графической оболочке и позволяет избежать ошибок конфигурирования сервера, приводящих к потере почты или снижению безопасности. При желании вы также сможете читать или подстраивать файлы настроек вручную – Webmin помогает изучать опции настройки, а не прячет их.&lt;br /&gt;
&lt;br /&gt;
Для любого выбранного сервера, файлы журналов (log-файлы) предоставят причину сбоя. Выполните&lt;br /&gt;
&lt;br /&gt;
 tail -f /path/to/logfile&lt;br /&gt;
&lt;br /&gt;
и попытайтесь отправить почту во внешний мир. Вы увидите сообщение об ошибке, соответствующее сбою: варианты – от сбоя DNS (хотя это маловероятно, т.к. Интернет вообще-то работает) до блокирования исходящего SMTP-трафика вашим провайдером. Многие провайдеры делают это в качестве противоспамной меры: или перенаправляют весь SMTP-трафик на собственный почтовый сервер, или блокируют вообще. Если это так, вам необходимо настроить ваш почтовый сервер на использование сервера вашего провайдера как ‘smarthost’, тогда вся почта не для вашей локальной сети будет отсылаться через тот сервер. Для этого в Sendmail поместите в Sendmail.cf следующее:&lt;br /&gt;
&lt;br /&gt;
 DSmail.isp.com&lt;br /&gt;
&lt;br /&gt;
заместив mail.isp.com SMTP-сервером провайдера. Для Postfix такая строка&lt;br /&gt;
&lt;br /&gt;
 relayhost = mail.isp.com&lt;br /&gt;
&lt;br /&gt;
Если вы используете Webmin, это первая опция в модуле Sendmail и четвертая в модуле Postfix. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Damn-ГРУБиян ===&lt;br /&gt;
:* На моем ПК много разделов, и установлено несколько дистрибутивов Linux, хочу поиграть с ними, прежде чем остановиться на одном. Мой загрузчик – XOSL, и со многими дистрибутивами он работает прекрасно, включая штуку из Редмонда! Но он серьезно слетел после дистрибутива Damn Small Linux с [[LXF80]]. Скрипт установки DSL на жесткий диск не предоставляет выбора места размещения загрузчика Lilo или Grub – он всегда пишет его прямо в главную загрузочную запись (MBR), туда же, где размещается XOSL! Поэтому, когда я восстанавливаю XOSL, он находит все остальные дистрибутивы, но не DSL. Или ПК загружается только в DSL. Они не работают вместе.&lt;br /&gt;
&lt;br /&gt;
:Не могли бы вы объяснить на уровне начинающего: как настроить загрузку (Lilo или Grub) на разделе, где установлен DSL, чтобы XOSL смог найти и запустить его? '''Джефф [Jeff]'''&lt;br /&gt;
&lt;br /&gt;
Установить Grub на раздел вместо MBR просто, и позор, что DSL не предоставляет такой возможности. Предположим для примера, что DSL установлен на /dev/hda5. Загрузитесь в DSL, откройте root-терминал и выполните Grub. Вы перенесетесь в командую оболочку Grub, где следует набрать&lt;br /&gt;
&lt;br /&gt;
 root (hd0,4)&lt;br /&gt;
 setup (hd0,4)&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
Grub начинает счет с нуля, поэтому первый диск, пятый раздел (hda5 в терминологии Linux) – это hd0,4. Теперь загрузчик DSL установлен в разделе, и вы можете велеть XOSL загружаться с этого раздела. Когда XOSL загрузит DSL, вы перенесетесь в меню Grub – возможно, и зря, поскольку вы уже выбрали, какую ОС загружать. Избавиться от этого можно, отредактировав /boot/Grub/menu.lst и изменив время ожидания с 15 на 0. Если вы хотите сохранить выбор опций DSL, представленных в меню Grub, измените время на меньшее, но ненулевое значение. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Медленно и узко ===&lt;br /&gt;
:* Пытаюсь найти широкополосного провайдера с разумными ценами, имеющего дело с Linux. Поискал высокоскоростное телефонное соединение под Linux, но не достиг успеха. Поэтому я исследовал статистику загрузки под различными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
:Fedora Core 5 оказалась в самом низу с пиком в 1,8 КБ/с и средним около 0,7. Fedora 4 и SUSE достигли максимума 3 КБ/с при средней скорости загрузки 1,5 КБ/с. Knoppix 4 не многим лучше. В Xandros 3 получилось 4 КБ при среднем около 2 КБ. Лучше всех Mandriva 10.1 (использовались Mozilla и Epiphany), с пиком около 13 КБ/с и средним около 6 КБ/с.&lt;br /&gt;
&lt;br /&gt;
:Данные получены для различных соединений в различное время, но результаты вполне согласуются – они все работают плохо около 19:00 и 10:00 и все показали лучший результат в воскресенье утром. Я использую внешний COM-модем 56K. Есть идеи, как получить двузначную цифру скорости? '''Крис Марсден [Chris Marsden]'''&lt;br /&gt;
&lt;br /&gt;
:PS А также, идеи о сети из двух Linux-компьютеров с двумя разными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
В Великобритании есть два провайдера, специализирующихся на пользователях Linux: UKLinux.net и UK Free Software Network ([http://www.ukfsn.org www.ukfsn.org]). Оба предоставляют как ADSL, так и телефонное соединение. Ваши проблемы со скоростью действительно выглядят слегка странными, но сделать выводы трудно, поскольку вы сообщили очень мало информации – даже не указали марку модема.&lt;br /&gt;
&lt;br /&gt;
Было бы интересно сравнить настройки модема в каждом из дистрибутивов. Использование браузера для измерения скорости закачки – не самый надежный тест, на него влияет множество факторов, включая прокси-сервер провайдера. Лучшим тестом будет попытка загрузить файл через wget. Попробуйте в каждом дистрибутиве команду:&lt;br /&gt;
 &lt;br /&gt;
 wget ftp://ftp.mirrorservice.org/sites/ ftp.kde.org/pub/kde/stable/3.5.2/src/ kdeaddons-3.5.2.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Любой файл с FTP-сервера в Великобритании сойдет для теста. Вы не сможете получить двузначную цифру с 56К-модемом, если только не загружаете сжимаемые данные, например, группы новостей или web-страницы (но не картинки). Лучшее, на что вы можете рассчитывать со сжатыми данными вроде указанного выше файла или картинки – это около 7 КБ/с. Сжатые файлы дают истинную оценку качества связи.&lt;br /&gt;
&lt;br /&gt;
Указанные вами времена интересны; 19-00 – это пик использования Интернета в Великобритании (сами решайте, web или Emmerdale), тогда как утром в воскресенье отмечается спад. Стоит также попросить BT протестировать вашу линию. Даже если они скажут, что все в порядке, сам факт тестирования часто способствует улучшению.&lt;br /&gt;
&lt;br /&gt;
При использовании провайдера с поддержкой Linux вы вправе получить такую поддержку. Я бы предложил использовать телефонный доступ через UKFSN (это окупается) и попросить обоих провайдеров помочь со скоростью соединения. Кто окажется полезнее, того и делайте вашим широкополосным партнером.&lt;br /&gt;
&lt;br /&gt;
Что до вашего вопроса о соединении в сеть двух компьютеров с разными дистрибутивами, то это все равно, что два компьютера с одним и тем же вариантом Linux. Хотя инструменты настройки могут различаться, большинство дистрибутивов в принципе схожи. NFS, HTTP, Samba, практически все, что вы хотите использовать для организации сети, работает одинаково во всех дистрибутивах. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Вопрос-Победитель&lt;br /&gt;
|Содержание=&lt;br /&gt;
=== Эволюция для почты ===&lt;br /&gt;
:* Пытаюсь исправить проблемы с аутентификацией на моем почтовом сервере, и единственный обнаруженный способ – его настройка в Evolution. Есть ли другие пути, обходящиеся без создания записи в Evolution? '''Мэтью Саид [Matthew Saeed]'''&lt;br /&gt;
&lt;br /&gt;
Один из лучших способов протестировать множество различных сервисов, включая SMPTP SAUTH –использовать Telnet. Конечно, я не стал бы рекомендовать Telnet для обычного входа, но в качестве теста сервисов он неоценим. Для исправления вашей проблемы надо соединиться с почтовым сервером по порту 25 и зарегистрироваться, используя кодировку BASE64 (читайте об этом на [http://en.wikipedia.org/wiki/Base64 http://en.wikipedia.org/wiki/Base64]). Для начала расшифровка нескольких полезных строк, закодированных при помощи [www.dillfrog.com/tools/base-64_encode www.dillfrog.com/tools/base-64_encode]:&lt;br /&gt;
&lt;br /&gt;
*‘VXNlcm5hbWU6’ расшифровывается как ‘Username:’&lt;br /&gt;
*‘UGFzc3dvcmQ6’ расшифровывается как ‘Password:’&lt;br /&gt;
*‘dGVzdF9seGZAcmV6ZC5jby51a w==’ расшифровывается как ‘test_lxf@rezd.co.uk’&lt;br /&gt;
*‘Zm9vYmFy’ расшифровывается как ‘foobar’&lt;br /&gt;
&lt;br /&gt;
Следующие строки являются проверкой регистрации на сервере. Мы используем BASE64кодирование для нескольких строк описанных выше.&lt;br /&gt;
&lt;br /&gt;
Первое, соединимся при помощи Telnet к домену/IP адресу почтового сервера (т.е. mail.rezd.co.uk или 10.0.0.1) по порту 25:&lt;br /&gt;
&lt;br /&gt;
 telnet 10.0.0.1 25&lt;br /&gt;
&lt;br /&gt;
Сервер отвечает SMTP-приглашением (баннером):&lt;br /&gt;
&lt;br /&gt;
 Trying 10.0.0.1...&lt;br /&gt;
 Connected to mail.rezd.co.uk (10.0.0.1).&lt;br /&gt;
 Escape character is ‘^]’.&lt;br /&gt;
 220 mail.rezd.co.uk ESMTP&lt;br /&gt;
&lt;br /&gt;
Даем команду EHLO:&lt;br /&gt;
&lt;br /&gt;
 EHLO other.domain.rezd.org.uk&lt;br /&gt;
&lt;br /&gt;
Далее сервер сообщает, что именно он поддерживает (в этом почтовые сервера могут различаться).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
250-mail.rezd.co.uk Hello other. domain.rezd.&lt;br /&gt;
org.uk [192.168.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
LOGIN PLAIN&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на почтовом сервере:&lt;br /&gt;
&lt;br /&gt;
 AUTH LOGIN&lt;br /&gt;
&lt;br /&gt;
Он выдает запрос имени пользователя (username):&lt;br /&gt;
&lt;br /&gt;
 334 VXNlcm5hbWU6&lt;br /&gt;
&lt;br /&gt;
Теперь введем имя пользователя, под которым хотим зарегистрироваться, например, test_lxf@rezd.co.uk:&lt;br /&gt;
&lt;br /&gt;
 dGVzdF9seGZAcmV6ZC5jb20=&lt;br /&gt;
&lt;br /&gt;
Затем запрашивается пароль:&lt;br /&gt;
&lt;br /&gt;
 334 UGFzc3dvcmQ6&lt;br /&gt;
&lt;br /&gt;
Мы отвечаем:&lt;br /&gt;
&lt;br /&gt;
 Zm9vYmFy&lt;br /&gt;
&lt;br /&gt;
И, наконец, он говорит «да» (yes), то есть регистрация (authentication) работает:&lt;br /&gt;
&lt;br /&gt;
 235 2.0.0 OK Authenticated&lt;br /&gt;
&lt;br /&gt;
Если мы получаем следующее, то понимаем, что с регистрацией есть проблемы:&lt;br /&gt;
&lt;br /&gt;
 535 5.7.0 authentication failed&lt;br /&gt;
&lt;br /&gt;
Этого достаточно для тестирования регистрации; если мы хотим протестировать отправку писем, то мы должны продолжить SMTP-диалог. '''KK'''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Часто задаваемые вопросы о WPA&lt;br /&gt;
|Содержание=&lt;br /&gt;
* Что такое WPA?&lt;br /&gt;
*: WPA – потомок WEP с улучшенной безопасностью.&lt;br /&gt;
* Спасибо, конечно, но что это?&lt;br /&gt;
*: WPA (Wi-Fi Protected Access – Защищенный Wi-Fi доступ) – система обеспечения защиты передачи данных в беспроводных сетях.&lt;br /&gt;
* А оно мне нужно?&lt;br /&gt;
*: Почти наверняка – да. Беспроводные сети передают ваши данные на сотни метров во всех направлениях. Это означает, что кто угодно с ноутбуком и беспроводной картой может прочесть ваши данные так же легко, как при подсоединении к вашему сетевому хабу.&lt;br /&gt;
* Мой ноутбук даже не дотягивает до всех комнат моего дома, так что я в безопасности, разве нет?&lt;br /&gt;
*: Отнюдь! Хотя доступ вашего ноутбука ко внешним устройствам ограничен неким расстоянием, у другого оборудования это расстояние может быть куда больше. Добавив к вашей беспроводной карте антенну, вы охватите значительно большую площадь. Соответственно улучшенные системы могут перекрывать огромные области. Вам нечего бояться, если вы используете Wi-Fi только дома для выхода в сеть с вашего ноутбука, но если ваша фирма использует слабозащищенные (или не защищенные) беспроводные сети, то ваши конфиденциальные файлы могут читать прямо из машины на офисной парковке.&lt;br /&gt;
* Раз уж вы упомянули: что такое WEP?&lt;br /&gt;
*: WEP – Wired Equivalent Privacy (Эквивалент проводной безопасности), предыдущая попытка защитить беспроводные сети. WEP лучше, чем ничего, но взломать его нетрудно. Он может не допустить вашего соседа к вашему компьютеру, если тот случайно подсоединится к вашей точке доступа вместо своей (так я и узнал, что мой сосед использует небезопасную сеть), но не сможет остановить взломщика.&lt;br /&gt;
* Какое оборудование использует WPA?&lt;br /&gt;
*: Все новые беспроводные сетевые карты и точки доступа поддерживают как WPA, так и WEP. Если у вас старое устройство, может оказаться, что оно поддерживает только WEP.&lt;br /&gt;
* А как насчет программ?&lt;br /&gt;
*: Вам необходима двухуровневая поддержка WPA на уровне драйвера устройства (большинство драйверов ее уже имеют) и программа, реализующая WPA. Наиболее популярна wpa_supplicant, она должна поставляться с вашим дистрибутивом и доступна по адресу [http://hostap.epitest.fi/wpa_supplicant http://hostap.epitest.fi/wpa_supplicant]. Это программа, управляющая согласованием ключей и аутентификацией.&lt;br /&gt;
* Я полагаю, чтобы использовать WPA в Linux, я должен прочесть man-страницы и HOWTO, а также отредактировать файлы конфигурации?&lt;br /&gt;
*: Вы, конечно, можете сделать это, если ладите с Vim. Однако существуют графические инструменты настройки, облегчающие жизнь. Самый продвинутый из них – вероятно, NetworkManager из Gnome ([http://www.gnome.org/projects/NetworkManager www.gnome.org/projects/NetworkManager]). Он включен в последние дистрибутивы, например, Fedora Core 5 и SUSE 10.1. Пользователи KDE могут предпочесть KWlan ([http://www.kde-apps.org/content/show.php?content=37041 www.kde-apps.org/content/show.php?content=37041]) [или KNetworkManager: [http://en.opensuse.org/Projects/KNetworkManager http://en.opensuse.org/Projects/KNetworkManager], – прим. ред.].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Краткая справка: компиляция приложений&lt;br /&gt;
|Содержание=&lt;br /&gt;
Большинство дистрибутивов имеют большие репозитории программ, содержащие готовые пакеты практически на все случаи жизни, но иногда необходимо собрать пакет из исходных текстов. Обычная причина – отсутствие обновленного (или полное отсутствие) пакета для вашего дистрибутива, или необходимость исправить исходный код, добавив функцию или убрав ошибку. Поддержать систему в актуальном состоянии помогает менеджер пакетов вашего дистрибутива, но если вам необходимо собрать пакет из исходных текстов, то процесс милосердно прост.&lt;br /&gt;
&lt;br /&gt;
Во-первых, распакуйте архив с исходными текстами (tarball) одной из двух команд:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar xvzf foo-1.2.3.tar.gz&lt;br /&gt;
tar xvjf foo-1.2.3.tar.bz2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поздние версии tar могут определить чем был создан архив (gzip или bzip2), так что аргументы z или j можно опустить. Исходные тексты обычно распаковываются в папку с именем, совпадающим с названием архива; после выполнения команд введите cd foo-1.2.3. Найдите файлы с именами README или INSTALL и прочтите их – обычно там находится инструкция по установке. Стандартная процедура такова:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
su -c “make install”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая команда проверяет вашу систему, убеждаясь в соблюдении всех зависимостей и установке оптимальных параметров для программы. Неплохо сначала выполнить команду ./configure --help, чтобы увидеть имеющиеся опции.&lt;br /&gt;
&lt;br /&gt;
Вторая команда компилирует приложение, помещая созданные файлы в текущий каталог. Для конфигурирования и компиляции права root не нужны, но третья стадия – это копирование скомпилированных файлов в системные подкаталоги, а потому требует прав root. Вот почему мы используем su для выполнения только этой команды от имени root. Пользователи Ubuntu должны использовать вместо нее команду&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы не указывали для ./configure путь, то по умолчанию скомпилированная программа устанавливается в /usr/local/bin. Если вы работаете в RPM-системе, а configure сообщает, что не найдена библиотека, хотя вы точно знаете, что она есть – установите соответствующий библиотеке пакет -devel, т.е. libbar-devel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Ответы]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF83:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-26T08:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Врезка&lt;br /&gt;
|Заголовок= Наши эксперты&lt;br /&gt;
|Содержание=Наши эксперты найдут ответ на самый трудный ваш вопрос. Если у вас проблемы с установкой, настройкой модема, сетью или еще чем-нибудь – просто напишите нам, а обо всем остальном мы позаботимся.&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{!}}[[Изображение:img_83_106_1.jpg|thumb|Владея Интернет провайдером, а заодно подрабатывая редактором дисков для LXF, Нейл Ботвик скромно зовет себя мастером на все руки.]]&lt;br /&gt;
{{!}}[[Изображение:img_83_106_2.jpg|thumb|Для административных вопросов: Кингс Коблер является системным инженером и администратором Linux в Rackspace, и использует Linux 10 лет.]]&lt;br /&gt;
{{!}}}&lt;br /&gt;
|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
=== Fedora без сети ===&lt;br /&gt;
:* Я установил Fedora Core 5, и все вроде прекрасно, кроме одного. Когда я пытаюсь выполнить Add/Remove Programs (Добавить/Удалить программы) или Packager Updater (Обновление пакетов), у меня запрашивается пароль root. Затем я получаю сообщение об ошибке: «Не могу получить информацию о приложении» или «Не могу получить информацию об обновлении». Единственным отступлением от стандартной установки является отказ от Logical Volume Manager; вместо этого я вручную разбил диск на /boot (100 MБ), / (38 ГБ) и swap (1024 МБ). Да еще мой ПК не подключен к Интернету. Я пытался установить и с CD, и с вашего DVD приложения. Но получаю те же ошибки. '''Альфред Мифсуд [Alfred Mifsud]'''&lt;br /&gt;
&lt;br /&gt;
Отсутствие Интернет-соединения и есть причина этих сообщений. Обе программы при работе пытаются прочитать информацию из online-репозитория программ. В случае Software Updater это неизбежно: по самой своей природе обновления новее пакетов на установочных носителях, так что без соединения с Интернетом не обойтись.&lt;br /&gt;
&lt;br /&gt;
Во избежание этой ошибки с Add/Remove Programs, вам нужно отредактировать файлы репозитория: отключить все online-источники и добавить DVD. Делается это из-под root. Загрузите /etc/yum.repos.d/fedora-core.repo в ваш любимый текстовый редактор, найдите начало раздела [core] и закомментируйте строки baseurl и mirrorlist, поместив в начало каждой строки #. Затем добавьте новую строку вида&lt;br /&gt;
&lt;br /&gt;
 baseurl=file:///media/disk&lt;br /&gt;
&lt;br /&gt;
Создастся новый репозиторий на /media/disk, где смонтирован DVD. Затем вам следует отредактировать другие .repo-файлы и изменить все вхождения enabled=1 на enabled=0. Теперь единственный активный репозиторий – это DVD, и запуск Add/Remove Software должен позволить вам установить приложения с диска. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Черепашья почта ===&lt;br /&gt;
:* Мой почтовый сервер на основе Qmail отправляет почту с большой задержкой. Я пытался ускорять его, но ничего не вышло. Не могли бы вы перечислить, что может вызывать задержку? '''Т.Мэтьюс [T Matthews]'''&lt;br /&gt;
&lt;br /&gt;
Наиболее вероятная причина задержек – запросы DNS. Первое и главное, убедитесь, что имя сервера нормально разрешается. Кроме того, для IP-адреса, используемого сервером для отправки почты, должна быть создана PTR-запись. Вы также можете ускорить запросы, запустив собственный локальный кэширующий сервер имен.&lt;br /&gt;
&lt;br /&gt;
Также можно отключить DNS-запросы вообще. Если вы запускаете qmail-smtpd через tcpserver, то добавьте в его опции флаг -H, чтобы он не искал имена хостов в DNS, и удалите переменную среды $TCPREMOTEHOST. Во избежание зацикливания вы должны использовать эту опцию для серверов по TCP-порту 53. Если это не так, то вы, вероятно, запускаете его через inetd/xinetd; и можете добавить в конфигурацию флаг -Rt0, в пункте server_args конфигурационного файла вашего inetd/xinetd. Это запретит Qmail выполнять запросы ident при установлении SMTP-соединения. Проделанные действия проявляют себя в задержке между установлением TCP-соединения и появлением приглашения.&lt;br /&gt;
&lt;br /&gt;
А если ваша очередь постоянно переполняется, можете добавить файл '''/var/qmail/control/queuelifetime''' и установить в нем срок менее семи дней (срок по умолчанию, означающий, что попытки отправки всех поступающих писем будут повторяться в течение недели). Одного или двух дней вполне хватит. Эти шаги должны снизить время, необходимое Qmail для отображения приглашения. '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Реаниматор ===&lt;br /&gt;
:* Мой друг владеет маленькой юридической фирмой (шесть пользователей, использующих Windows XP Pro, Linux proxy/mail сервер). Они часто портят компьютеры, и он зовет меня чинить их. Обычно это означает резервирование всех документов, сохраненных где попало, и переустановку Windows.&lt;br /&gt;
&lt;br /&gt;
:Поэтому я пытаюсь найти и установить полностью автоматизированную систему на базе Linux для восстановления после сбоев, которая бы производила резервирование после каждой установки (типа Ghost или G4L) и еженощно резервировала бы каждую рабочую станцию, чтобы, если кто-то навредил, нужно было только загрузиться с другого компьютера в сети или с CD и восстановить систему из образов с backup-сервера. '''Кристос Иоанну [Christos Ioannou]'''&lt;br /&gt;
&lt;br /&gt;
Здесь две отдельных проблемы. Первая – это создание резервной копии на CD или в сети, чтобы полностью переустановить систему в серьезном случае. Вторая – регулярное резервирование данных.&lt;br /&gt;
&lt;br /&gt;
Вы не ошибетесь, если для первого пути выберите Partition Image – [http://www.partimage.org www.partimage.org]. Это Linux-программа, имеющая клиент-серверные функции. Вы можете запустить сервер на вашем Linux-компьютере и использовать Live CD для создания образов дисков каждой Windows-машины. Вам понадобится Live-CD дистрибутив, который можно будет использовать для восстановления диска из файл-образа на сервере. RIP (Recovery Is Possible [«восстановление возможно»; также Rest In Peace – покойся с миром – надпись на надгробье; см. стр. 48 – прим. ред.]) вполне подойдет ([http://www.tux.org/pub/people/kent-robotti/looplinux/rip www.tux.org/pub/people/kent-robotti/looplinux/rip]). Документация содержит детальные инструкции изменения CD-образа под ваши нужды; вы можете добавить небольшой скрипт командной оболочки и вызвать его из /etc/rc.d/rc.local, чтобы автоматизировать полное восстановление системы при загрузке с CD.&lt;br /&gt;
&lt;br /&gt;
Для ночного инкрементного резервирования хорошим выбором будет BackupPC ([http://backuppc.sourceforge.net http://backuppc.sourceforge.net]). Она запускается на Linux сервере и не требует специального ПО, установленного на Windows ПК, т.к. доступ к нему осуществляет Samba. Нужно только настроить на ПК совместное использование, чтобы BackupPC смог заполучить файлы. Вся работа выполняется на Linux-машине, так что ночным резервированием сможет управлять простое задание Cron. BackupPC обладает web-интерфейсом, и пользователям не придется учить загадочные команды для восстановления файлов из резервной копии.&lt;br /&gt;
&lt;br /&gt;
Эта программа особенно хороша при резервировании некоторого числа схожих ПК, поскольку хранит одну копию файла, находящегося на нескольких компьютерах. Вместе со сжатием это значительно уменьшает требуемое пространство для резервирования узлов сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Захват экрана ===&lt;br /&gt;
:* Ищу приложение, которое бы записывало все, что я делаю на машине, в небольшой фильм. Можете ли вы что-то порекомендовать? '''Мак-Скрафф [McScruff]''', с форума&lt;br /&gt;
&lt;br /&gt;
Для этого существует множество решений, в зависимости от предназначения фильма. Если вы хотите опубликовать его в Интернете, лучшим выбором будет Vnc2swf. Она записывает VNC-сессию как Flash-анимацию. Вам нужно будет установить VNC (или Tightvnc с [http://www.tightvnc.com www.tightvnc.com]). VNC создан для удаленного рабочего стола, но вы также можете использовать его на одном компьютере. Запустите VNC-сессию&lt;br /&gt;
&lt;br /&gt;
 vncserver -depth 16 -geometry 800x600&lt;br /&gt;
&lt;br /&gt;
и увидите строку вида:&lt;br /&gt;
&lt;br /&gt;
 New ‘X’ desktop is yourhostname:N&lt;br /&gt;
&lt;br /&gt;
Последняя часть – имя хоста (yourhostname) и номер дисплея. Если ваш компьютер не подключен к сети, можете использовать localhost. Теперь начните сессию командой&lt;br /&gt;
&lt;br /&gt;
 vnc2swf -startrecording -geometry 800x600 -depth 16 -framerate 5 demo.swf yourhostname:N.0&lt;br /&gt;
&lt;br /&gt;
Убедитесь, что разрешение (geometry), глубина цвета (depth), имя хоста (yourhostname) и дисплей соответствуют только что запущенному вами VNC-серверу. '''.0''' в конце обязателен. Появится новое окно, содержащее рабочий стол VNC-сессии, и все, что вы будете делать в нем, запишется в demo.swf. Завершите запись, закрыв это окно. Программа выведет некоторый HTML-код для просмотра Flash-анимации в web-браузере, который вы при желании можете перенаправить в файл. Размер и количество кадров определяется web-браузером, но для вывода демонстрации локально на монитор или проектор вы можете захотеть увеличить и то и другое.&lt;br /&gt;
&lt;br /&gt;
Для генерации фильма можете использовать Vncrec. Работает она по той же схеме, что и Vnc2swf, но создает файл в своем собственном формате, который вы может перекодировать в AVI или MPEG при помощи transcode.&lt;br /&gt;
&lt;br /&gt;
 vncrec -record demo.vnc&lt;br /&gt;
 transcode -x vnc --use_rgb -y xvid - k --dvd_access_delay 5 -f 10 -i demo.vnc -o demo.avi&lt;br /&gt;
&lt;br /&gt;
Используемое разрешение опять-таки должно совпадать с разрешением, в котором запущен сервер. Ключ -f устанавливает количество кадров в секунду для видео. Получившийся файл может быть просмотрен в любом видеопроигрывателе, например, MPlayer или Xine.&lt;br /&gt;
&lt;br /&gt;
Какое бы записывающее приложение вы ни выбрали, если вы хотите, чтобы в начале записи запускалась некоторая программа, то пропишите ее в ~/.vnc/xstartup:&lt;br /&gt;
&lt;br /&gt;
 ooimpress sample.pps&lt;br /&gt;
&lt;br /&gt;
Другая возможность – Istanbul с [http://live.gnome.org/Istanbul http://live.gnome.org/Istanbul]. Это программа для Gnome, но работает и на других рабочих столах. Она помещает иконку на панели: нажмите ее для начала записи, а повторное нажатие остановит запись. Результат сохраняется под именем ~/desktop-recording.ogg, в формате Theora. Она может показаться примитивной по сравнению с альтернативами, но настраивается быстро и легко. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Лишенец прав! ===&lt;br /&gt;
:* Я недавно перешел с Xandros на Fedora Core 5. Я перекачал 3 ГБ данных и обнаружил, что все файлы в моем домашнем каталоге имеют владельца и принадлежат к группе root. Есть ли скрипт, который поможет мне изменить права доступа на мое имя пользователя? '''Д.Ригли [D Wrigley]'''&lt;br /&gt;
&lt;br /&gt;
Если вы скопировали свой домашний каталог (к примеру, /home/dave) с одной машины на другую, наилегчайший способ восстановить владельца в этом каталоге – рекурсивно выполнить chown от имени root в /home/dave с корректными именем и группой владельца. Это можно безопасно сделать в вашем домашнем каталоге, поскольку он обычно содержит только файлы и каталоги, принадлежащие пользователю и группе пользователя, к которому относится этот каталог.&lt;br /&gt;
&lt;br /&gt;
 chown -R macdaddy:macdaddy /home/macdaddy&lt;br /&gt;
&lt;br /&gt;
Если у вас много файлов и каталогов, принадлежащих другим пользователям и группам, необходимо выполнить поиск с заменой. Так что если пользователь ‘dave’ имеет множество файлов и каталогов в '''/var/www/html''' и вы хотите сменить владельца этих файлов на пользователя и группу ‘bigmac’, следует применить chown -R для смены владельца каталогов. Беда в том, что заодно поменяют владельца и те файлы, которые вам трогать не хотелось. Чтобы каталоги, не принадлежащие Dave, остались без изменений, для поиска и смены владельца используйте команду find,:&lt;br /&gt;
&lt;br /&gt;
 find /var/www/html -user dave -group dave -exec chown bigmac:bigmac {} \;&lt;br /&gt;
&lt;br /&gt;
Эта команда найдет любой каталог или файл в /var/www/html, принадлежащий пользователю и группе dave, а затем сменит владельца на bigmac. {} указано для замены найденных файлов, соответствующих критериям -user и -group, а \; необходимо во избежание интерпретации ; командной оболочкой, и чтобы сообщить find, что список параметров закончился.&lt;br /&gt;
&lt;br /&gt;
Итак, для стандартных домашних каталогов наилегчайший способ сменить владельца единовременно – использовать команду chown -R. Помните, что этот метод применим не во всех частях файловой системы! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Пропал Thunderbird ===&lt;br /&gt;
:* Щелкая на email-адресе в KDE, я получаю ошибку: ‘Kdeinit can not start /usr/share/application/Thunderbird/Thunderbird’. Thunderbird установлен в /opt/Thunderbird. Был у меня SUSE, но в сейчас я использую Gentoo, и когда я переносил каталог /home, вероятно, что-то затер в Kdeinit, но не могу понять что. Не могли бы вы сказать мне, как сделать, чтобы Kdeinit искал в нужном месте? '''Стюарт [Stewart]'''&lt;br /&gt;
&lt;br /&gt;
Похоже, что KDE не там ищет Thunderbird. Как и большинство опций KDE, вы можете изменить это в Центре управления KDE; хотя найти нужное место в Центре Управления трудно – там столько всего, и не всегда там, где вы ожидаете увидеть. Центр Управления содержит функцию поиска, которая обычно помогает, но не в этом случае (по крайней мере не в KDE 3.5.3). Нужная вам опция находится в Компоненты &amp;gt; Выбор Компонентов &amp;gt; Email-клиент. Выберите радиокнопку Использовать другой Email-клиент, затем щелкните на маленькой иконке справа от строки ввода чтобы открыть окно выбора приложения. Выбрав программу таким образом, вы установите верный путь.&lt;br /&gt;
&lt;br /&gt;
Thunderbird откроется, но без адреса получателя или любой другой информации. Чтобы исправить это, добавьте следующее в строку запуска Thunderbird:&lt;br /&gt;
&lt;br /&gt;
 -compose “mailto:%t?subject=%s&amp;amp; body=%B”&lt;br /&gt;
&lt;br /&gt;
Задержите курсор мыши над строкой ввода, чтобы увидеть доступные опции. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Спутанные карты ===&lt;br /&gt;
:* Только что установил Fedora Core 5, и слегка в недоумении: какая из моих сетевых карт работает. У меня их две, и при предыдущих установках по умолчанию использовалась eth0. Вот результат выполнения ifconfig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0 Link encap:Ethernet HWaddr 00:30:18:58:4A:A3&lt;br /&gt;
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
UP BROADCAST MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
eth1 Link encap:Ethernet HWaddr 00:50:BA:B3:B1:A5&lt;br /&gt;
inet addr:192.168.1.152 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::250:baff:feb3: b1a5/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:258479 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:264885 errors:0 dropped:0 overruns:13 carrier:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
: Мне кажется, что при работе в сети весь трафик идет через eth1. Можете ли вы пролить свет на это? '''pk_fox'''&lt;br /&gt;
&lt;br /&gt;
Вы используете DHCP на обеих сетевых картах? Если да, то вот что скорее всего происходит:&lt;br /&gt;
# Обнаруживается первая сетевая карта (NIC) и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
# Определяется вторая NIC и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
&lt;br /&gt;
Четвертый шаг переписывает шлюз по умолчанию в таблице маршрутизации, забивая установки, сделанные на втором шаге. Вы можете проверить это, выполнив&lt;br /&gt;
&lt;br /&gt;
 route -n&lt;br /&gt;
&lt;br /&gt;
Строка, показывающая расположение 0.0.0.0, завершается интерфейсом, используемым по умолчанию. Есть ли причина, по которой вы используете две NIC? Если да, то вам, видимо, придется настроить шлюз по умолчанию вручную. Или же отключите опцию activate device when computer starts для одной из NIC в программе настройки сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Сам себе браузер? ===&lt;br /&gt;
:* Я управляю сервисом хостинга, на нем более 100 доменов. Последние несколько дней стало казаться, что наш сервер тормозит. Я выполнил несколько предварительных тестов (используя netstat) и обнаружил множество соединений с моего сервера по TCP-порту 80 к моему серверу по временным портам. Из полученных результатов я понял, что имеются соединения от Apache по порту 80 к другим портам моего сервера. Но почему? Как мой сервер может просматривать мои собственные web-сайты? Используется Apache 2 под Red Hat Enterprise Linux 3. '''Джон [John]'''&lt;br /&gt;
&lt;br /&gt;
Весьма похоже, что это поведение спровоцировал один из ваших новых web-сайтов. Из описанного вами отчета netstat я делаю вывод, что некий код вызывает соединения с вашим сервером. Проанализировав деятельность сервера Apache, мы можем сравнить число netstat-соединений с обслуживаемыми Apache. Для этого поместим следующее в конфигурационный файл Apache (/etc/httpd/conf/httpd.conf):&lt;br /&gt;
&lt;br /&gt;
 ExtendedStatus on&lt;br /&gt;
 &amp;lt;Location /server-status&amp;gt;&lt;br /&gt;
  SetHandler server-status&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы откроете страницу www.domain.com/server-status?refresh=5, то статус вашего сервера будет обновляться раз в пять секунд. Уделите особое внимание загруженности процессора и числу секунд с начала нового запроса (SS). Также, сравнивая число соединений выдаваемых netstat с числом соединений на отдельном виртуальном хосте, вы быстро найдете виновника! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Саботаж Sendmail ===&lt;br /&gt;
:* Я создаю сервер для размещения управляющего ПО нашей лаборатории (я написал его на PHP, благодаря урокам в LXF!). Установил сервер Kubuntu с Sendmail – и начались проблемы.&lt;br /&gt;
&lt;br /&gt;
:Я выполнил простую настройку Sendmail, оставив все как есть, поскольку почти ничего не понимаю в настройке Sendmail! Он отправляет почту людям в локальной сети (например, john@localnet.co.uk), но во внешний мир ничего не исходит (например, на john@hotmail.com). Был бы очень благодарен за совет – а может, и за учебник по установке почтового сервера? '''Джон Клейтон [John Clayton]'''&lt;br /&gt;
&lt;br /&gt;
Sendmail – не лучший выбор для вас. Это несомненно мощный почтовый сервер, но, увы, трудно настраиваемый. Postfix или Exim больше подойдут вам, они оба доступны через репозиторий Ubuntu (Postfix – стандартный почтовый сервер и находится на установочных дисках Ubuntu). Эти сервера отлично документированы, файлы настроек имеют обычный текстовый формат, и изучить их настройки проще, чем продираться сквозь множество опций настройки Sendmail.&lt;br /&gt;
&lt;br /&gt;
Какой бы сервер вы ни выбрали, вам следует настраивать его через Webmin, он предоставляет опции в дружественной графической оболочке и позволяет избежать ошибок конфигурирования сервера, приводящих к потере почты или снижению безопасности. При желании вы также сможете читать или подстраивать файлы настроек вручную – Webmin помогает изучать опции настройки, а не прячет их.&lt;br /&gt;
&lt;br /&gt;
Для любого выбранного сервера, файлы журналов (log-файлы) предоставят причину сбоя. Выполните&lt;br /&gt;
&lt;br /&gt;
 tail -f /path/to/logfile&lt;br /&gt;
&lt;br /&gt;
и попытайтесь отправить почту во внешний мир. Вы увидите сообщение об ошибке, соответствующее сбою: варианты – от сбоя DNS (хотя это маловероятно, т.к. Интернет вообще-то работает) до блокирования исходящего SMTP-трафика вашим провайдером. Многие провайдеры делают это в качестве противоспамной меры: или перенаправляют весь SMTP-трафик на собственный почтовый сервер, или блокируют вообще. Если это так, вам необходимо настроить ваш почтовый сервер на использование сервера вашего провайдера как ‘smarthost’, тогда вся почта не для вашей локальной сети будет отсылаться через тот сервер. Для этого в Sendmail поместите в Sendmail.cf следующее:&lt;br /&gt;
&lt;br /&gt;
 DSmail.isp.com&lt;br /&gt;
&lt;br /&gt;
заместив mail.isp.com SMTP-сервером провайдера. Для Postfix такая строка&lt;br /&gt;
&lt;br /&gt;
 relayhost = mail.isp.com&lt;br /&gt;
&lt;br /&gt;
Если вы используете Webmin, это первая опция в модуле Sendmail и четвертая в модуле Postfix. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Damn-ГРУБиян ===&lt;br /&gt;
:* На моем ПК много разделов, и установлено несколько дистрибутивов Linux, хочу поиграть с ними, прежде чем остановиться на одном. Мой загрузчик – XOSL, и со многими дистрибутивами он работает прекрасно, включая штуку из Редмонда! Но он серьезно слетел после дистрибутива Damn Small Linux с [[LXF80]]. Скрипт установки DSL на жесткий диск не предоставляет выбора места размещения загрузчика Lilo или Grub – он всегда пишет его прямо в главную загрузочную запись (MBR), туда же, где размещается XOSL! Поэтому, когда я восстанавливаю XOSL, он находит все остальные дистрибутивы, но не DSL. Или ПК загружается только в DSL. Они не работают вместе.&lt;br /&gt;
&lt;br /&gt;
:Не могли бы вы объяснить на уровне начинающего: как настроить загрузку (Lilo или Grub) на разделе, где установлен DSL, чтобы XOSL смог найти и запустить его? '''Джефф [Jeff]'''&lt;br /&gt;
&lt;br /&gt;
Установить Grub на раздел вместо MBR просто, и позор, что DSL не предоставляет такой возможности. Предположим для примера, что DSL установлен на /dev/hda5. Загрузитесь в DSL, откройте root-терминал и выполните Grub. Вы перенесетесь в командую оболочку Grub, где следует набрать&lt;br /&gt;
&lt;br /&gt;
 root (hd0,4)&lt;br /&gt;
 setup (hd0,4)&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
Grub начинает счет с нуля, поэтому первый диск, пятый раздел (hda5 в терминологии Linux) – это hd0,4. Теперь загрузчик DSL установлен в разделе, и вы можете велеть XOSL загружаться с этого раздела. Когда XOSL загрузит DSL, вы перенесетесь в меню Grub – возможно, и зря, поскольку вы уже выбрали, какую ОС загружать. Избавиться от этого можно, отредактировав /boot/Grub/menu.lst и изменив время ожидания с 15 на 0. Если вы хотите сохранить выбор опций DSL, представленных в меню Grub, измените время на меньшее, но ненулевое значение. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Медленно и узко ===&lt;br /&gt;
:* Пытаюсь найти широкополосного провайдера с разумными ценами, имеющего дело с Linux. Поискал высокоскоростное телефонное соединение под Linux, но не достиг успеха. Поэтому я исследовал статистику загрузки под различными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
:Fedora Core 5 оказалась в самом низу с пиком в 1,8 КБ/с и средним около 0,7. Fedora 4 и SUSE достигли максимума 3 КБ/с при средней скорости загрузки 1,5 КБ/с. Knoppix 4 не многим лучше. В Xandros 3 получилось 4 КБ при среднем около 2 КБ. Лучше всех Mandriva 10.1 (использовались Mozilla и Epiphany), с пиком около 13 КБ/с и средним около 6 КБ/с.&lt;br /&gt;
&lt;br /&gt;
:Данные получены для различных соединений в различное время, но результаты вполне согласуются – они все работают плохо около 19:00 и 10:00 и все показали лучший результат в воскресенье утром. Я использую внешний COM-модем 56K. Есть идеи, как получить двузначную цифру скорости? '''Крис Марсден [Chris Marsden]'''&lt;br /&gt;
&lt;br /&gt;
:PS А также, идеи о сети из двух Linux-компьютеров с двумя разными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
В Великобритании есть два провайдера, специализирующихся на пользователях Linux: UKLinux.net и UK Free Software Network ([http://www.ukfsn.org www.ukfsn.org]). Оба предоставляют как ADSL, так и телефонное соединение. Ваши проблемы со скоростью действительно выглядят слегка странными, но сделать выводы трудно, поскольку вы сообщили очень мало информации – даже не указали марку модема.&lt;br /&gt;
&lt;br /&gt;
Было бы интересно сравнить настройки модема в каждом из дистрибутивов. Использование браузера для измерения скорости закачки – не самый надежный тест, на него влияет множество факторов, включая прокси-сервер провайдера. Лучшим тестом будет попытка загрузить файл через wget. Попробуйте в каждом дистрибутиве команду:&lt;br /&gt;
 &lt;br /&gt;
 wget ftp://ftp.mirrorservice.org/sites/ ftp.kde.org/pub/kde/stable/3.5.2/src/ kdeaddons-3.5.2.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Любой файл с FTP-сервера в Великобритании сойдет для теста. Вы не сможете получить двузначную цифру с 56К-модемом, если только не загружаете сжимаемые данные, например, группы новостей или web-страницы (но не картинки). Лучшее, на что вы можете рассчитывать со сжатыми данными вроде указанного выше файла или картинки – это около 7 КБ/с. Сжатые файлы дают истинную оценку качества связи.&lt;br /&gt;
&lt;br /&gt;
Указанные вами времена интересны; 19-00 – это пик использования Интернета в Великобритании (сами решайте, web или Emmerdale), тогда как утром в воскресенье отмечается спад. Стоит также попросить BT протестировать вашу линию. Даже если они скажут, что все в порядке, сам факт тестирования часто способствует улучшению.&lt;br /&gt;
&lt;br /&gt;
При использовании провайдера с поддержкой Linux вы вправе получить такую поддержку. Я бы предложил использовать телефонный доступ через UKFSN (это окупается) и попросить обоих провайдеров помочь со скоростью соединения. Кто окажется полезнее, того и делайте вашим широкополосным партнером.&lt;br /&gt;
&lt;br /&gt;
Что до вашего вопроса о соединении в сеть двух компьютеров с разными дистрибутивами, то это все равно, что два компьютера с одним и тем же вариантом Linux. Хотя инструменты настройки могут различаться, большинство дистрибутивов в принципе схожи. NFS, HTTP, Samba, практически все, что вы хотите использовать для организации сети, работает одинаково во всех дистрибутивах. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Вопрос-Победитель&lt;br /&gt;
|Содержание=&lt;br /&gt;
=== Эволюция для почты ===&lt;br /&gt;
:* Пытаюсь исправить проблемы с аутентификацией на моем почтовом сервере, и единственный обнаруженный способ – его настройка в Evolution. Есть ли другие пути, обходящиеся без создания записи в Evolution? '''Мэтью Саид [Matthew Saeed]'''&lt;br /&gt;
&lt;br /&gt;
Один из лучших способов протестировать множество различных сервисов, включая SMPTP SAUTH –использовать Telnet. Конечно, я не стал бы рекомендовать Telnet для обычного входа, но в качестве теста сервисов он неоценим. Для исправления вашей проблемы надо соединиться с почтовым сервером по порту 25 и зарегистрироваться, используя кодировку BASE64 (читайте об этом на [http://en.wikipedia.org/wiki/Base64 http://en.wikipedia.org/wiki/Base64]). Для начала расшифровка нескольких полезных строк, закодированных при помощи [www.dillfrog.com/tools/base-64_encode www.dillfrog.com/tools/base-64_encode]:&lt;br /&gt;
&lt;br /&gt;
*‘VXNlcm5hbWU6’ расшифровывается как ‘Username:’&lt;br /&gt;
*‘UGFzc3dvcmQ6’ расшифровывается как ‘Password:’&lt;br /&gt;
*‘dGVzdF9seGZAcmV6ZC5jby51a w==’ расшифровывается как ‘test_lxf@rezd.co.uk’&lt;br /&gt;
*‘Zm9vYmFy’ расшифровывается как ‘foobar’&lt;br /&gt;
&lt;br /&gt;
Следующие строки являются проверкой регистрации на сервере. Мы используем BASE64кодирование для нескольких строк описанных выше.&lt;br /&gt;
&lt;br /&gt;
Первое, соединимся при помощи Telnet к домену/IP адресу почтового сервера (т.е. mail.rezd.co.uk или 10.0.0.1) по порту 25:&lt;br /&gt;
&lt;br /&gt;
 telnet 10.0.0.1 25&lt;br /&gt;
&lt;br /&gt;
Сервер отвечает SMTP-приглашением (баннером):&lt;br /&gt;
&lt;br /&gt;
 Trying 10.0.0.1...&lt;br /&gt;
 Connected to mail.rezd.co.uk (10.0.0.1).&lt;br /&gt;
 Escape character is ‘^]’.&lt;br /&gt;
 220 mail.rezd.co.uk ESMTP&lt;br /&gt;
&lt;br /&gt;
Даем команду EHLO:&lt;br /&gt;
&lt;br /&gt;
 EHLO other.domain.rezd.org.uk&lt;br /&gt;
&lt;br /&gt;
Далее сервер сообщает, что именно он поддерживает (в этом почтовые сервера могут различаться).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
250-mail.rezd.co.uk Hello other. domain.rezd.&lt;br /&gt;
org.uk [192.168.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
LOGIN PLAIN&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на почтовом сервере:&lt;br /&gt;
&lt;br /&gt;
 AUTH LOGIN&lt;br /&gt;
&lt;br /&gt;
Он выдает запрос имени пользователя (username):&lt;br /&gt;
&lt;br /&gt;
 334 VXNlcm5hbWU6&lt;br /&gt;
&lt;br /&gt;
Теперь введем имя пользователя, под которым хотим зарегистрироваться, например, test_lxf@rezd.co.uk:&lt;br /&gt;
&lt;br /&gt;
 dGVzdF9seGZAcmV6ZC5jb20=&lt;br /&gt;
&lt;br /&gt;
Затем запрашивается пароль:&lt;br /&gt;
&lt;br /&gt;
 334 UGFzc3dvcmQ6&lt;br /&gt;
&lt;br /&gt;
Мы отвечаем:&lt;br /&gt;
&lt;br /&gt;
 Zm9vYmFy&lt;br /&gt;
&lt;br /&gt;
И, наконец, он говорит «да» (yes), то есть регистрация (authentication) работает:&lt;br /&gt;
&lt;br /&gt;
 235 2.0.0 OK Authenticated&lt;br /&gt;
&lt;br /&gt;
Если мы получаем следующее, то понимаем, что с регистрацией есть проблемы:&lt;br /&gt;
&lt;br /&gt;
 535 5.7.0 authentication failed&lt;br /&gt;
&lt;br /&gt;
Этого достаточно для тестирования регистрации; если мы хотим протестировать отправку писем, то мы должны продолжить SMTP-диалог. '''KK'''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Часто задаваемые вопросы о WPA&lt;br /&gt;
|Содержание=&lt;br /&gt;
* Что такое WPA?&lt;br /&gt;
*: WPA – потомок WEP с улучшенной безопасностью.&lt;br /&gt;
* Спасибо, конечно, но что это?&lt;br /&gt;
*: WPA (Wi-Fi Protected Access – Защищенный Wi-Fi доступ) – система обеспечения защиты передачи данных в беспроводных сетях.&lt;br /&gt;
* А оно мне нужно?&lt;br /&gt;
*: Почти наверняка – да. Беспроводные сети передают ваши данные на сотни метров во всех направлениях. Это означает, что кто угодно с ноутбуком и беспроводной картой может прочесть ваши данные так же легко, как при подсоединении к вашему сетевому хабу.&lt;br /&gt;
* Мой ноутбук даже не дотягивает до всех комнат моего дома, так что я в безопасности, разве нет?&lt;br /&gt;
*: Отнюдь! Хотя доступ вашего ноутбука ко внешним устройствам ограничен неким расстоянием, у другого оборудования это расстояние может быть куда больше. Добавив к вашей беспроводной карте антенну, вы охватите значительно большую площадь. Соответственно улучшенные системы могут перекрывать огромные области. Вам нечего бояться, если вы используете Wi-Fi только дома для выхода в сеть с вашего ноутбука, но если ваша фирма использует слабозащищенные (или не защищенные) беспроводные сети, то ваши конфиденциальные файлы могут читать прямо из машины на офисной парковке.&lt;br /&gt;
* Раз уж вы упомянули: что такое WEP?&lt;br /&gt;
*: WEP – Wired Equivalent Privacy (Эквивалент проводной безопасности), предыдущая попытка защитить беспроводные сети. WEP лучше, чем ничего, но взломать его нетрудно. Он может не допустить вашего соседа к вашему компьютеру, если тот случайно подсоединится к вашей точке доступа вместо своей (так я и узнал, что мой сосед использует небезопасную сеть), но не сможет остановить взломщика.&lt;br /&gt;
* Какое оборудование использует WPA?&lt;br /&gt;
*: Все новые беспроводные сетевые карты и точки доступа поддерживают как WPA, так и WEP. Если у вас старое устройство, может оказаться, что оно поддерживает только WEP.&lt;br /&gt;
* А как насчет программ?&lt;br /&gt;
*: Вам необходима двухуровневая поддержка WPA на уровне драйвера устройства (большинство драйверов ее уже имеют) и программа, реализующая WPA. Наиболее популярна wpa_supplicant, она должна поставляться с вашим дистрибутивом и доступна по адресу [http://hostap.epitest.fi/wpa_supplicant http://hostap.epitest.fi/wpa_supplicant]. Это программа, управляющая согласованием ключей и аутентификацией.&lt;br /&gt;
* Я полагаю, чтобы использовать WPA в Linux, я должен прочесть man-страницы и HOWTO, а также отредактировать файлы конфигурации?&lt;br /&gt;
*: Вы, конечно, можете сделать это, если ладите с Vim. Однако существуют графические инструменты настройки, облегчающие жизнь. Самый продвинутый из них – вероятно, NetworkManager из Gnome ([http://www.gnome.org/projects/NetworkManager www.gnome.org/projects/NetworkManager]). Он включен в последние дистрибутивы, например, Fedora Core 5 и SUSE 10.1. Пользователи KDE могут предпочесть KWlan ([http://www.kde-apps.org/content/show.php?content=37041 www.kde-apps.org/content/show.php?content=37041]) [или KNetworkManager: [http://en.opensuse.org/Projects/KNetworkManager http://en.opensuse.org/Projects/KNetworkManager], – прим. ред.].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Краткая справка: компиляция приложений&lt;br /&gt;
|Содержание=&lt;br /&gt;
Большинство дистрибутивов имеют большие репозитории программ, содержащие готовые пакеты практически на все случаи жизни, но иногда необходимо собрать пакет из исходных текстов. Обычная причина – отсутствие обновленного (или полное отсутствие) пакета для вашего дистрибутива, или необходимость исправить исходный код, добавив функцию или убрав ошибку. Поддержать систему в актуальном состоянии помогает менеджер пакетов вашего дистрибутива, но если вам необходимо собрать пакет из исходных текстов, то процесс милосердно прост.&lt;br /&gt;
&lt;br /&gt;
Во-первых, распакуйте архив с исходными текстами (tarball) одной из двух команд:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar xvzf foo-1.2.3.tar.gz&lt;br /&gt;
tar xvjf foo-1.2.3.tar.bz2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поздние версии tar могут определить чем был создан архив (gzip или bzip2), так что аргументы z или j можно опустить. Исходные тексты обычно распаковываются в папку с именем, совпадающим с названием архива; после выполнения команд введите cd foo-1.2.3. Найдите файлы с именами README или INSTALL и прочтите их – обычно там находится инструкция по установке. Стандартная процедура такова:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
su -c “make install”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая команда проверяет вашу систему, убеждаясь в соблюдении всех зависимостей и установке оптимальных параметров для программы. Неплохо сначала выполнить команду ./configure --help, чтобы увидеть имеющиеся опции.&lt;br /&gt;
&lt;br /&gt;
Вторая команда компилирует приложение, помещая созданные файлы в текущий каталог. Для конфигурирования и компиляции права root не нужны, но третья стадия – это копирование скомпилированных файлов в системные подкаталоги, а потому требует прав root. Вот почему мы используем su для выполнения только этой команды от имени root. Пользователи Ubuntu должны использовать вместо нее команду&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы не указывали для ./configure путь, то по умолчанию скомпилированная программа устанавливается в /usr/local/bin. Если вы работаете в RPM-системе, а configure сообщает, что не найдена библиотека, хотя вы точно знаете, что она есть – установите соответствующий библиотеке пакет -devel, т.е. libbar-devel.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF83:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-26T08:36:49Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Damn-ГРУБиян */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Врезка&lt;br /&gt;
|Заголовок= Наши эксперты&lt;br /&gt;
|Содержание=Наши эксперты найдут ответ на самый трудный ваш вопрос. Если у вас проблемы с установкой, настройкой модема, сетью или еще чем-нибудь – просто напишите нам, а обо всем остальном мы позаботимся.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:img_83_106_1.jpg|thumb|Владея Интернет провайдером, а заодно подрабатывая редактором дисков для LXF, Нейл Ботвик скромно зовет себя мастером на все руки.]]&lt;br /&gt;
[[Изображение:img_83_106_2.jpg|thumb|Для административных вопросов: Кингс Коблер является системным инженером и администратором Linux в Rackspace, и использует Linux 10 лет.]]&lt;br /&gt;
|Ширина=220px}}&lt;br /&gt;
&lt;br /&gt;
=== Fedora без сети ===&lt;br /&gt;
:* Я установил Fedora Core 5, и все вроде прекрасно, кроме одного. Когда я пытаюсь выполнить Add/Remove Programs (Добавить/Удалить программы) или Packager Updater (Обновление пакетов), у меня запрашивается пароль root. Затем я получаю сообщение об ошибке: «Не могу получить информацию о приложении» или «Не могу получить информацию об обновлении». Единственным отступлением от стандартной установки является отказ от Logical Volume Manager; вместо этого я вручную разбил диск на /boot (100 MБ), / (38 ГБ) и swap (1024 МБ). Да еще мой ПК не подключен к Интернету. Я пытался установить и с CD, и с вашего DVD приложения. Но получаю те же ошибки. '''Альфред Мифсуд [Alfred Mifsud]'''&lt;br /&gt;
&lt;br /&gt;
Отсутствие Интернет-соединения и есть причина этих сообщений. Обе программы при работе пытаются прочитать информацию из online-репозитория программ. В случае Software Updater это неизбежно: по самой своей природе обновления новее пакетов на установочных носителях, так что без соединения с Интернетом не обойтись.&lt;br /&gt;
&lt;br /&gt;
Во избежание этой ошибки с Add/Remove Programs, вам нужно отредактировать файлы репозитория: отключить все online-источники и добавить DVD. Делается это из-под root. Загрузите /etc/yum.repos.d/fedora-core.repo в ваш любимый текстовый редактор, найдите начало раздела [core] и закомментируйте строки baseurl и mirrorlist, поместив в начало каждой строки #. Затем добавьте новую строку вида&lt;br /&gt;
&lt;br /&gt;
 baseurl=file:///media/disk&lt;br /&gt;
&lt;br /&gt;
Создастся новый репозиторий на /media/disk, где смонтирован DVD. Затем вам следует отредактировать другие .repo-файлы и изменить все вхождения enabled=1 на enabled=0. Теперь единственный активный репозиторий – это DVD, и запуск Add/Remove Software должен позволить вам установить приложения с диска. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Черепашья почта ===&lt;br /&gt;
:* Мой почтовый сервер на основе Qmail отправляет почту с большой задержкой. Я пытался ускорять его, но ничего не вышло. Не могли бы вы перечислить, что может вызывать задержку? '''Т.Мэтьюс [T Matthews]'''&lt;br /&gt;
&lt;br /&gt;
Наиболее вероятная причина задержек – запросы DNS. Первое и главное, убедитесь, что имя сервера нормально разрешается. Кроме того, для IP-адреса, используемого сервером для отправки почты, должна быть создана PTR-запись. Вы также можете ускорить запросы, запустив собственный локальный кэширующий сервер имен.&lt;br /&gt;
&lt;br /&gt;
Также можно отключить DNS-запросы вообще. Если вы запускаете qmail-smtpd через tcpserver, то добавьте в его опции флаг -H, чтобы он не искал имена хостов в DNS, и удалите переменную среды $TCPREMOTEHOST. Во избежание зацикливания вы должны использовать эту опцию для серверов по TCP-порту 53. Если это не так, то вы, вероятно, запускаете его через inetd/xinetd; и можете добавить в конфигурацию флаг -Rt0, в пункте server_args конфигурационного файла вашего inetd/xinetd. Это запретит Qmail выполнять запросы ident при установлении SMTP-соединения. Проделанные действия проявляют себя в задержке между установлением TCP-соединения и появлением приглашения.&lt;br /&gt;
&lt;br /&gt;
А если ваша очередь постоянно переполняется, можете добавить файл '''/var/qmail/control/queuelifetime''' и установить в нем срок менее семи дней (срок по умолчанию, означающий, что попытки отправки всех поступающих писем будут повторяться в течение недели). Одного или двух дней вполне хватит. Эти шаги должны снизить время, необходимое Qmail для отображения приглашения. '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Реаниматор ===&lt;br /&gt;
:* Мой друг владеет маленькой юридической фирмой (шесть пользователей, использующих Windows XP Pro, Linux proxy/mail сервер). Они часто портят компьютеры, и он зовет меня чинить их. Обычно это означает резервирование всех документов, сохраненных где попало, и переустановку Windows.&lt;br /&gt;
&lt;br /&gt;
:Поэтому я пытаюсь найти и установить полностью автоматизированную систему на базе Linux для восстановления после сбоев, которая бы производила резервирование после каждой установки (типа Ghost или G4L) и еженощно резервировала бы каждую рабочую станцию, чтобы, если кто-то навредил, нужно было только загрузиться с другого компьютера в сети или с CD и восстановить систему из образов с backup-сервера. '''Кристос Иоанну [Christos Ioannou]'''&lt;br /&gt;
&lt;br /&gt;
Здесь две отдельных проблемы. Первая – это создание резервной копии на CD или в сети, чтобы полностью переустановить систему в серьезном случае. Вторая – регулярное резервирование данных.&lt;br /&gt;
&lt;br /&gt;
Вы не ошибетесь, если для первого пути выберите Partition Image – [http://www.partimage.org www.partimage.org]. Это Linux-программа, имеющая клиент-серверные функции. Вы можете запустить сервер на вашем Linux-компьютере и использовать Live CD для создания образов дисков каждой Windows-машины. Вам понадобится Live-CD дистрибутив, который можно будет использовать для восстановления диска из файл-образа на сервере. RIP (Recovery Is Possible [«восстановление возможно»; также Rest In Peace – покойся с миром – надпись на надгробье; см. стр. 48 – прим. ред.]) вполне подойдет ([http://www.tux.org/pub/people/kent-robotti/looplinux/rip www.tux.org/pub/people/kent-robotti/looplinux/rip]). Документация содержит детальные инструкции изменения CD-образа под ваши нужды; вы можете добавить небольшой скрипт командной оболочки и вызвать его из /etc/rc.d/rc.local, чтобы автоматизировать полное восстановление системы при загрузке с CD.&lt;br /&gt;
&lt;br /&gt;
Для ночного инкрементного резервирования хорошим выбором будет BackupPC ([http://backuppc.sourceforge.net http://backuppc.sourceforge.net]). Она запускается на Linux сервере и не требует специального ПО, установленного на Windows ПК, т.к. доступ к нему осуществляет Samba. Нужно только настроить на ПК совместное использование, чтобы BackupPC смог заполучить файлы. Вся работа выполняется на Linux-машине, так что ночным резервированием сможет управлять простое задание Cron. BackupPC обладает web-интерфейсом, и пользователям не придется учить загадочные команды для восстановления файлов из резервной копии.&lt;br /&gt;
&lt;br /&gt;
Эта программа особенно хороша при резервировании некоторого числа схожих ПК, поскольку хранит одну копию файла, находящегося на нескольких компьютерах. Вместе со сжатием это значительно уменьшает требуемое пространство для резервирования узлов сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Захват экрана ===&lt;br /&gt;
:* Ищу приложение, которое бы записывало все, что я делаю на машине, в небольшой фильм. Можете ли вы что-то порекомендовать? '''Мак-Скрафф [McScruff]''', с форума&lt;br /&gt;
&lt;br /&gt;
Для этого существует множество решений, в зависимости от предназначения фильма. Если вы хотите опубликовать его в Интернете, лучшим выбором будет Vnc2swf. Она записывает VNC-сессию как Flash-анимацию. Вам нужно будет установить VNC (или Tightvnc с [http://www.tightvnc.com www.tightvnc.com]). VNC создан для удаленного рабочего стола, но вы также можете использовать его на одном компьютере. Запустите VNC-сессию&lt;br /&gt;
&lt;br /&gt;
 vncserver -depth 16 -geometry 800x600&lt;br /&gt;
&lt;br /&gt;
и увидите строку вида:&lt;br /&gt;
&lt;br /&gt;
 New ‘X’ desktop is yourhostname:N&lt;br /&gt;
&lt;br /&gt;
Последняя часть – имя хоста (yourhostname) и номер дисплея. Если ваш компьютер не подключен к сети, можете использовать localhost. Теперь начните сессию командой&lt;br /&gt;
&lt;br /&gt;
 vnc2swf -startrecording -geometry 800x600 -depth 16 -framerate 5 demo.swf yourhostname:N.0&lt;br /&gt;
&lt;br /&gt;
Убедитесь, что разрешение (geometry), глубина цвета (depth), имя хоста (yourhostname) и дисплей соответствуют только что запущенному вами VNC-серверу. '''.0''' в конце обязателен. Появится новое окно, содержащее рабочий стол VNC-сессии, и все, что вы будете делать в нем, запишется в demo.swf. Завершите запись, закрыв это окно. Программа выведет некоторый HTML-код для просмотра Flash-анимации в web-браузере, который вы при желании можете перенаправить в файл. Размер и количество кадров определяется web-браузером, но для вывода демонстрации локально на монитор или проектор вы можете захотеть увеличить и то и другое.&lt;br /&gt;
&lt;br /&gt;
Для генерации фильма можете использовать Vncrec. Работает она по той же схеме, что и Vnc2swf, но создает файл в своем собственном формате, который вы может перекодировать в AVI или MPEG при помощи transcode.&lt;br /&gt;
&lt;br /&gt;
 vncrec -record demo.vnc&lt;br /&gt;
 transcode -x vnc --use_rgb -y xvid - k --dvd_access_delay 5 -f 10 -i demo.vnc -o demo.avi&lt;br /&gt;
&lt;br /&gt;
Используемое разрешение опять-таки должно совпадать с разрешением, в котором запущен сервер. Ключ -f устанавливает количество кадров в секунду для видео. Получившийся файл может быть просмотрен в любом видеопроигрывателе, например, MPlayer или Xine.&lt;br /&gt;
&lt;br /&gt;
Какое бы записывающее приложение вы ни выбрали, если вы хотите, чтобы в начале записи запускалась некоторая программа, то пропишите ее в ~/.vnc/xstartup:&lt;br /&gt;
&lt;br /&gt;
 ooimpress sample.pps&lt;br /&gt;
&lt;br /&gt;
Другая возможность – Istanbul с [http://live.gnome.org/Istanbul http://live.gnome.org/Istanbul]. Это программа для Gnome, но работает и на других рабочих столах. Она помещает иконку на панели: нажмите ее для начала записи, а повторное нажатие остановит запись. Результат сохраняется под именем ~/desktop-recording.ogg, в формате Theora. Она может показаться примитивной по сравнению с альтернативами, но настраивается быстро и легко. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Лишенец прав! ===&lt;br /&gt;
:* Я недавно перешел с Xandros на Fedora Core 5. Я перекачал 3 ГБ данных и обнаружил, что все файлы в моем домашнем каталоге имеют владельца и принадлежат к группе root. Есть ли скрипт, который поможет мне изменить права доступа на мое имя пользователя? '''Д.Ригли [D Wrigley]'''&lt;br /&gt;
&lt;br /&gt;
Если вы скопировали свой домашний каталог (к примеру, /home/dave) с одной машины на другую, наилегчайший способ восстановить владельца в этом каталоге – рекурсивно выполнить chown от имени root в /home/dave с корректными именем и группой владельца. Это можно безопасно сделать в вашем домашнем каталоге, поскольку он обычно содержит только файлы и каталоги, принадлежащие пользователю и группе пользователя, к которому относится этот каталог.&lt;br /&gt;
&lt;br /&gt;
 chown -R macdaddy:macdaddy /home/macdaddy&lt;br /&gt;
&lt;br /&gt;
Если у вас много файлов и каталогов, принадлежащих другим пользователям и группам, необходимо выполнить поиск с заменой. Так что если пользователь ‘dave’ имеет множество файлов и каталогов в '''/var/www/html''' и вы хотите сменить владельца этих файлов на пользователя и группу ‘bigmac’, следует применить chown -R для смены владельца каталогов. Беда в том, что заодно поменяют владельца и те файлы, которые вам трогать не хотелось. Чтобы каталоги, не принадлежащие Dave, остались без изменений, для поиска и смены владельца используйте команду find,:&lt;br /&gt;
&lt;br /&gt;
 find /var/www/html -user dave -group dave -exec chown bigmac:bigmac {} \;&lt;br /&gt;
&lt;br /&gt;
Эта команда найдет любой каталог или файл в /var/www/html, принадлежащий пользователю и группе dave, а затем сменит владельца на bigmac. {} указано для замены найденных файлов, соответствующих критериям -user и -group, а \; необходимо во избежание интерпретации ; командной оболочкой, и чтобы сообщить find, что список параметров закончился.&lt;br /&gt;
&lt;br /&gt;
Итак, для стандартных домашних каталогов наилегчайший способ сменить владельца единовременно – использовать команду chown -R. Помните, что этот метод применим не во всех частях файловой системы! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Пропал Thunderbird ===&lt;br /&gt;
:* Щелкая на email-адресе в KDE, я получаю ошибку: ‘Kdeinit can not start /usr/share/application/Thunderbird/Thunderbird’. Thunderbird установлен в /opt/Thunderbird. Был у меня SUSE, но в сейчас я использую Gentoo, и когда я переносил каталог /home, вероятно, что-то затер в Kdeinit, но не могу понять что. Не могли бы вы сказать мне, как сделать, чтобы Kdeinit искал в нужном месте? '''Стюарт [Stewart]'''&lt;br /&gt;
&lt;br /&gt;
Похоже, что KDE не там ищет Thunderbird. Как и большинство опций KDE, вы можете изменить это в Центре управления KDE; хотя найти нужное место в Центре Управления трудно – там столько всего, и не всегда там, где вы ожидаете увидеть. Центр Управления содержит функцию поиска, которая обычно помогает, но не в этом случае (по крайней мере не в KDE 3.5.3). Нужная вам опция находится в Компоненты &amp;gt; Выбор Компонентов &amp;gt; Email-клиент. Выберите радиокнопку Использовать другой Email-клиент, затем щелкните на маленькой иконке справа от строки ввода чтобы открыть окно выбора приложения. Выбрав программу таким образом, вы установите верный путь.&lt;br /&gt;
&lt;br /&gt;
Thunderbird откроется, но без адреса получателя или любой другой информации. Чтобы исправить это, добавьте следующее в строку запуска Thunderbird:&lt;br /&gt;
&lt;br /&gt;
 -compose “mailto:%t?subject=%s&amp;amp; body=%B”&lt;br /&gt;
&lt;br /&gt;
Задержите курсор мыши над строкой ввода, чтобы увидеть доступные опции. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Спутанные карты ===&lt;br /&gt;
:* Только что установил Fedora Core 5, и слегка в недоумении: какая из моих сетевых карт работает. У меня их две, и при предыдущих установках по умолчанию использовалась eth0. Вот результат выполнения ifconfig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0 Link encap:Ethernet HWaddr 00:30:18:58:4A:A3&lt;br /&gt;
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
UP BROADCAST MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
eth1 Link encap:Ethernet HWaddr 00:50:BA:B3:B1:A5&lt;br /&gt;
inet addr:192.168.1.152 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::250:baff:feb3: b1a5/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:258479 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:264885 errors:0 dropped:0 overruns:13 carrier:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
: Мне кажется, что при работе в сети весь трафик идет через eth1. Можете ли вы пролить свет на это? '''pk_fox'''&lt;br /&gt;
&lt;br /&gt;
Вы используете DHCP на обеих сетевых картах? Если да, то вот что скорее всего происходит:&lt;br /&gt;
# Обнаруживается первая сетевая карта (NIC) и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
# Определяется вторая NIC и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
&lt;br /&gt;
Четвертый шаг переписывает шлюз по умолчанию в таблице маршрутизации, забивая установки, сделанные на втором шаге. Вы можете проверить это, выполнив&lt;br /&gt;
&lt;br /&gt;
 route -n&lt;br /&gt;
&lt;br /&gt;
Строка, показывающая расположение 0.0.0.0, завершается интерфейсом, используемым по умолчанию. Есть ли причина, по которой вы используете две NIC? Если да, то вам, видимо, придется настроить шлюз по умолчанию вручную. Или же отключите опцию activate device when computer starts для одной из NIC в программе настройки сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Сам себе браузер? ===&lt;br /&gt;
:* Я управляю сервисом хостинга, на нем более 100 доменов. Последние несколько дней стало казаться, что наш сервер тормозит. Я выполнил несколько предварительных тестов (используя netstat) и обнаружил множество соединений с моего сервера по TCP-порту 80 к моему серверу по временным портам. Из полученных результатов я понял, что имеются соединения от Apache по порту 80 к другим портам моего сервера. Но почему? Как мой сервер может просматривать мои собственные web-сайты? Используется Apache 2 под Red Hat Enterprise Linux 3. '''Джон [John]'''&lt;br /&gt;
&lt;br /&gt;
Весьма похоже, что это поведение спровоцировал один из ваших новых web-сайтов. Из описанного вами отчета netstat я делаю вывод, что некий код вызывает соединения с вашим сервером. Проанализировав деятельность сервера Apache, мы можем сравнить число netstat-соединений с обслуживаемыми Apache. Для этого поместим следующее в конфигурационный файл Apache (/etc/httpd/conf/httpd.conf):&lt;br /&gt;
&lt;br /&gt;
 ExtendedStatus on&lt;br /&gt;
 &amp;lt;Location /server-status&amp;gt;&lt;br /&gt;
  SetHandler server-status&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы откроете страницу www.domain.com/server-status?refresh=5, то статус вашего сервера будет обновляться раз в пять секунд. Уделите особое внимание загруженности процессора и числу секунд с начала нового запроса (SS). Также, сравнивая число соединений выдаваемых netstat с числом соединений на отдельном виртуальном хосте, вы быстро найдете виновника! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Саботаж Sendmail ===&lt;br /&gt;
:* Я создаю сервер для размещения управляющего ПО нашей лаборатории (я написал его на PHP, благодаря урокам в LXF!). Установил сервер Kubuntu с Sendmail – и начались проблемы.&lt;br /&gt;
&lt;br /&gt;
:Я выполнил простую настройку Sendmail, оставив все как есть, поскольку почти ничего не понимаю в настройке Sendmail! Он отправляет почту людям в локальной сети (например, john@localnet.co.uk), но во внешний мир ничего не исходит (например, на john@hotmail.com). Был бы очень благодарен за совет – а может, и за учебник по установке почтового сервера? '''Джон Клейтон [John Clayton]'''&lt;br /&gt;
&lt;br /&gt;
Sendmail – не лучший выбор для вас. Это несомненно мощный почтовый сервер, но, увы, трудно настраиваемый. Postfix или Exim больше подойдут вам, они оба доступны через репозиторий Ubuntu (Postfix – стандартный почтовый сервер и находится на установочных дисках Ubuntu). Эти сервера отлично документированы, файлы настроек имеют обычный текстовый формат, и изучить их настройки проще, чем продираться сквозь множество опций настройки Sendmail.&lt;br /&gt;
&lt;br /&gt;
Какой бы сервер вы ни выбрали, вам следует настраивать его через Webmin, он предоставляет опции в дружественной графической оболочке и позволяет избежать ошибок конфигурирования сервера, приводящих к потере почты или снижению безопасности. При желании вы также сможете читать или подстраивать файлы настроек вручную – Webmin помогает изучать опции настройки, а не прячет их.&lt;br /&gt;
&lt;br /&gt;
Для любого выбранного сервера, файлы журналов (log-файлы) предоставят причину сбоя. Выполните&lt;br /&gt;
&lt;br /&gt;
 tail -f /path/to/logfile&lt;br /&gt;
&lt;br /&gt;
и попытайтесь отправить почту во внешний мир. Вы увидите сообщение об ошибке, соответствующее сбою: варианты – от сбоя DNS (хотя это маловероятно, т.к. Интернет вообще-то работает) до блокирования исходящего SMTP-трафика вашим провайдером. Многие провайдеры делают это в качестве противоспамной меры: или перенаправляют весь SMTP-трафик на собственный почтовый сервер, или блокируют вообще. Если это так, вам необходимо настроить ваш почтовый сервер на использование сервера вашего провайдера как ‘smarthost’, тогда вся почта не для вашей локальной сети будет отсылаться через тот сервер. Для этого в Sendmail поместите в Sendmail.cf следующее:&lt;br /&gt;
&lt;br /&gt;
 DSmail.isp.com&lt;br /&gt;
&lt;br /&gt;
заместив mail.isp.com SMTP-сервером провайдера. Для Postfix такая строка&lt;br /&gt;
&lt;br /&gt;
 relayhost = mail.isp.com&lt;br /&gt;
&lt;br /&gt;
Если вы используете Webmin, это первая опция в модуле Sendmail и четвертая в модуле Postfix. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Damn-ГРУБиян ===&lt;br /&gt;
:* На моем ПК много разделов, и установлено несколько дистрибутивов Linux, хочу поиграть с ними, прежде чем остановиться на одном. Мой загрузчик – XOSL, и со многими дистрибутивами он работает прекрасно, включая штуку из Редмонда! Но он серьезно слетел после дистрибутива Damn Small Linux с [[LXF80]]. Скрипт установки DSL на жесткий диск не предоставляет выбора места размещения загрузчика Lilo или Grub – он всегда пишет его прямо в главную загрузочную запись (MBR), туда же, где размещается XOSL! Поэтому, когда я восстанавливаю XOSL, он находит все остальные дистрибутивы, но не DSL. Или ПК загружается только в DSL. Они не работают вместе.&lt;br /&gt;
&lt;br /&gt;
:Не могли бы вы объяснить на уровне начинающего: как настроить загрузку (Lilo или Grub) на разделе, где установлен DSL, чтобы XOSL смог найти и запустить его? '''Джефф [Jeff]'''&lt;br /&gt;
&lt;br /&gt;
Установить Grub на раздел вместо MBR просто, и позор, что DSL не предоставляет такой возможности. Предположим для примера, что DSL установлен на /dev/hda5. Загрузитесь в DSL, откройте root-терминал и выполните Grub. Вы перенесетесь в командую оболочку Grub, где следует набрать&lt;br /&gt;
&lt;br /&gt;
 root (hd0,4)&lt;br /&gt;
 setup (hd0,4)&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
Grub начинает счет с нуля, поэтому первый диск, пятый раздел (hda5 в терминологии Linux) – это hd0,4. Теперь загрузчик DSL установлен в разделе, и вы можете велеть XOSL загружаться с этого раздела. Когда XOSL загрузит DSL, вы перенесетесь в меню Grub – возможно, и зря, поскольку вы уже выбрали, какую ОС загружать. Избавиться от этого можно, отредактировав /boot/Grub/menu.lst и изменив время ожидания с 15 на 0. Если вы хотите сохранить выбор опций DSL, представленных в меню Grub, измените время на меньшее, но ненулевое значение. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Медленно и узко ===&lt;br /&gt;
:* Пытаюсь найти широкополосного провайдера с разумными ценами, имеющего дело с Linux. Поискал высокоскоростное телефонное соединение под Linux, но не достиг успеха. Поэтому я исследовал статистику загрузки под различными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
:Fedora Core 5 оказалась в самом низу с пиком в 1,8 КБ/с и средним около 0,7. Fedora 4 и SUSE достигли максимума 3 КБ/с при средней скорости загрузки 1,5 КБ/с. Knoppix 4 не многим лучше. В Xandros 3 получилось 4 КБ при среднем около 2 КБ. Лучше всех Mandriva 10.1 (использовались Mozilla и Epiphany), с пиком около 13 КБ/с и средним около 6 КБ/с.&lt;br /&gt;
&lt;br /&gt;
:Данные получены для различных соединений в различное время, но результаты вполне согласуются – они все работают плохо около 19:00 и 10:00 и все показали лучший результат в воскресенье утром. Я использую внешний COM-модем 56K. Есть идеи, как получить двузначную цифру скорости? '''Крис Марсден [Chris Marsden]'''&lt;br /&gt;
&lt;br /&gt;
:PS А также, идеи о сети из двух Linux-компьютеров с двумя разными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
В Великобритании есть два провайдера, специализирующихся на пользователях Linux: UKLinux.net и UK Free Software Network ([http://www.ukfsn.org www.ukfsn.org]). Оба предоставляют как ADSL, так и телефонное соединение. Ваши проблемы со скоростью действительно выглядят слегка странными, но сделать выводы трудно, поскольку вы сообщили очень мало информации – даже не указали марку модема.&lt;br /&gt;
&lt;br /&gt;
Было бы интересно сравнить настройки модема в каждом из дистрибутивов. Использование браузера для измерения скорости закачки – не самый надежный тест, на него влияет множество факторов, включая прокси-сервер провайдера. Лучшим тестом будет попытка загрузить файл через wget. Попробуйте в каждом дистрибутиве команду:&lt;br /&gt;
 &lt;br /&gt;
 wget ftp://ftp.mirrorservice.org/sites/ ftp.kde.org/pub/kde/stable/3.5.2/src/ kdeaddons-3.5.2.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Любой файл с FTP-сервера в Великобритании сойдет для теста. Вы не сможете получить двузначную цифру с 56К-модемом, если только не загружаете сжимаемые данные, например, группы новостей или web-страницы (но не картинки). Лучшее, на что вы можете рассчитывать со сжатыми данными вроде указанного выше файла или картинки – это около 7 КБ/с. Сжатые файлы дают истинную оценку качества связи.&lt;br /&gt;
&lt;br /&gt;
Указанные вами времена интересны; 19-00 – это пик использования Интернета в Великобритании (сами решайте, web или Emmerdale), тогда как утром в воскресенье отмечается спад. Стоит также попросить BT протестировать вашу линию. Даже если они скажут, что все в порядке, сам факт тестирования часто способствует улучшению.&lt;br /&gt;
&lt;br /&gt;
При использовании провайдера с поддержкой Linux вы вправе получить такую поддержку. Я бы предложил использовать телефонный доступ через UKFSN (это окупается) и попросить обоих провайдеров помочь со скоростью соединения. Кто окажется полезнее, того и делайте вашим широкополосным партнером.&lt;br /&gt;
&lt;br /&gt;
Что до вашего вопроса о соединении в сеть двух компьютеров с разными дистрибутивами, то это все равно, что два компьютера с одним и тем же вариантом Linux. Хотя инструменты настройки могут различаться, большинство дистрибутивов в принципе схожи. NFS, HTTP, Samba, практически все, что вы хотите использовать для организации сети, работает одинаково во всех дистрибутивах. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Вопрос-Победитель&lt;br /&gt;
|Содержание=&lt;br /&gt;
=== Эволюция для почты ===&lt;br /&gt;
:* Пытаюсь исправить проблемы с аутентификацией на моем почтовом сервере, и единственный обнаруженный способ – его настройка в Evolution. Есть ли другие пути, обходящиеся без создания записи в Evolution? '''Мэтью Саид [Matthew Saeed]'''&lt;br /&gt;
&lt;br /&gt;
Один из лучших способов протестировать множество различных сервисов, включая SMPTP SAUTH –использовать Telnet. Конечно, я не стал бы рекомендовать Telnet для обычного входа, но в качестве теста сервисов он неоценим. Для исправления вашей проблемы надо соединиться с почтовым сервером по порту 25 и зарегистрироваться, используя кодировку BASE64 (читайте об этом на [http://en.wikipedia.org/wiki/Base64 http://en.wikipedia.org/wiki/Base64]). Для начала расшифровка нескольких полезных строк, закодированных при помощи [www.dillfrog.com/tools/base-64_encode www.dillfrog.com/tools/base-64_encode]:&lt;br /&gt;
&lt;br /&gt;
*‘VXNlcm5hbWU6’ расшифровывается как ‘Username:’&lt;br /&gt;
*‘UGFzc3dvcmQ6’ расшифровывается как ‘Password:’&lt;br /&gt;
*‘dGVzdF9seGZAcmV6ZC5jby51a w==’ расшифровывается как ‘test_lxf@rezd.co.uk’&lt;br /&gt;
*‘Zm9vYmFy’ расшифровывается как ‘foobar’&lt;br /&gt;
&lt;br /&gt;
Следующие строки являются проверкой регистрации на сервере. Мы используем BASE64кодирование для нескольких строк описанных выше.&lt;br /&gt;
&lt;br /&gt;
Первое, соединимся при помощи Telnet к домену/IP адресу почтового сервера (т.е. mail.rezd.co.uk или 10.0.0.1) по порту 25:&lt;br /&gt;
&lt;br /&gt;
 telnet 10.0.0.1 25&lt;br /&gt;
&lt;br /&gt;
Сервер отвечает SMTP-приглашением (баннером):&lt;br /&gt;
&lt;br /&gt;
 Trying 10.0.0.1...&lt;br /&gt;
 Connected to mail.rezd.co.uk (10.0.0.1).&lt;br /&gt;
 Escape character is ‘^]’.&lt;br /&gt;
 220 mail.rezd.co.uk ESMTP&lt;br /&gt;
&lt;br /&gt;
Даем команду EHLO:&lt;br /&gt;
&lt;br /&gt;
 EHLO other.domain.rezd.org.uk&lt;br /&gt;
&lt;br /&gt;
Далее сервер сообщает, что именно он поддерживает (в этом почтовые сервера могут различаться).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
250-mail.rezd.co.uk Hello other. domain.rezd.&lt;br /&gt;
org.uk [192.168.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
LOGIN PLAIN&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на почтовом сервере:&lt;br /&gt;
&lt;br /&gt;
 AUTH LOGIN&lt;br /&gt;
&lt;br /&gt;
Он выдает запрос имени пользователя (username):&lt;br /&gt;
&lt;br /&gt;
 334 VXNlcm5hbWU6&lt;br /&gt;
&lt;br /&gt;
Теперь введем имя пользователя, под которым хотим зарегистрироваться, например, test_lxf@rezd.co.uk:&lt;br /&gt;
&lt;br /&gt;
 dGVzdF9seGZAcmV6ZC5jb20=&lt;br /&gt;
&lt;br /&gt;
Затем запрашивается пароль:&lt;br /&gt;
&lt;br /&gt;
 334 UGFzc3dvcmQ6&lt;br /&gt;
&lt;br /&gt;
Мы отвечаем:&lt;br /&gt;
&lt;br /&gt;
 Zm9vYmFy&lt;br /&gt;
&lt;br /&gt;
И, наконец, он говорит «да» (yes), то есть регистрация (authentication) работает:&lt;br /&gt;
&lt;br /&gt;
 235 2.0.0 OK Authenticated&lt;br /&gt;
&lt;br /&gt;
Если мы получаем следующее, то понимаем, что с регистрацией есть проблемы:&lt;br /&gt;
&lt;br /&gt;
 535 5.7.0 authentication failed&lt;br /&gt;
&lt;br /&gt;
Этого достаточно для тестирования регистрации; если мы хотим протестировать отправку писем, то мы должны продолжить SMTP-диалог. '''KK'''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Часто задаваемые вопросы о WPA&lt;br /&gt;
|Содержание=&lt;br /&gt;
* Что такое WPA?&lt;br /&gt;
*: WPA – потомок WEP с улучшенной безопасностью.&lt;br /&gt;
* Спасибо, конечно, но что это?&lt;br /&gt;
*: WPA (Wi-Fi Protected Access – Защищенный Wi-Fi доступ) – система обеспечения защиты передачи данных в беспроводных сетях.&lt;br /&gt;
* А оно мне нужно?&lt;br /&gt;
*: Почти наверняка – да. Беспроводные сети передают ваши данные на сотни метров во всех направлениях. Это означает, что кто угодно с ноутбуком и беспроводной картой может прочесть ваши данные так же легко, как при подсоединении к вашему сетевому хабу.&lt;br /&gt;
* Мой ноутбук даже не дотягивает до всех комнат моего дома, так что я в безопасности, разве нет?&lt;br /&gt;
*: Отнюдь! Хотя доступ вашего ноутбука ко внешним устройствам ограничен неким расстоянием, у другого оборудования это расстояние может быть куда больше. Добавив к вашей беспроводной карте антенну, вы охватите значительно большую площадь. Соответственно улучшенные системы могут перекрывать огромные области. Вам нечего бояться, если вы используете Wi-Fi только дома для выхода в сеть с вашего ноутбука, но если ваша фирма использует слабозащищенные (или не защищенные) беспроводные сети, то ваши конфиденциальные файлы могут читать прямо из машины на офисной парковке.&lt;br /&gt;
* Раз уж вы упомянули: что такое WEP?&lt;br /&gt;
*: WEP – Wired Equivalent Privacy (Эквивалент проводной безопасности), предыдущая попытка защитить беспроводные сети. WEP лучше, чем ничего, но взломать его нетрудно. Он может не допустить вашего соседа к вашему компьютеру, если тот случайно подсоединится к вашей точке доступа вместо своей (так я и узнал, что мой сосед использует небезопасную сеть), но не сможет остановить взломщика.&lt;br /&gt;
* Какое оборудование использует WPA?&lt;br /&gt;
*: Все новые беспроводные сетевые карты и точки доступа поддерживают как WPA, так и WEP. Если у вас старое устройство, может оказаться, что оно поддерживает только WEP.&lt;br /&gt;
* А как насчет программ?&lt;br /&gt;
*: Вам необходима двухуровневая поддержка WPA на уровне драйвера устройства (большинство драйверов ее уже имеют) и программа, реализующая WPA. Наиболее популярна wpa_supplicant, она должна поставляться с вашим дистрибутивом и доступна по адресу [http://hostap.epitest.fi/wpa_supplicant http://hostap.epitest.fi/wpa_supplicant]. Это программа, управляющая согласованием ключей и аутентификацией.&lt;br /&gt;
* Я полагаю, чтобы использовать WPA в Linux, я должен прочесть man-страницы и HOWTO, а также отредактировать файлы конфигурации?&lt;br /&gt;
*: Вы, конечно, можете сделать это, если ладите с Vim. Однако существуют графические инструменты настройки, облегчающие жизнь. Самый продвинутый из них – вероятно, NetworkManager из Gnome ([http://www.gnome.org/projects/NetworkManager www.gnome.org/projects/NetworkManager]). Он включен в последние дистрибутивы, например, Fedora Core 5 и SUSE 10.1. Пользователи KDE могут предпочесть KWlan ([http://www.kde-apps.org/content/show.php?content=37041 www.kde-apps.org/content/show.php?content=37041]) [или KNetworkManager: [http://en.opensuse.org/Projects/KNetworkManager http://en.opensuse.org/Projects/KNetworkManager], – прим. ред.].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Краткая справка: компиляция приложений&lt;br /&gt;
|Содержание=&lt;br /&gt;
Большинство дистрибутивов имеют большие репозитории программ, содержащие готовые пакеты практически на все случаи жизни, но иногда необходимо собрать пакет из исходных текстов. Обычная причина – отсутствие обновленного (или полное отсутствие) пакета для вашего дистрибутива, или необходимость исправить исходный код, добавив функцию или убрав ошибку. Поддержать систему в актуальном состоянии помогает менеджер пакетов вашего дистрибутива, но если вам необходимо собрать пакет из исходных текстов, то процесс милосердно прост.&lt;br /&gt;
&lt;br /&gt;
Во-первых, распакуйте архив с исходными текстами (tarball) одной из двух команд:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar xvzf foo-1.2.3.tar.gz&lt;br /&gt;
tar xvjf foo-1.2.3.tar.bz2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поздние версии tar могут определить чем был создан архив (gzip или bzip2), так что аргументы z или j можно опустить. Исходные тексты обычно распаковываются в папку с именем, совпадающим с названием архива; после выполнения команд введите cd foo-1.2.3. Найдите файлы с именами README или INSTALL и прочтите их – обычно там находится инструкция по установке. Стандартная процедура такова:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
su -c “make install”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая команда проверяет вашу систему, убеждаясь в соблюдении всех зависимостей и установке оптимальных параметров для программы. Неплохо сначала выполнить команду ./configure --help, чтобы увидеть имеющиеся опции.&lt;br /&gt;
&lt;br /&gt;
Вторая команда компилирует приложение, помещая созданные файлы в текущий каталог. Для конфигурирования и компиляции права root не нужны, но третья стадия – это копирование скомпилированных файлов в системные подкаталоги, а потому требует прав root. Вот почему мы используем su для выполнения только этой команды от имени root. Пользователи Ubuntu должны использовать вместо нее команду&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы не указывали для ./configure путь, то по умолчанию скомпилированная программа устанавливается в /usr/local/bin. Если вы работаете в RPM-системе, а configure сообщает, что не найдена библиотека, хотя вы точно знаете, что она есть – установите соответствующий библиотеке пакет -devel, т.е. libbar-devel.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:WINK</id>
		<title>LXF83:WINK</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:WINK"/>
				<updated>2008-04-26T08:35:43Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Редактируем проект */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Создаем видеопособие с Wink ==&lt;br /&gt;
''Замучились бегать через три этажа, чтобы объяснить «девочкам из бухгалтерии» как скопировать файл в Nautilus? Нет ничего проще – создайте видеокурс «Gnome для чайников», следуя советам '''Сергея Яремчука!''' ''&lt;br /&gt;
&lt;br /&gt;
Народная пословица гласит: «Лучше один раз увидеть, чем сто раз услышать».&lt;br /&gt;
Простое описание продукта без сопровождающих его экранных снимков не сможет передать достоинства и недостатки интерфейса, его слабые и сильные стороны. Но статический образ не может передать особенности работы с самой программой. Возможно, поэтому сегодня так популярны различные видеопособия, рассказывающие о том, как проделать ту или иную операцию.&lt;br /&gt;
&lt;br /&gt;
Действительно, такое пособие лучше продемонстрирует любые характеристики как простого, так и сложного программного обеспечения, покажет другим, как можно выполнить некую задачу в специфической программной среде, поможет ответить на любые вопросы поддержки, так как простая демонстрация способна заменить тысячи слов. Ранее, чтобы создать видеопособие в Linux, приходилось прибегать к виртуальным машинам либо запускать Windows-приложения для захвата действий, производимых на рабочем столе при помощи Wine. Теперь ситуация изменилась, так как появились удобные инструменты, позволяющие создавать готовые презентационные ролики, рассказывающие о работе программ. Среди них базирующаяся на GTK утилита Istanbul (см. «Полезные ссылки»), очень удобный инструмент, позволяющий сохранить результат в видеофайл в формате Ogg Theora, либо передать поток на Icecast-сервер для дальнейшей трансляции пользователям, что очень удобно при обучении. Ранние решения по созданию видеопособий использовали протокол VNC и были очень неудобными в настройке и использовании. Эти проблемы решены в проекте vnc2swf, при помощи которого можно захватить сеанс VNC и записать его в формате Macromedia Flash или VNCLog (последний можно затем воспроизвести при помощи vncrec). И, наконец, Wink – весьма удобная, мощная и простая в использовании программа, написанная с помощью wxWidgets.&lt;br /&gt;
&lt;br /&gt;
=== Знакомьтесь – Wink ===&lt;br /&gt;
В отличие от упомянутых выше программ, Wink, к сожалению, не является открытым ПО, но при этом бесплатен для персонального и бизнес-использования. С его помощью можно делать снимки с экрана в ручном и автоматическом режиме, затем добавлять к ним комментарии, подписи и кнопки. Созданный с его помощью сжатый Flash-файл на порядок меньше по размеру, чем файл, созданный в Istanbul и закодированный Ogg Theora. Такой файл можно затем смотреть в любом проигрывателе, понимающем Flash версии 3 и выше. Подобный ролик лучше всего подходит для схематического представления действий пользователя, тогда как видео Theora предпочтительнее в случае быстрых изменений картинки и сложных изображений. Кроме захвата снимка экрана, в качестве входящей информации могут использоваться графические файлы BMP/JPG/PNG/TIFF/GIF. На выходе, кроме Macromedia Flash, может быть создан HTML, который также удобен для представления в Web. Если вам нужна готовая презентация, то можно использовать скомпилированный ехе-файл; если требуется распечатка, то подойдут форматы PDF и PostScript. Можно также создать шаблон, который затем будет использоваться многократно. Кроме Linux, Wink&lt;br /&gt;
доступен для Windows 98/ME/2000/XP.&lt;br /&gt;
&lt;br /&gt;
=== Наше первое пособие ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_104_1.png|thumb|Рис. 1. В первом окне мастера указываются частота и область захвата.]]&lt;br /&gt;
&lt;br /&gt;
Установка сложностей не вызывает, требуется распаковать архив и запустить скрипт installer.sh. При работе с Wink разрешение экрана желательно установить не менее 800x600, а лучше – 1024x768, тогда при редактировании вам будет доступна большая область. Для создания нового проекта выберите File –&amp;gt; New, после чего запустится мастер (Wizard). На первом шаге (рис.1) укажите область захвата, воспользовавшись выпадающим списком. Это может быть весь экран (Screen), отдельное окно (Window), либо часть экрана (rectangle). Последний последний вариант позволяет произвольно выбрать размеры в строке Region, либо воспользоваться одним из предустановленных значений. Для указания окна или произвольной области экрана воспользуйтесь кнопкой Choose. После нажатия на нее очертите при помощи мыши нужную область, либо укажите на окно приложения, после чего щелчком левой кнопкой запишите результат. В строке Region при этом должны появиться данные новой области, которые можно подкорректировать вручную. Если окно Wink мешает выбрать нужную область, его можно скрыть. Для этого отметьте галочкой пункт Hide Wink Window. В окне Timed Capture Rate, выставляем количество снимков экрана, которое будет производить Wink в секунду, минуту или час. Этот параметр будет использоваться в режиме автоматического захвата.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_104_2.png|thumb|Рис. 2. Wink готов к записи.]]&lt;br /&gt;
&lt;br /&gt;
Теперь нажмите ОК и перейдите ко второму окну мастера (рис.2). После выбора Minimize To Tray Wink спрячется в трей (если конечно он есть в используемом оконном менеджере) и будет ждать команду на запуск процесса записи. По умолчанию нажатие на клавишу Pause приведет к захвату одиночного изображения, комбинация Shift + Pause запустит/остановит автоматический захват. После того как запись будет окончена, вызовите мастер двойным щелчком по иконке и нажмите Finish. Появится окно редактирования проекта, показанное на рис.3.&lt;br /&gt;
&lt;br /&gt;
=== Редактируем проект ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_105_1.png|thumb|Рис. 3. Окно редактирования проекта.]]&lt;br /&gt;
&lt;br /&gt;
Окно редактирования разбито на три части. Посередине отображается кадр, над которым вы работаете в данный момент времени, внизу показаны уменьшенные копии изображений всех кадров проекта, а справа расположено окно свойств (Properties).&lt;br /&gt;
&lt;br /&gt;
Команды редактирования можно вызвать из меню, при помощи окна свойств или воспользовавшись горячими клавишами. Над расположенными внизу кадрами можно производить любые действия: вырезать, копировать, удалять, вставлять кадры из буфера обмена, копии или пустые кадры. Также при помощи меню Project можно обрезать (Crop All Frames) либо изменить размер всех кадров проекта (Resize All Frames).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_105_2.png|thumb|Рис. 4. Выбор курсора.]]&lt;br /&gt;
&lt;br /&gt;
Особенностью Wink является то, что можно не только редактировать положение курсора, но и изменять его форму. Включите показ курсора, выбрав Сursor. Для выбора нового курсора нажимите Ctrl+R, либо пиктограмму возле галочки. В появившемся окне укажите вид курсора (рис.4), и нажмите ОК. Если курсор появился не на своем месте, щелкните по нему в окне текущего кадра и перетащите на положенное ему место.&lt;br /&gt;
&lt;br /&gt;
После компиляции проекта время показа каждого кадра будет одним и тем же. Поставив необходимую цифру в поле Stay in this frame for time можно задержать показ кадра на указанное время, чтобы пользователь смог подробнее рассмотреть элементы управления, либо для более подробного пояснения ситуации.&lt;br /&gt;
&lt;br /&gt;
Кроме того, каждый кадр может иметь подпись. Для того, чтобы создать ее, выберите Frame Titles и при помощи мыши выделите область, в которую будет помещена подпись. Здесь же указываются шрифт и выравнивание. Поясняющий текст вводится в каждом кадре. Если в каком-либо кадре подпись не нужна, то в окне подписи необходимо ввести пробел, иначе после компиляции в этих кадрах будет видна надпись “This frame’s title will come here ...”. Таким же образом можно добавить и текстовое поле. Активируйте пункт Textbox, выберите общий вид поля (Choose Callout), шрифт и выравнивание. При включении текстового поля автоматически активируются кнопки Back и Next: захватите их мышью и перетащите на свое место. В дальнейшем при просмотре презентации в местах, где расположены эти кнопки воспроизведение будет останавливаться, и ждать дальнейших действий пользователя. В других кадрах эти кнопки можно активировать, установив галочку напротив нужного пункта в окне свойств.&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок = Полезные ссылки&lt;br /&gt;
|Содержание =*Проект Istanbul&lt;br /&gt;
[http://live.gnome.org/Istanbul http://live.gnome.org/Istanbul]&lt;br /&gt;
*Проект vnc2swf&lt;br /&gt;
[http://www.unixuser.org/~euske/vnc2swf/ http://www.unixuser.org/~euske/vnc2swf/]&lt;br /&gt;
*Проект Wink&lt;br /&gt;
[http://www.debugmode.com/wink/ http://www.debugmode.com/wink/]&lt;br /&gt;
*Свободный видеокодек Ogg Theora&lt;br /&gt;
[http://www.theora.org/ http://www.theora.org/]&lt;br /&gt;
*Потоковый сервер Icecast&lt;br /&gt;
[http://www.icecast.org/ http://www.icecast.org/]&lt;br /&gt;
*Программа vncrec&lt;br /&gt;
[http://www.sodan.org/~penny/vncrec/ http://www.sodan.org/~penny/vncrec/]&lt;br /&gt;
*Звуковой редактор Audacity&lt;br /&gt;
[http://audacity.sourceforge.net/ http://audacity.sourceforge.net/]&lt;br /&gt;
|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
При ознакомлении с материалом очень часто приходится обращаться к другим кадрам для уточнения информации, представленной на экране. Wink осуществляет переход между кадрами при помощи кнопок Go. Для активации такой кнопки выберите Goto Button 1(2) и затем щелчком по расположенной рядом пиктограмме укажите номер кадра, к которому должен быть произведен переход. При необходимости вместо кнопок можно использовать изображение. Для этого выберите Project –&amp;gt; Choose Goto Button Image 1(2) и указываем на файл в формате BMP, JPEG, PNG, CUR, ANI, ICO, PCX и PNM. В этом же пункте можно выбрать изображение для кнопок Back и Next, а также фоновое изображение кадров проекта.&lt;br /&gt;
&lt;br /&gt;
Когда все кадры будут готовы, сохраните проект в файл с расширением wnk. Осталось только скомпилировать результат. Сначала нажмите Project –&amp;gt; Setting (F3), укажите имя выходного файла, формат (swf или exe) и частоту кадров. Сохраните настройки нажатием кнопки ОК. Затем выберите Project –&amp;gt; Render (F7) и дождитесь окончания процесса компиляции. Требуемое время будет зависеть от производительности компьютера, количества и размера кадров, а также наличия дополнительных элементов управления. Если выбран формат Flash, то в результирующем каталоге обнаружите два файла с расширениями swf и html. Последний содержит код, необходимый для запуска ролика в web-браузере.&lt;br /&gt;
&lt;br /&gt;
Возможности Wink позволяют создать действительно хороший материал, который покажет и объяснит любое действие. Единственным минусом является отсутствие звукового сопровождения. Wink не предоставляет такой возможности, но его легко добавить и самому. Для записи с микрофона будем использовать Audacity (см. [[LXF79]]). Запустите приложение, создайте новый проект Файл -&amp;gt; Новый (Ctrl+N), затем выставите параметры выходного файла Файл –&amp;gt; Настройки. Для Flash-ролика будет достаточно 16-битного моно-сигнала с небольшой частотой дискретизации.&lt;br /&gt;
&lt;br /&gt;
Сохраните настройки нажатием ОК. Теперь на передней панели выберите источник сигнала Mic и нажмите на красную кнопку Rec. Затем запустите на воспроизведение ваш Flash-ролик и комментируйте происходящее в микрофон. После окончания, остановите запись и сохраните файл. Не забудьте вырезать «лишнюю тишину» в начале файла. Для этого выделите нужный фрагмент и нажмите Вырезать (Ctrl+X). Для добавления звука можно использовать скрипт edit.py из комплекта vnc2swf, принимающий в качестве входных параметров имена Flash и MP3-файла. Поэтому, выберите Файл – Экспортировать в mp3 и сохраните запись с микрофона в MP3-файл. Теперь соедините их вместе:&lt;br /&gt;
 $ edit.py --a voice.mp3 first.swf -owith_sound.swf&lt;br /&gt;
&lt;br /&gt;
Если результат удовлетворительным, переименуйте with_sound.swf обратно в first.swf, чтобы не править HTML-код.&lt;br /&gt;
 $ mv with_sound.swf first.swf&lt;br /&gt;
&lt;br /&gt;
Презентация готова! Можно опубликовать ее на сайте или отослать пользователям. Для экспорта в другие форматы загляните в меню File.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wink является мощным и одновременно простым и понятным в использовании средством, позволяющим создавать презентации практически любой сложности. В отличие от других подобных инструментов, пользователю предоставляется возможность полноценного вмешательства в конечный результат, путем коррекции кадров, добавления поясняющего текста и прочей информации, делающей восприятие информации более простым.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:WINK</id>
		<title>LXF83:WINK</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:WINK"/>
				<updated>2008-04-26T08:32:57Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Редактируем проект */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Создаем видеопособие с Wink ==&lt;br /&gt;
''Замучились бегать через три этажа, чтобы объяснить «девочкам из бухгалтерии» как скопировать файл в Nautilus? Нет ничего проще – создайте видеокурс «Gnome для чайников», следуя советам '''Сергея Яремчука!''' ''&lt;br /&gt;
&lt;br /&gt;
Народная пословица гласит: «Лучше один раз увидеть, чем сто раз услышать».&lt;br /&gt;
Простое описание продукта без сопровождающих его экранных снимков не сможет передать достоинства и недостатки интерфейса, его слабые и сильные стороны. Но статический образ не может передать особенности работы с самой программой. Возможно, поэтому сегодня так популярны различные видеопособия, рассказывающие о том, как проделать ту или иную операцию.&lt;br /&gt;
&lt;br /&gt;
Действительно, такое пособие лучше продемонстрирует любые характеристики как простого, так и сложного программного обеспечения, покажет другим, как можно выполнить некую задачу в специфической программной среде, поможет ответить на любые вопросы поддержки, так как простая демонстрация способна заменить тысячи слов. Ранее, чтобы создать видеопособие в Linux, приходилось прибегать к виртуальным машинам либо запускать Windows-приложения для захвата действий, производимых на рабочем столе при помощи Wine. Теперь ситуация изменилась, так как появились удобные инструменты, позволяющие создавать готовые презентационные ролики, рассказывающие о работе программ. Среди них базирующаяся на GTK утилита Istanbul (см. «Полезные ссылки»), очень удобный инструмент, позволяющий сохранить результат в видеофайл в формате Ogg Theora, либо передать поток на Icecast-сервер для дальнейшей трансляции пользователям, что очень удобно при обучении. Ранние решения по созданию видеопособий использовали протокол VNC и были очень неудобными в настройке и использовании. Эти проблемы решены в проекте vnc2swf, при помощи которого можно захватить сеанс VNC и записать его в формате Macromedia Flash или VNCLog (последний можно затем воспроизвести при помощи vncrec). И, наконец, Wink – весьма удобная, мощная и простая в использовании программа, написанная с помощью wxWidgets.&lt;br /&gt;
&lt;br /&gt;
=== Знакомьтесь – Wink ===&lt;br /&gt;
В отличие от упомянутых выше программ, Wink, к сожалению, не является открытым ПО, но при этом бесплатен для персонального и бизнес-использования. С его помощью можно делать снимки с экрана в ручном и автоматическом режиме, затем добавлять к ним комментарии, подписи и кнопки. Созданный с его помощью сжатый Flash-файл на порядок меньше по размеру, чем файл, созданный в Istanbul и закодированный Ogg Theora. Такой файл можно затем смотреть в любом проигрывателе, понимающем Flash версии 3 и выше. Подобный ролик лучше всего подходит для схематического представления действий пользователя, тогда как видео Theora предпочтительнее в случае быстрых изменений картинки и сложных изображений. Кроме захвата снимка экрана, в качестве входящей информации могут использоваться графические файлы BMP/JPG/PNG/TIFF/GIF. На выходе, кроме Macromedia Flash, может быть создан HTML, который также удобен для представления в Web. Если вам нужна готовая презентация, то можно использовать скомпилированный ехе-файл; если требуется распечатка, то подойдут форматы PDF и PostScript. Можно также создать шаблон, который затем будет использоваться многократно. Кроме Linux, Wink&lt;br /&gt;
доступен для Windows 98/ME/2000/XP.&lt;br /&gt;
&lt;br /&gt;
=== Наше первое пособие ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_104_1.png|thumb|Рис. 1. В первом окне мастера указываются частота и область захвата.]]&lt;br /&gt;
&lt;br /&gt;
Установка сложностей не вызывает, требуется распаковать архив и запустить скрипт installer.sh. При работе с Wink разрешение экрана желательно установить не менее 800x600, а лучше – 1024x768, тогда при редактировании вам будет доступна большая область. Для создания нового проекта выберите File –&amp;gt; New, после чего запустится мастер (Wizard). На первом шаге (рис.1) укажите область захвата, воспользовавшись выпадающим списком. Это может быть весь экран (Screen), отдельное окно (Window), либо часть экрана (rectangle). Последний последний вариант позволяет произвольно выбрать размеры в строке Region, либо воспользоваться одним из предустановленных значений. Для указания окна или произвольной области экрана воспользуйтесь кнопкой Choose. После нажатия на нее очертите при помощи мыши нужную область, либо укажите на окно приложения, после чего щелчком левой кнопкой запишите результат. В строке Region при этом должны появиться данные новой области, которые можно подкорректировать вручную. Если окно Wink мешает выбрать нужную область, его можно скрыть. Для этого отметьте галочкой пункт Hide Wink Window. В окне Timed Capture Rate, выставляем количество снимков экрана, которое будет производить Wink в секунду, минуту или час. Этот параметр будет использоваться в режиме автоматического захвата.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_104_2.png|thumb|Рис. 2. Wink готов к записи.]]&lt;br /&gt;
&lt;br /&gt;
Теперь нажмите ОК и перейдите ко второму окну мастера (рис.2). После выбора Minimize To Tray Wink спрячется в трей (если конечно он есть в используемом оконном менеджере) и будет ждать команду на запуск процесса записи. По умолчанию нажатие на клавишу Pause приведет к захвату одиночного изображения, комбинация Shift + Pause запустит/остановит автоматический захват. После того как запись будет окончена, вызовите мастер двойным щелчком по иконке и нажмите Finish. Появится окно редактирования проекта, показанное на рис.3.&lt;br /&gt;
&lt;br /&gt;
=== Редактируем проект ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_105_1.png|thumb|Рис. 3. Окно редактирования проекта.]]&lt;br /&gt;
&lt;br /&gt;
Окно редактирования разбито на три части. Посередине отображается кадр, над которым вы работаете в данный момент времени, внизу показаны уменьшенные копии изображений всех кадров проекта, а справа расположено окно свойств (Properties).&lt;br /&gt;
&lt;br /&gt;
Команды редактирования можно вызвать из меню, при помощи окна свойств или воспользовавшись горячими клавишами. Над расположенными внизу кадрами можно производить любые действия: вырезать, копировать, удалять, вставлять кадры из буфера обмена, копии или пустые кадры. Также при помощи меню Project можно обрезать (Crop All Frames) либо изменить размер всех кадров проекта (Resize All Frames).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_105_2.png|thumb|Рис. 4. Выбор курсора.]]&lt;br /&gt;
&lt;br /&gt;
Особенностью Wink является то, что можно не только редактировать положение курсора, но и изменять его форму. Включите показ курсора, выбрав Сursor. Для выбора нового курсора нажимите Ctrl+R, либо пиктограмму возле галочки. В появившемся окне укажите вид курсора (рис.4), и нажмите ОК. Если курсор появился не на своем месте, щелкните по нему в окне текущего кадра и перетащите на положенное ему место.&lt;br /&gt;
&lt;br /&gt;
После компиляции проекта время показа каждого кадра будет одним и тем же. Поставив необходимую цифру в поле Stay in this frame for time можно задержать показ кадра на указанное время, чтобы пользователь смог подробнее рассмотреть элементы управления, либо для более подробного пояснения ситуации.&lt;br /&gt;
&lt;br /&gt;
Кроме того, каждый кадр может иметь подпись. Для того, чтобы создать ее, выберите Frame Titles и при помощи мыши выделите область, в которую будет помещена подпись. Здесь же указываются шрифт и выравнивание. Поясняющий текст вводится в каждом кадре. Если в каком-либо кадре подпись не нужна, то в окне подписи необходимо ввести пробел, иначе после компиляции в этих кадрах будет видна надпись “This frame’s title will come here ...”. Таким же образом можно добавить и текстовое поле. Активируйте пункт Textbox, выберите общий вид поля (Choose Callout), шрифт и выравнивание. При включении текстового поля автоматически активируются кнопки Back и Next: захватите их мышью и перетащите на свое место. В дальнейшем при просмотре презентации в местах, где расположены эти кнопки воспроизведение будет останавливаться, и ждать дальнейших действий пользователя. В других кадрах эти кнопки можно активировать, установив галочку напротив нужного пункта в окне свойств.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|right&lt;br /&gt;
|Заголовок = Полезные ссылки&lt;br /&gt;
|Содержание =*Проект Istanbul&lt;br /&gt;
[http://live.gnome.org/Istanbul http://live.gnome.org/Istanbul]&lt;br /&gt;
*Проект vnc2swf&lt;br /&gt;
[http://www.unixuser.org/~euske/vnc2swf/ http://www.unixuser.org/~euske/vnc2swf/]&lt;br /&gt;
*Проект Wink&lt;br /&gt;
[http://www.debugmode.com/wink/ http://www.debugmode.com/wink/]&lt;br /&gt;
*Свободный видеокодек Ogg Theora&lt;br /&gt;
[http://www.theora.org/ http://www.theora.org/]&lt;br /&gt;
*Потоковый сервер Icecast&lt;br /&gt;
[http://www.icecast.org/*Программа vncrec http://www.icecast.org/*Программа vncrec]&lt;br /&gt;
[http://www.sodan.org/~penny/vncrec/ http://www.sodan.org/~penny/vncrec/]&lt;br /&gt;
*Звуковой редактор Audacity&lt;br /&gt;
[http://audacity.sourceforge.net/ http://audacity.sourceforge.net/]&lt;br /&gt;
|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
При ознакомлении с материалом очень часто приходится обращаться к другим кадрам для уточнения информации, представленной на экране. Wink осуществляет переход между кадрами при помощи кнопок Go. Для активации такой кнопки выберите Goto Button 1(2) и затем щелчком по расположенной рядом пиктограмме укажите номер кадра, к которому должен быть произведен переход. При необходимости вместо кнопок можно использовать изображение. Для этого выберите Project –&amp;gt; Choose Goto Button Image 1(2) и указываем на файл в формате BMP, JPEG, PNG, CUR, ANI, ICO, PCX и PNM. В этом же пункте можно выбрать изображение для кнопок Back и Next, а также фоновое изображение кадров проекта.&lt;br /&gt;
&lt;br /&gt;
Когда все кадры будут готовы, сохраните проект в файл с расширением wnk. Осталось только скомпилировать результат. Сначала нажмите Project –&amp;gt; Setting (F3), укажите имя выходного файла, формат (swf или exe) и частоту кадров. Сохраните настройки нажатием кнопки ОК. Затем выберите Project –&amp;gt; Render (F7) и дождитесь окончания процесса компиляции. Требуемое время будет зависеть от производительности компьютера, количества и размера кадров, а также наличия дополнительных элементов управления. Если выбран формат Flash, то в результирующем каталоге обнаружите два файла с расширениями swf и html. Последний содержит код, необходимый для запуска ролика в web-браузере.&lt;br /&gt;
&lt;br /&gt;
Возможности Wink позволяют создать действительно хороший материал, который покажет и объяснит любое действие. Единственным минусом является отсутствие звукового сопровождения. Wink не предоставляет такой возможности, но его легко добавить и самому. Для записи с микрофона будем использовать Audacity (см. [[LXF79]]). Запустите приложение, создайте новый проект Файл -&amp;gt; Новый (Ctrl+N), затем выставите параметры выходного файла Файл –&amp;gt; Настройки. Для Flash-ролика будет достаточно 16-битного моно-сигнала с небольшой частотой дискретизации.&lt;br /&gt;
&lt;br /&gt;
Сохраните настройки нажатием ОК. Теперь на передней панели выберите источник сигнала Mic и нажмите на красную кнопку Rec. Затем запустите на воспроизведение ваш Flash-ролик и комментируйте происходящее в микрофон. После окончания, остановите запись и сохраните файл. Не забудьте вырезать «лишнюю тишину» в начале файла. Для этого выделите нужный фрагмент и нажмите Вырезать (Ctrl+X). Для добавления звука можно использовать скрипт edit.py из комплекта vnc2swf, принимающий в качестве входных параметров имена Flash и MP3-файла. Поэтому, выберите Файл – Экспортировать в mp3 и сохраните запись с микрофона в MP3-файл. Теперь соедините их вместе:&lt;br /&gt;
 $ edit.py --a voice.mp3 first.swf -owith_sound.swf&lt;br /&gt;
&lt;br /&gt;
Если результат удовлетворительным, переименуйте with_sound.swf обратно в first.swf, чтобы не править HTML-код.&lt;br /&gt;
 $ mv with_sound.swf first.swf&lt;br /&gt;
&lt;br /&gt;
Презентация готова! Можно опубликовать ее на сайте или отослать пользователям. Для экспорта в другие форматы загляните в меню File.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wink является мощным и одновременно простым и понятным в использовании средством, позволяющим создавать презентации практически любой сложности. В отличие от других подобных инструментов, пользователю предоставляется возможность полноценного вмешательства в конечный результат, путем коррекции кадров, добавления поясняющего текста и прочей информации, делающей восприятие информации более простым.&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:LaTeX</id>
		<title>LXF83:LaTeX</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:LaTeX"/>
				<updated>2008-04-26T08:30:31Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Примечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/LaTeX}}&lt;br /&gt;
&lt;br /&gt;
== LaTeX — компьютерная типография ==&lt;br /&gt;
'' '''Часть 1 Евгений Балдин''' начинает новую серию статей, посвященных LaTeX — истинной TeXнологии. Создание книг еще никогда не было таким интересным.''&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|width=&amp;quot;30%&amp;quot; align=right|&lt;br /&gt;
|Человеческая цивилизация зависит от книг. Передача знаний от поколения к поколению это то, что делает человека разумным. Написание книги всегда было/есть/будет одним из самых сложных видов деятельности. LaTeX берет на себя техническую часть по подготовке рукописи, оставляя человеку больше времени на творчество, и, в тоже время, позволяя ему контролировать весь процесс создания от начала и до конца.&lt;br /&gt;
&lt;br /&gt;
«Если кто-то другой набирает ваше произведение, то у вас нет возможности контролировать появление ошибок; если же вы выполняете эту работу самостоятельно, то можете винить только себя» — Дональд Э. Кнут.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Немного истории ===&lt;br /&gt;
Есть популярная идея по поводу того, что «история учит тому,&lt;br /&gt;
что ничему не учит». Возможно, это так. Но чтобы понять&lt;br /&gt;
логику текущих событий и явлений, все-таки необходимо знать как&lt;br /&gt;
«оно» зарождалось и почему «оно» до сих пор существует.&lt;br /&gt;
&lt;br /&gt;
==== Доисторический период ====&lt;br /&gt;
Сначала вообще не было компьютеров, и люди писали все вручную. Но прогресс неумолим — и вслед за печатной машиной появилась коммерческая выгода от создания книг. Время шло, процесс печати удешевлялся — все были довольны, пока не случилось вот что…&lt;br /&gt;
&lt;br /&gt;
==== Роль Человека в истории ====&lt;br /&gt;
Дональд Эрвин Кнут (Donald Ervin Knuth) является одним из немногих людей, благодаря которым информатика заслуженно носит звание научной дисциплины. Произведение, которое принесло ему широкую известность, это «пятитомник» «Искусство программирования» &amp;lt;ref&amp;gt;На сайте мастера [http://www-cs-faculty.stanford.edu/~knuth/ http://www-cs-faculty.stanford.edu/~knuth/] можно найти предварительные версии пока не опубликованных глав четвертого тома.&amp;lt;/ref&amp;gt;. После того, как в 1975 году был издан третий том «пятитомника», издатель окончательно избавился от печатной машины с металлическим набором типа «монотип» и заменил его на фотонаборное устройство. Результат превзошел все ожидания: получив оттиски, сделанные по новой технологии, Д. Э. Кнут, который как раз подготовил второе издание второго тома, сильно загрустил. Сама мысль, что книги, на написание которых он потратил свыше пятнадцати лет, будут так плохо выглядеть, не давала Кнуту покоя.&lt;br /&gt;
&lt;br /&gt;
Новые машины были не аналоговыми, а дискретными. Буквы составлялись из точек — «это объект для компьютерной науки» — подумал Кнут и решил научить компьютер делать буквы из точек такими как надо, то есть красивыми. Поначалу задача казалась несложной. Кнут потом признавал, что это был его личный рекорд по недооценке сложности проекта.&lt;br /&gt;
&lt;br /&gt;
«Лучший способ разобраться до конца — это попробовать научить этому компьютер.» — Д. Э. Кнут.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_100_1.png|thumb|200px|Эмблемы TeX и METAFONT, созданные Дуайном Бибби, взяты с домашней странички Д.Э.Кнута. Пингвина, судя по заголовку EPS, создал сотрудник Adobe Systems Inc. Нил Такер (Neal Tucker).]]&lt;br /&gt;
&lt;br /&gt;
Примерно через десять лет после начала работы над проектом системы METAFONT (создание шрифтов) и TeX (лучшая программа разбиения абзацев на строки) были стабилизированы (версия 2.7 для METAFONT и 3.1 для TeX). Кнут отошел от активной разработки. В дальнейшем METAFONT и TeX модифицировались только для целей исправления ошибок. На текущий момент рабочая версия METAFONT равна 2.71828, а TeX — 3.141592. Кнут завещал, что после его смерти версии будут заморожены и равны числу &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; и числу &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; соответственно, а все оставшиеся неисправленные ошибки будут считаться особенностями реализации.&lt;br /&gt;
&lt;br /&gt;
На текущий момент TeX, скорее всего, самая свободная от ошибок программа. Код TeX выпускался отдельной книгой «TeX: The Program» (ISBN 0201134373), за обнаружение ошибки в своей программе Кнут выплачивает вознаграждение. TeX является примером свободной программы, которая возникла в академической среде задолго до наступления эпохи GPL.&lt;br /&gt;
&lt;br /&gt;
«Математическая формула не может быть чьей-то „собственностью“! Она принадлежит Богу.» — Д. Э. Кнут.&lt;br /&gt;
&lt;br /&gt;
Сегодня мастер на пенсии и все свое время посвящает написанию&lt;br /&gt;
«пятитомника». На его домашней страничке можно заметить, что дело явно движется. Ждем результата с нетерпением.&lt;br /&gt;
&lt;br /&gt;
==== Техническое отступление ====&lt;br /&gt;
В основу TeX была заложена относительно простая идея. TeX работает только с боксами (box) и клеем (glue). Элементарные боксы — это буквы, которые объединяются в боксы-слова, которые в свою очередь сливаются в боксы-строчки, боксы-абзацы и так далее. Между боксами «разлит» клей, который имеет ширину по умолчанию и степени увеличения/уменьшения этой ширины. Объединяясь в бокс более высокого порядка, элементарные боксы могут шевелиться, но как только найдено оптимальное решение, это состояние замораживается и полученный бокс выступает как единое целое. Наилучшее решение находится с помощью системы штрафов за то, что клея использовано больше или меньше оптимального значения, а также за разрывы абзаца в неподходящем месте. Чем меньше штрафа было получено, тем размещение «красивее». В зависимости от системы штрафов меняется форматирование.&lt;br /&gt;
&lt;br /&gt;
Первоначально Кнут предполагал, что у TeX будет множество модификаций, ибо каждая типография будет держать мастера-TeXника для создания своей версии TeX под свои нужды. Вначале TeX не являлся в полном смысле языком программирования. Управляющие конструкции были добавлены в него позже, когда стало понятно, что развитие TeXнологии пошло совсем по другому пути.&lt;br /&gt;
&lt;br /&gt;
А началось все с Лесли Лэмпорта, который в начале 80-х годов начал разработку издательской системы LaTeX, в основе которой лежал TeX. LaTeX представляет из себя набор макросов на языке TeX, позволяющих решить ту или иную задачу. Иными словами, это сборник рецептов. Чтобы выбрать сценарий стирки в автоматической стиральной машине, нет необходимости думать в терминах числа оборотов, уровня воды и количества порошка — достаточно просто выбрать готовое решение. Чтобы пользоваться системой LaTeX, не надо быть TeXником — достаточно выбрать готовый стиль и использовать несколько простых команд в зависимости от того, что нужно сделать.&lt;br /&gt;
&lt;br /&gt;
==== Дистрибутивы LaTeX ====&lt;br /&gt;
LaTeX, собственно говоря, как и Linux, не является монолитной программой. Он состоит из набора пакетов/программ, причем не фиксированного, что позволяет создавать дистрибутивы, преследующие ту или иную цель.&lt;br /&gt;
&lt;br /&gt;
На сегодня все дистрибутивы LaTeX имеют общий корень, и этот корень носит название CTAN или The Comprehensive TeX Archive Network ([http://www.ctan.org http://www.ctan.org]). CTAN — это репозитарий, в который стекаются все сколь-нибудь стоящие наработки в области TeX-строения. CTAN — это множество зеркалируемых серверов по всему миру. Модель была настолько успешна, что ее взяло на вооружение Perl-сообщество, организовав CPAN — The Comprehensive Perl Archive Network ([http://www.cpan.org http://www.cpan.org]).&lt;br /&gt;
&lt;br /&gt;
Наиболее известным в среде GNU/Linux является дистрибутив teTeX. ([http://www.tug.org/tetex/ http://www.tug.org/tetex/]). Если вы не знаете, что за дистрибутив стоит на вашем компьютере, то это, скорее всего, teTeX. Этот дистрибутив был создан Томасом Эшером (Thomas Esser). Первая публичная версия в 1994 влезала на три дискетки. В мае 2006 года Томас принял решение о прекращении поддержки своего детища в пользу настоящего флагмана TeX-сообщества (TUG — TeX User Groups, [http://www.tug.org/ http://www.tug.org/]) - дистрибутива TeX Live ([http://www.tug.org/texlive/ http://www.tug.org/texlive/]).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_101_1.png|thumb|200px|Пример набора текста в текстовом редакторе – слева. Просмотр результата набора – справа.]]&lt;br /&gt;
&lt;br /&gt;
TeX Live создавался как дистрибутив, который можно было запускать прямо с CD. Базой для дистрибутива стал teTeX. Первая версия TeX Live была выпущена в 1996 году. Со временем дистрибутив рос, и к 2003 году TeX Live стал «влезать» только на DVD. Каждый год выпускается новая версия дистрибутива. Текущая нумерация идет по номеру года. TeX Live поддерживает все сколько-нибудь распространенные платформы. TeX, вообще, отличается исключительной переносимостью.&lt;br /&gt;
&lt;br /&gt;
TeX Live — это свободное ПО. «Хранители» дистрибутива используют определение понятия свободы, принятое FSF ([http://www.gnu.org/philosophy/free-sw.html http://www.gnu.org/philosophy/free-sw.html]) или сообществом Debian ([http://www.debian.org/social_contract#guidelines http://www.debian.org/social_contract#guidelines]). В случае конфликтов этих определений обычно принимается сторона FSF.&lt;br /&gt;
&lt;br /&gt;
TeX Live был размещен на DVD, который прилагался к LXF79, так что этот дистрибутив вполне можно «потрогать руками» уже сейчас.&lt;br /&gt;
&lt;br /&gt;
=== Запускаем LaTeX ===&lt;br /&gt;
Предполагается, что дистрибутив LaTeX на вашем компьютере уже установлен и настроен. Если это не так, то потревожьте по этому поводу суперпользователя. Обычно проблем с установкой не возникает. Возможные шероховатости с русским языком в современных дистрибутивах возникают по недоразумению. Основной дистрибутив GNU/Linux на сегодня это teTeX. В будущем, по возможности, рекомендуется переходить на TeX Live.&lt;br /&gt;
&lt;br /&gt;
По традиции, для начала скажем «Здравствуй, мир!!!». Для этого в любом удобном для вас текстовом редакторе &amp;lt;ref&amp;gt;Лучше чтобы этим редактором оказался emacs – в каждой шутке есть только доля шутки.&amp;lt;/ref&amp;gt; создайте файл helloworld.tex, примерно следующего содержания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;latex&amp;quot;&amp;gt;&lt;br /&gt;
%helloworld.tex&lt;br /&gt;
%выбор класса документа&lt;br /&gt;
\documentclass{article}&lt;br /&gt;
%Чтобы можно было использовать русские буквы в формулах&lt;br /&gt;
%но в случае использования предупреждать об этом&lt;br /&gt;
\usepackage[warn]{mathtext}&lt;br /&gt;
%выбор внутренней TeX-кодировки&lt;br /&gt;
%можно опустить - вызываю по привычке&lt;br /&gt;
\usepackage[T2A]{fontenc}&lt;br /&gt;
%выбор кодовой страницы документа&lt;br /&gt;
\usepackage[koi8-r]{inputenc}&lt;br /&gt;
%выбор языка документа&lt;br /&gt;
\usepackage[english,russian]{babel}&lt;br /&gt;
%начинать первый параграф с красной строки&lt;br /&gt;
\usepackage{indentfirst}&lt;br /&gt;
%конец преамбулы и начало текста&lt;br /&gt;
\begin{document}&lt;br /&gt;
%Поздравляем мир&lt;br /&gt;
\LARGE Здравствуй мир !!!&lt;br /&gt;
%конец текста&lt;br /&gt;
\end{document}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Комментарии, которые начинаются со знака % можно опускать. Все, что идет до \begin{document} называется преамбулой или «шапкой». Преамбула определяет вид итогового документа. Нет необходимости каждый раз набивать эти строчки с нуля. Для этого достаточно обучить текстовый редактор вставлять их автоматически при создании нового tex-файла. После создания текста его необходимо откомпилировать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; latex helloworld.tex&lt;br /&gt;
This is pdfeTeXk, Version 3.141592-1.30.3-2.2 (Web2C 7.5.5)&lt;br /&gt;
%&amp;amp;-line parsing enabled.&lt;br /&gt;
entering extended mode&lt;br /&gt;
(./helloworld.tex&lt;br /&gt;
LaTeX2e &amp;lt;2003/12/01&amp;gt;&lt;br /&gt;
&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
(./helloworld.aux) [1] (./helloworld.aux) )&lt;br /&gt;
Output written on helloworld.dvi (1 page, 240 bytes).&lt;br /&gt;
Transcript written on helloworld.log.&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве результата LaTeX выдает файл helloworld.dvi. Далее есть выбор:&lt;br /&gt;
&lt;br /&gt;
* просмотреть результат с помощью xdvi:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; xdvi helloworld.dvi&lt;br /&gt;
&lt;br /&gt;
* преобразовать dvi в PostScript &amp;lt;ref&amp;gt;PostScript — язык описания страниц, разработан Джоном Уорноком и Чаком Гешке из Adobe Systems Inc.. Интерпретаторы PostScript, аппаратные или программные (ghostscript), широко используется при печати документов.&amp;lt;/ref&amp;gt; и просмотреть его с помощью gv, а потом распечатать на PostScript-принтере (если он есть, естественно):&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; dvips helloworld&lt;br /&gt;
 &amp;gt; gv helloworld.ps&lt;br /&gt;
 &amp;gt; lpr helloworld.ps&lt;br /&gt;
&lt;br /&gt;
* сделать PDF &amp;lt;ref&amp;gt;PDF — Portable Document Format. Этот формат, как и PostScript, создан фирмой Adobe Systems. Является стандартом для электронной документации.&amp;lt;/ref&amp;gt; , ну и, естественно, просмотреть его с помощью Acrobat Reader:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; dvips helloworld&lt;br /&gt;
 &amp;gt; ps2pdf helloworld.ps helloworld.pdf&lt;br /&gt;
 &amp;gt; acroread helloworld.pdf&lt;br /&gt;
&lt;br /&gt;
Во всех случаях вы увидите одно и то же:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_102_1.png|center]]&lt;br /&gt;
&lt;br /&gt;
=== Проблемы с компиляцией ===&lt;br /&gt;
&lt;br /&gt;
Случается, что при наборе допускается ошибка, тогда при компиляции исходника LaTeX может затребовать дополнительную информацию.&lt;br /&gt;
&lt;br /&gt;
Если просто запустить latex без каких-либо инструкций, то на экране появится приглашение:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; latex&lt;br /&gt;
 This is pdfeTeXk, Version 3.141592-1.30.3-2.2 (Web2C 7.5.5)&lt;br /&gt;
 %&amp;amp;-line parsing enabled.&lt;br /&gt;
 **&lt;br /&gt;
&lt;br /&gt;
LaTeX ждет ввода имени текстового файла, чтобы начать его обработку. Можно прервать ожидание по ^C. Если же правильно задать файл при запуске latex, но при этом ошибиться в коде, то LaTeX выдаст сообщение об ошибке с номером строчки, где возникла проблема, и предложит сделать выбор:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
! Undefined control sequence.&lt;br /&gt;
l.11 \errorinbody&lt;br /&gt;
? h&lt;br /&gt;
The control sequence at the end of the top line&lt;br /&gt;
of your error message was never \def’ed. If you have&lt;br /&gt;
misspelled it (e.g., `\hobx’), type `I’ and the correct&lt;br /&gt;
spelling (e.g., `I\hbox’). Otherwise just continue,&lt;br /&gt;
and I’ll forget about whatever was undefined.&lt;br /&gt;
? x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На запрос (?) можно ввести h, тогда будет выдана догадка о том, с чем может быть связана ошибка, или x, чтобы прервать компиляцию. В случае обычного перевода строки компиляция продолжится до следующей ошибки или до самого конца. Краткую информацию об управляющих командах можно получить введя ?.&lt;br /&gt;
&lt;br /&gt;
Добрый совет: увидели ошибку — сразу же исправьте. Следующие предупреждения могут быть следствием предыдущей ошибки.&lt;br /&gt;
&lt;br /&gt;
Интерактивный режим для работы с ошибками LaTeX — довольно мощный инструмент разбирательства, но на первых порах лучше следовать «Доброму совету». Текстовые редакторы, в которых предусмотрена поддержка редактирования файлов LaTeX, обычно позволяют локализовать ошибку на основании выданного сообщения.&lt;br /&gt;
&lt;br /&gt;
=== LaTeX-конвейер ===&lt;br /&gt;
В процессе работы LaTeX читает и записывает несколько файлов. Полезно знать, что это за файлы, и зачем они нужны.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_102_2.png|center|LaTeX-конвейер.]]&lt;br /&gt;
&lt;br /&gt;
На вход подается текстовый файл с LaTeX-разметкой. Традиционно файл имеет расширение tex.&lt;br /&gt;
&lt;br /&gt;
В качестве результата на выходе получается файл с тем же самым именем, что и на входе, но с расширением dvi. dvi — device-independent (не зависящий от устройства) формат, который хранит информацию о форматировании текста и размещении всех его элементов на странице, но без самих букв и картинок. Программы, преобразующие dvi-файл в другое представление, называются dvi-драйверами.&lt;br /&gt;
&lt;br /&gt;
xdvi преобразует dvi-файл в картинку на экране монитора. Это очень продвинутый драйвер. Он реалистично представляет вид напечатанной страницы, поддерживает гиперссылки и позволяет организовать обратную связь с текстом. Еще одним популярным dvi-драйвером является dvips. dvips производит качественный PostScript, который уже можно распечатать на принтере либо напрямую (если принтер поддерживает PostScript аппаратно), либо через программный интерпретатор ghostscript. Существуют и другие dvi-драйверы: например, dvi2tty пытается перевести dvi обратно в текст, dvilj переводить dvi в инструкции PCL для принтеров HP, dvipdf транслирует dvi в pdf. Обилие dvi-драйверов позволяет рассмотреть/напечатать dvi-файлы практически в любой ситуации.&lt;br /&gt;
&lt;br /&gt;
Свободный программный интерпретатор Ghostscript (gs) в свою очередь позволяет преобразовывать PostScript-файлы (.ps) в другие форматы. Обычно PDF получают именно из PostScript с помощью скрипта ps2pdf.&lt;br /&gt;
&lt;br /&gt;
Графика в LaTeX добавляется через eps-файлы. EPS или Encapsulated PostScript — это векторный графический формат, который представляет собой инструкции на языке PostScript с некоторыми ограничениями. Одно из основных требований заключается в том, что в заголовке epsфайла обязательно должны быть указаны его размеры (BoundingBox). Пример заголовка eps, сделанного из примера «Здравствуй, мир!!!»:&lt;br /&gt;
&lt;br /&gt;
 %!PS-Adobe-2.0 EPSF-2.0&lt;br /&gt;
 %%Creator: dvips(k) 5.95b Copyright 2005 Radical Eye Software&lt;br /&gt;
 %%Title: helloworld.dvi&lt;br /&gt;
 %%BoundingBox: 148 651 288 668&lt;br /&gt;
 %%DocumentFonts: SFRM1728&lt;br /&gt;
 %%EndComments&lt;br /&gt;
&lt;br /&gt;
Перечислим теперь остальные файлы, который участвуют в этом круговороте:&lt;br /&gt;
&lt;br /&gt;
1) '''Внешние файлы.'''&lt;br /&gt;
* '''fmt''' Форматный файл. Содержит, главным образом, все команды LaTeX’а в предварительно откомпилированной форме. Также содержит информацию о переносах. При изменении значений глобальных переменных TeX требуется пересборка форматного файла: texconfig init.&lt;br /&gt;
* '''cls''', '''sty''' Определение макета и структуры документа. Класс документа (.cls) выбирается с помощью инструкции \documentclass. Дополнительные возможности и изменение поведения класса по умолчанию достигается с помощь пакетов (.sty) выбираемых посредством инструкции \usepackage.&lt;br /&gt;
* '''tfm''' Метрики шрифтов. Размеры и правила взаимодействия литер друг с другом.&lt;br /&gt;
* '''fd''' Приведение внешних названий шрифтов к виду, принятому в LaTeX.&lt;br /&gt;
* '''pfb''' Векторные Type1 шрифты.&lt;br /&gt;
* '''pk''' ('''mf''') Растровые pk-шрифты по мере необходимости создаются из векторных mf-шрифтов (METAFONT) с необходимым разрешением. При печати качество не страдает, но при просмотре из-за низкого разрешения дисплея предпочтительнее векторные шрифты.&lt;br /&gt;
&lt;br /&gt;
2) '''Файлы, создаваемые в процессе LaTeX-конвейера.''' Обычно&lt;br /&gt;
для получения итоговой копии документа требуется несколько раз запускать LaTeX. При первом проходе записывается некоторое число информационных файлов, которые при последующих проходах используются для нумерации ссылок, составления оглавления и тому подобное.&lt;br /&gt;
&lt;br /&gt;
* '''log''' Файл протокола. Сюда стекается вся информация, имеющая отношение к компиляции. Фактически дублирует стандартный вывод на экран.&lt;br /&gt;
* '''aux''' Информация о перекрестных ссылках.&lt;br /&gt;
* '''toc''' Файл оглавления (table of contents).&lt;br /&gt;
* '''lof''' Список иллюстраций (list of figures).&lt;br /&gt;
* '''lot''' Список таблиц (list of tables).&lt;br /&gt;
* '''bbl''' Список литературы, сформированный с помощью программы BibTeX. На первых порах можно обойтись без этой TeXнологии, но для серьезных проектов управление списком литературы становится не менее серьезной задачей.&lt;br /&gt;
* '''ind''' Предметный указатель, сформированный программой MakeIndex. В каждой уважающей себя и несущей полезную информацию книге есть&lt;br /&gt;
такой. Для составления используются idx-файлы. Организация указателя — это отдельная задача.&lt;br /&gt;
&lt;br /&gt;
Выше описан описан «классический» LaTeX-конвейер. Программа LaTeX может быть заменена на pdflatex, тогда на выходе сразу будет получаться pdf, а графическая информация должна быть представлена в форматах png или pdf. Возможны и другие вариации, но в целом структура остается той же.&lt;br /&gt;
&lt;br /&gt;
=== Литература ===&lt;br /&gt;
LaTeX’у уже свыше двадцати лет. За время своего существования многие из его частей существенно переделывались и усовершенствовались. База же, в виде TeX, до сих пор остается стабильной основой. Видимо, поэтому документация к LaTeX устаревает с очень большой неохотой.&lt;br /&gt;
&lt;br /&gt;
Доступных в России книг по LaTeX относительно немного. С другой стороны, если вы сможете добыть хоть одну из перечисленных в этом разделе, то для обычного набора вам, скорее всего, будет ее достаточно. Логичная организация позволяет LaTeX расширяться без особого ущерба для совместимости.&lt;br /&gt;
&lt;br /&gt;
Для более подробного ознакомления с конкретными пакетами следует обратиться к документации, сопровождающей пакет. Чего-чего, а описаний в дистрибутиве LaTeX хватает. Также для поиска того или иного решения можно обратиться к сайту CTAN ([http://www.ctan.org http://www.ctan.org]) или TUG ([http://www.tug.org http://www.tug.org]).&lt;br /&gt;
&lt;br /&gt;
==== Классика ====&lt;br /&gt;
* Д. Э. Кнут. «Все про TeX»: Пер. с англ. — М.: Вильямс, 2003, 560 с, ISBN 5-8459-0382-3 (рус.)&lt;br /&gt;
&lt;br /&gt;
Библия TeX. Для обычного набора текстов в LaTeX информация, собранная в этой книге, не обязательна. TeXпертам и тем, кто таковыми себя считает, читать по нескольку раз. Книга содержит сквозной разноуровневый по сложности материал. При прочтении можно выбирать свой уровень.&lt;br /&gt;
&lt;br /&gt;
* Д. Э. Кнут. «Все про METAFONT»: Пер. с англ. — М.: Вильямс, 2003, 384 с, ISBN 5-8459-0442-0 (рус.)&lt;br /&gt;
&lt;br /&gt;
Все, что сказано про библию TeX, относится и к этой библии METAFONT. Если вы создаете иллюстрации с использованием MetaPost, то эту книгу следует прочитать хотя бы для общего развития.&lt;br /&gt;
&lt;br /&gt;
* Д. Э. Кнут. «Компьютерная типография»: Пер. с англ. — М.: Мир, 2003, 686 с, ISBN 5-03-3361-0&lt;br /&gt;
&lt;br /&gt;
Сборник статей Д. Кнута, написанных в процессе создания TeX и METAFONT. В книге подробно разобраны алгоритмы, которые легли в основу TeX, и перечислены те проблемы, что необходимо решить в процессе создания «компьютерной типографии». Книга интересна и исторически — в плане становления одного из самых успешных компьютерных проектов.&lt;br /&gt;
&lt;br /&gt;
==== Учебники и справочники ====&lt;br /&gt;
&lt;br /&gt;
* Г. Грэтцер. «Первые шаги в LaTeX» Пер. с англ. — М.: Мир, 2000, 172 с, ISBN 5-03-0033661-0&lt;br /&gt;
&lt;br /&gt;
Новичкам посвящается. Компактный учебник, позволяющий быстро освоить базовые приемы. Упор на математику.&lt;br /&gt;
&lt;br /&gt;
* М. Гуссенс, Ф. Миттельбах и А. Самарин. &amp;quot;Путеводитель по пакету LaTeX и его расширению LaTeX2 &amp;quot;: Пер. с англ. — Мир, 1999, 606 с, ISBN 5-03-003325-4&lt;br /&gt;
&lt;br /&gt;
Очень полное и исчерпывающее справочное руководство по основным пакетам и приемам LaTeX. На английском недавно вышло второе издание этой книги. Возможно со временем она доберется и до нас. Это моя основная «рабочая» книга по LaTeX.&lt;br /&gt;
&lt;br /&gt;
* М. Гуссенс, С. Ратц и Ф. Миттельбах. «Путеводитель по пакету LaTeX и его графическим расширениям. Иллюстрирование документов при помощи TeX’а и PostScript’а»: Пер. с англ. — Мир, 2002, 621 с, ISBN 5-03-003388-2&lt;br /&gt;
&lt;br /&gt;
При подготовке основного путеводителя авторы обнаружили, что описание систем для создания рисунков по объему начинает превосходить базовый текст. Пришлось выделить это в отдельную книгу. Здесь есть все: от шахмат, нот и электронных схем до трюков с PostScript и MetaPost. Очень полезный учебник-справочник для тех, кто самостоятельно делает иллюстрации.&lt;br /&gt;
&lt;br /&gt;
* М. Гуссенс, С. Ратц. «Путеводитель по пакету LaTeX и его Web-приложениям»: Пер. с англ. — Мир, 2001, 604 с, ISBN 5-03-003387-4&lt;br /&gt;
&lt;br /&gt;
Лучше бы авторы описали бы еще несколько пакетов LaTeX. На мой взгляд, эта книга — дань моде. С другой стороны, здесь расписано все, что связано с PDF и что с ним можно сделать. Любителям XML посвящается.&lt;br /&gt;
&lt;br /&gt;
* «Не очень краткое введение LaTeX2 . Или LaTeX2 за 94 минуты» Перевод Бориса Тоботраса от 1999 г. Электронная версия и исходные тексты доступны здесь: [http://xtalk.msk.su/TeX/ http://xtalk.msk.su/TeX/].&lt;br /&gt;
&lt;br /&gt;
В названии все сказано. Самый доступный и маленький из имеющихся на сегодня русскоязычных учебников. Из недостатков: отсутствует информация о кириллизации. Полезно для начального изучения.&lt;br /&gt;
&lt;br /&gt;
==== LaTeX в России ====&lt;br /&gt;
&lt;br /&gt;
* С. М. Львовский. «Набор и верстка в системе LaTeX. — 3-е издание» — М.: МЦНМО, 2003, 448 с.&lt;br /&gt;
&lt;br /&gt;
Хороший переплет. Основной упор на математику. Классика жанра. Автор ориентируется на нестандартную русификацию, которая имеет свои преимущества, хотя и спорные. Есть свободная электронная версия, которую можно взять, например, здесь: [http://www.mccme.ru/free-books/ http://www.mccme.ru/free-books/]&lt;br /&gt;
&lt;br /&gt;
* И. А. Котельников, П. З. Чеботаев. «LaTeX по-русски. — 3-е издание» — Новосибирск: Сибирский хронограф, 2004, 496 с, ISBN 5-87550-195-2&lt;br /&gt;
&lt;br /&gt;
Очень качественный учебник. Предыдущее 2-е издание было моей настольной книгой. К сожалению, качество переплета не очень высокое, что не позволяет активно работать с этой книгой.&lt;br /&gt;
&lt;br /&gt;
* А. И. Роженко. «Искусство верстки в LaTeX’е» — Новосибирск: Изд. ИВМиМГ СО РАН, 2005. — 398 с, ISBN 5-901548-25-6&lt;br /&gt;
&lt;br /&gt;
Краткий и достаточно исчерпывающий справочник с упором на разработанные автором макросы. В январском номере Linux Format была моя рецензия на эту книгу. Обсуждаются особенности русского стиля. Из недостатков: есть привязка к альтернативной операционной системе.&lt;br /&gt;
&lt;br /&gt;
Кроме перечисленного, полезной может оказаться электронная документация, созданная В. Сюткиным, которую можно можно скачать здесь:&lt;br /&gt;
[http://www-sbras.nsc.ru/win/docs/TeX/LaTeX2e/docs_koi.html http://www-sbras.nsc.ru/win/docs/TeX/LaTeX2e/docs_koi.html]&lt;br /&gt;
&lt;br /&gt;
=== Примечания ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:Unix_API</id>
		<title>LXF83:Unix API</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:Unix_API"/>
				<updated>2008-04-26T08:28:55Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Сетевые сокеты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/Unix API}}&lt;br /&gt;
== Сокеты ==&lt;br /&gt;
'' '''ЧАСТЬ 3''' Сегодня ваши программы научатся общаться со внешним миром – следуйте за '''Андреем Боровским'''!''&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
|width=70% align=&amp;quot;right&amp;quot;|''«Сто лет тому назад дед нынешнего императора, в те времена еще наследный принц, за завтраком разбил яйцо с тупого конца и скорлупой порезал себе палец... С того времени все население Лилипутии разделилось на два лагеря – тупоконечников и остроконечников»''&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|width=50% align=&amp;quot;right&amp;quot;|'' '''Дж. Свифт''', «Гулливер в стране лилипутов»''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В конкурсе на лучшую компьютерную идею всех времен и народов сокеты, без сомнения, могли бы рассчитывать на призовое место. Как и другие средства межпроцессного взаимодействия, рассмотренные в этой серии статей, сокеты впервые были реализованы именно на платформе Unix (4.2BSD), однако концепция сокетов как универсального средства обмена данными между процессами оказалась настолько удачна, что все современные системы поддерживают, по крайней мере, некоторое подмножество сокетов. Причины успеха сокетов заключаются в их простоте и универсальности. Программы, обменивающиеся данными с помощью сокетов, могут работать в одной системе и в разных, используя для обмена данными как специальные объекты системы, так и сетевой стек. Как и каналы, сокеты используют простой интерфейс, основанный на «файловых» функциях read(2) и write(2) (открывая сокет, программа Unix получает дескриптор файла, благодаря которому можно работать с сокетами, используя файловые функции), но, в отличие от каналов, сокеты позволяют передавать данные в обоих направлениях, как в синхронном, так и в асинхронном режиме. Большинство программистов используют для работы с сокетами различные библиотеки высокого уровня, однако высокоуровневые библиотеки, как правило, не позволяют задействовать всю мощь и многообразие сокетов. Наглядный пример многообразия – файловые сокеты. Программистам Windows должны быть знакомы сетевые сокеты, которые обычно организуют обмен данными с помощью протоколов семейства TCP/IP, однако в Unix есть и другие типы сокетов, специально предназначенные для обмена данными между локальными процессами.&lt;br /&gt;
&lt;br /&gt;
=== Сокеты в файловом пространстве имен ===&lt;br /&gt;
Сокеты в файловом пространстве имен (file namespace, их еще называют «сокеты Unix») используют в качестве адресов имена файлов специального типа. Важной особенностью этих сокетов является то, что соединение с их помощью локального и удаленного приложений невозможно, даже если файловая система, в которой создан сокет, доступна удаленной операционной системе. В следующем фрагменте кода мы создаем сокет и связываем его с файлом socket.soc (полный текст программы-сервера fsserver.c можно найти на диске):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
sock = socket(AF_UNIX, SOCK_DGRAM, 0);&lt;br /&gt;
if (sock &amp;lt; 0)&lt;br /&gt;
{&lt;br /&gt;
  perror(“socket failed”);&lt;br /&gt;
  return EXIT_FAILURE;&lt;br /&gt;
}&lt;br /&gt;
srvr_name.sa_family = AF_UNIX;&lt;br /&gt;
strcpy(srvr_name.sa_data, “socket.soc”);&lt;br /&gt;
if (bind(sock, &amp;amp;srvr_name, strlen(srvr_name.sa_data) + sizeof(srvr_name.sa_family)) &amp;lt; 0)&lt;br /&gt;
{&lt;br /&gt;
  perror(“bind failed”);&lt;br /&gt;
  return EXIT_FAILURE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Константы и функции, необходимые для работы с сокетами в файловом пространстве имен, объявлены в файлах sys/types.h и sys/socket.h. Как и файлы, сокеты в программах представлены дескрипторами. Дескриптор сокета можно получить с помощью функции socket(2). Первый параметр этой функции – домен, к которому принадлежит сокет. Домен сокета обозначает тип соединения (а не доменное имя Интернета, как вы могли бы подумать). Домен, обозначенный константой AF_UNIX, соответствует сокетам в файловом пространстве имен. Второй параметр, socket(), определяет тип сокета. Значение SOCK_DGRAM указывает датаграммный сокет (я предпочитаю этот вариант написания используемому в [1] «дейтаграммный»). Датаграммные сокеты осуществляют ненадежные соединения при передаче данных по сети и допускают широковещательную передачу данных. Другой часто используемый тип сокетов – SOCK_STREAM соответствует потоковым сокетам, реализующим соединения «точка-точка» с надежной передачей данных. Впрочем, в пространстве файловых имен датаграммные сокеты так же надежны, как и потоковые сокеты. Третий параметр функции socket() позволяет указать протокол, используемый для передачи данных. Мы оставляем значение этого параметра равным нулю. В случае ошибки функция socket() возвращает -1.&lt;br /&gt;
&lt;br /&gt;
После получения дескриптора сокета мы вызываем функцию bind(2), которая связывает сокет с заданным адресом (связывать сокет с адресом необходимо в программе-сервере, но не в клиенте). Первым параметром функции является дескриптор, а вторым – указатель на структуру sockaddr (переменная srvr_name), содержащую адрес, на котором регистрируется сервер (третий параметр функции – длина структуры, содержащей адрес). Вместо общей структуры sockaddr для сокетов Unix (сокетов в файловом пространстве имен) можно использовать специализированную структуру sockaddr_un. Поле sockaddr. sa_family позволяет указать семейство адресов, которым мы будем пользоваться. В нашем случае это семейство адресов файловых сокетов Unix AF_UNIX. Сам адрес семейства AF_UNIX (поле sa_data) представляет собой обычное имя файла сокета. После вызова bind() наша программа-сервер становится доступна для соединения по заданному адресу (имени файла).&lt;br /&gt;
&lt;br /&gt;
При обмене данными с датаграммными сокетами мы используем не функции write() и read(), а специальные функции recvfrom(2) и sendto(2). Эти же функции могут применяться и при работе с потоковыми сокетами, но в соответствующем примере мы воспользуемся «сладкой парочкой» read()/write(). Для чтения данных из датаграммного сокета мы используем функцию recvfrom(2), которая по умолчанию блокирует программу до тех пор, пока на входе не появятся новые данные.&lt;br /&gt;
 bytes = recvfrom(sock, buf, sizeof(buf), 0, &amp;amp;rcvr_name, &amp;amp;namelen);&lt;br /&gt;
&lt;br /&gt;
Вызывая функцию recvfrom(), мы передаем ей указатель на еще одну структуру типа sockaddr, в которой функция возвращает данные об адресе клиента, запросившего соединение (в случае файловых сокетов этот параметр не несет полезной информации). Последний параметр функции recvfrom() – указатель на переменную, в которой будет возвращена длина структуры с адресом. Если информация об адресе клиента нас не интересует, мы можем передать значения NULL в предпоследнем и последнем параметрах. По завершении работы с сокетом мы закрываем его с помощью «файловой» функции close(). Перед выходом из программы-сервера следует удалить файл сокета, созданный в результате вызова socket(), что мы и делаем с помощью функции unlink().&lt;br /&gt;
&lt;br /&gt;
Если программа-сервер показалась вам простой, то программаклиент (fsclient.c) будет еще проще. Мы открываем сокет с помощью функции socket() и передаем данные (тестовую строку) серверу с помощью «напарника» recvfrom(), функции sendto(2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
srvr_name.sa_family = AF_UNIX;&lt;br /&gt;
strcpy(srvr_name.sa_data, SOCK_NAME);&lt;br /&gt;
strcpy(buf, “Hello, Unix sockets!”);&lt;br /&gt;
sendto(sock, buf, strlen(buf), 0, &amp;amp;srvr_name,&lt;br /&gt;
strlen(srvr_name.sa_data) + sizeof(srvr_name.sa_family));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый параметр функции sendto() – дескриптор сокета, второй и третий параметры позволяют указать адрес буфера для передачи данных и его длину. Четвертый параметр предназначен для передачи дополнительных флагов. Предпоследний и последний параметры несут информацию об адресе сервера и его длине, соответственно. Если при работе с датаграммными сокетами вызвать функцию connect(2) (см. ниже), то можно не указывать адрес назначения каждый раз (достаточно указать его один раз, как параметр функции connect()). Перед вызовом функции sendto() нам надо заполнить структуру sockaddr (переменную srvr_name) данными об адресе сервера. После окончания передачи данных мы закрываем сокет с помощью close(). Если вы запустите программу-сервер, а затем программу-клиент, то сервер распечатает тестовою строку, переданную клиентом.&lt;br /&gt;
&lt;br /&gt;
=== Парные сокеты ===&lt;br /&gt;
Сокеты в файловом пространстве имен похожи на именованные каналы тем, что для идентификации сокетов используются файлы специального типа. В мире сокетов есть и аналог неименованных каналов – парные сокеты (socket pairs). Как и неименованные каналы, парные сокеты создаются парами и не имеют имен. Естественно, что область применения парных сокетов та же, что и у неименованных каналов, – взаимодействие между родительским и дочерним процессом. Так же как и в случае неименованного канала, первый из дескрипторов используется одним процессом, второй – другим. В качестве примера использования парных сокетов мы рассмотрим программу sockpair.c, создающую два процесса с помощью fork(). Дочерние процессы sockpair.c используют парные сокеты для обмена вежливым английским приветствием.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#define STR1 “How are you?”&lt;br /&gt;
#define STR2 “I’m ok, thank you.”&lt;br /&gt;
#define BUF_SIZE 1024&lt;br /&gt;
int main(int argc, char ** argv)&lt;br /&gt;
{&lt;br /&gt;
  int sockets[2];&lt;br /&gt;
  char buf[BUF_SIZE];&lt;br /&gt;
  int pid;&lt;br /&gt;
  if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) &amp;lt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    perror(“socketpair() failed”);&lt;br /&gt;
    return EXIT_FAILURE;&lt;br /&gt;
  }&lt;br /&gt;
  pid = fork();&lt;br /&gt;
  if (pid != 0)&lt;br /&gt;
  {&lt;br /&gt;
    close(sockets[1]);&lt;br /&gt;
    write(sockets[0], STR1, sizeof(STR1));&lt;br /&gt;
    read(sockets[0], buf, sizeof(buf));&lt;br /&gt;
    printf(“%s\n”, buf);&lt;br /&gt;
    close(sockets[0]);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    close(sockets[0]);&lt;br /&gt;
    read(sockets[1], buf, sizeof(buf));&lt;br /&gt;
    printf(“%s\n”, buf);&lt;br /&gt;
    write(sockets[1], STR2, sizeof(STR2));&lt;br /&gt;
    close(sockets[1]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Парные сокеты создаются функцией socketpair(2). У функции socketpair() четыре параметра. Первые три параметра функции те же, что и у socket(), а четвертым параметром является массив из двух переменных, в которых возвращаются дескрипторы. Дескрипторы сокетов, возвращенные socketpair(), уже готовы к передаче данных, так что мы сразу можем применять к ним функции read()/write(). После вызова fork() каждый процесс получает оба дескриптора, один из которых он должен закрыть. Для закрытия сокета мы используем функцию close().&lt;br /&gt;
&lt;br /&gt;
При взгляде на интерфейс программирования парных сокетов может возникнуть вопрос: а почему, собственно, эти функции относятся к сокетам? Ведь при работе с ними мы не используем ни адреса, ни модель «клиент-сервер». Это верно, но заметьте, что функции socketpair() передаются значения домена и типа сокета, так что и формально, и с точки зрения реализации в системе мы используем настоящие сокеты. Следует отметить, что указание домена в функции socketpair() выглядит явно излишне, поскольку для этой функции система поддерживает только сокеты в домене AF_UNIX (вполне логичное ограничение, если учесть, что парные сокеты не имеют имен и предназначены для обмена данными между родственными процессами).&lt;br /&gt;
&lt;br /&gt;
=== Сетевые сокеты ===&lt;br /&gt;
Мы переходим к рассмотрению самого важного и универсального типа сокетов – сетевых сокетов. Думаю, что о значении, которое имеют сетевые сокеты в Unix-системах, распространяться не нужно. Даже если вы пишете систему приложений, предназначенных для работы на одном компьютере, рассмотрите возможность использования сетевых сокетов для обмена данными между этими приложениями. Возможно, в будущем ваш программный комплекс наберет мощь и возникнет необходимость распределить его компоненты на нескольких машинах. Использование сетевых сокетов сделает процесс масштабирования проекта безболезненным. Впрочем, у сетевых сокетов есть и недостатки. Даже если сокеты используются для обмена данными на одной и той же машине, передаваемые данные должны пройти все уровни сетевого стека, что отрицательно сказывается на быстродействии и нагрузке на систему.&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Остроконечники и тупоконечники&lt;br /&gt;
|Содержание=Именно так переводятся на русский язык термины «little-endian» и «big-endian». В компьютерной литературе эти термины обозначают порядок байтов, используемый процессором для представления простых многобайтовых типов (например, 32-битного целого). В оригинале же (то есть в сказочной повести Дж. Свифта «Гулливер в стране лилипутов») так именовались враждебные общественные течения, приверженцы которых придерживались противоположных взглядов на порядок очистки яйца от скорлупы. Разногласия между остроконечниками и тупоконечниками даже стали причинной войны между Лилипутией и враждебным государством Блефуску.&lt;br /&gt;
&lt;br /&gt;
Впрочем, в компьютерном мире проблемы порядка байтов могут достигать совсем не лилипутских размеров. На процессорах Intel порядок байтов остроконечный, а, например, в системах MacOS X – Power PC Sun SPARC – тупоконечный (если учесть, что Apple отказалась от PowerPC, а Sun заменяет RISC-архитектуры на Opteron, получится, что остроконечники побеждают).&lt;br /&gt;
&lt;br /&gt;
Однако протоколы Интернета используют «тупоконечный» порядок байтов. Для того чтобы избежать путаницы, во всех системах, включая «тупоконечников» рекомендуется использовать функцию htons(). Эта функция «знает» порядок байтов в системе и, если нужно, приводит его в соответствие с принятым в протоколах TCP/IP. В русскоязычном Интернете одно время кочевала статья, в которой утверждалась (впрочем, шутливо), что чуждый для Intel порядок байтов и вызванная этим необходимость в дополнительной операции перестановки являются результатом заговора со стороны гигантских софтверных компаний. В книге [1] используются термины «прямой порядок байтов» для little-endian и «обратный порядок байтов» для big-endian.&lt;br /&gt;
|Ширина=350px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В качестве примера мы рассмотрим комплекс из двух приложений, клиента и сервера, использующих сетевые сокеты для обмена данными. Текст программы сервера вы найдете в файле netserver.c, ниже мы приводим некоторые фрагменты. Прежде всего, мы должны получить дескриптор сокета:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
sock = socket(AF_INET, SOCK_STREAM, 0);&lt;br /&gt;
if (socket &amp;lt; 0)&lt;br /&gt;
{&lt;br /&gt;
  printf(“socket() failed: %d\n”, errno);&lt;br /&gt;
  return EXIT_FAILURE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В первом параметре функции socket() мы передаем константу AF_INET, указывающую на то, что открываемый сокет должен быть сетевым. Значение второго параметра требует, чтобы сокет был потоковым. Далее мы, как и в случае сокета в файловом пространстве имен, вызываем функцию bind():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
serv_addr.sin_family = AF_INET;&lt;br /&gt;
serv_addr.sin_addr.s_addr = INADDR_ANY;&lt;br /&gt;
serv_addr.sin_port = htons(port);&lt;br /&gt;
if (bind(sock, (struct sockaddr *) &amp;amp;serv_addr, sizeof(serv_addr)) &amp;lt; 0)&lt;br /&gt;
{&lt;br /&gt;
  printf(“bind() failed: %d\n”, errno);&lt;br /&gt;
  return EXIT_FAILURE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменная serv_addr, – это структура типа sockaddr_in. Тип sockaddr_in специально предназначен для хранения адресов в формате Интернета. Самое главное отличие sockaddr_in от sockaddr_un – наличие параметра sin_port, предназначенного для хранения значения порта. Функция htons() переписывает двухбайтовое значение порта так, чтобы порядок байтов соответствовал принятому в Интернете (см. врезку). В качестве семейства адресов мы указываем AF_INET (семейство адресов Интернета), а в качестве самого адреса – специальную константу INADDR_ANY. Благодаря этой константе наша программа-сервер зарегистрируется на всех адресах той машины, на которой она выполняется.&lt;br /&gt;
&lt;br /&gt;
Чтобы понять, что мы должны делать дальше, давайте вспомним, как работает сетевая подсистема Unix и, в данном случае, любой другой ОС. Сетевой сервер должен уметь выполнять запросы множества клиентов одновременно (наш сервер netserver.c фактически может обработать запрос только одного клиента, но речь сейчас идет об общем случае). При этом в соединениях «точка-точка», например, при использовании потоковых сокетов, у сервера для каждого клиента должен быть открыт отдельный сокет. Из этого следует, что мы не должны устанавливать соединение с клиентом через сам сокет sock, предназначенный для прослушивания входящих запросов (обычно, при использовании сетевых сокетов мы и не можем этого сделать), иначе все другие попытки соединиться с сервером по указанному адресу и порту будут заблокированы. Вместо этого мы вызываем функцию listen(2), которая переводит сервер в режим ожидания запроса на соединение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
listen(sock, 1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Второй параметр listen() – максимальное число соединений, которые сервер может обрабатывать одновременно. Далее мы вызываем функцию accept(2), которая устанавливает соединение в ответ на запрос клиента:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
newsock = accept(sock, (struct sockaddr *) &amp;amp;cli_addr, &amp;amp;clen);&lt;br /&gt;
if (newsock &amp;lt; 0)&lt;br /&gt;
{&lt;br /&gt;
printf(“accept() failed: %d\n”, errno);&lt;br /&gt;
return EXIT_FAILURE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получив запрос на соединение, функция accept() возвращает новый сокет, открытый для обмена данными с клиентом, запросившим соединение. Сервер как бы перенаправляет запрошенное соединение на другой сокет, оставляя сокет sock свободным для прослушивания запросов на установку соединения. Второй параметр функции accept() содержит сведения об адресе клиента, запросившего соединение, а третий параметр указывает размер второго. Так же, как и при вызове функции recvfom(), мы можем передать NULL в последнем и предпоследнем параметрах. Для чтения и записи данных сервер использует функции read() и write(), а для закрытия сокетов, естественно, close().&lt;br /&gt;
&lt;br /&gt;
В программе-клиенте (netclient.c) нам, прежде всего, нужно решить задачу, с которой мы не сталкивались при написании сервера, а именно: выполнить преобразование доменного имени сервера в его сетевой адрес. Разрешение доменных имен выполняет функция gethostbyname():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
server = gethostbyname(argv[1]);&lt;br /&gt;
if (server == NULL)&lt;br /&gt;
{&lt;br /&gt;
  printf(“Host not found\n”);&lt;br /&gt;
  return EXIT_FAILURE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция получает указатель на строку с Интернет-именем сервера (например, [http://www.unix.com www.unix.com] или 192.168.1.16) и возвращает указатель на структуру hostent (переменная server), которая содержит имя сервера в приемлемом для дальнейшего использования виде. При этом, если необходимо, выполняется разрешение доменного имени в сетевой адрес. Далее мы заполняем поля переменной serv_addr (структуры sockaddr_in) значениями адреса и порта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
serv_addr.sin_family = AF_INET;&lt;br /&gt;
strncpy((char *)&amp;amp;serv_addr.sin_addr.s_addr,&lt;br /&gt;
(char *)server-&amp;gt;h_addr, server-&amp;gt;h_length);&lt;br /&gt;
serv_addr.sin_port = htons(port);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Программа-клиент открывает новый сокет с помощью вызова функции socket() аналогично тому, как это делает сервер (дескриптор сокета, который возвращает socket() мы сохраним в переменной sock), и вызывает функцию connect(2) для установки соединения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (connect(sock, &amp;amp;serv_addr, sizeof(serv_addr)) &amp;lt; 0)&lt;br /&gt;
{&lt;br /&gt;
  printf(“connect() failed: %d”, errno);&lt;br /&gt;
  return EXIT_FAILURE;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь сокет готов к передаче и приему данных. Программа-клиент считывает символы, вводимые пользователем в окне терминала. Когда пользователь нажимает Enter, программа передает данные серверу, ждет ответного сообщения сервера и распечатывает его.&lt;br /&gt;
&lt;br /&gt;
На протяжении этой статьи мы несколько раз упоминали не-блокирующие сокеты. Остановимся на них немного подробнее. О не-блокирующих сокетах вам нужно знать, прежде всего, то, что ими можно не пользоваться. Благодаря многопоточному программированию мы можем использовать блокирующие сокеты во всех ситуациях (и тогда, когда нам нужно обрабатывать несколько сокетов одновременно, и тогда, когда нам требуется возможность прервать операцию, выполняемую над сокетом). Рассмотрим, тем не менее, две функции, необходимые для работы с не-блокирующими сокетами. По умолчанию функция socket() создает блокирующий сокет. Чтобы сделать его не-блокирующим, мы используем функцию fcntl(2):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
sock = socket(PF_INET, SOCK_STREAM, 0);&lt;br /&gt;
fcntl(sock, F_SETFL, O_NONBLOCK);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Рекомендуемая литература:&lt;br /&gt;
|Содержание=# Стивенс У., '''UNIX: Разработка сетевых приложений.''' – СПб.: Питер, 2004&lt;br /&gt;
# W. R. Stevens, S. A. Rago, '''Advanced Programming in the UNIX® Environment: Second Edition''', Addison Wesley Professional, 2005&lt;br /&gt;
|Ширина=350px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь любой вызов функции read() для сокета sock будет возвращать управление сразу же. Если на входе сокета нет данных для чтения, функция read() вернет значение EAGAIN. Для поверки состояния не-блокирующих сокетов можно воспользоваться функцией select(2). Функция select() способна проверять состояние нескольких дескрипторов сокетов (или файлов) сразу. Первый параметр функции – количество проверяемых дескрипторов. Второй, третий и четвертый параметры функции представляют собой наборы дескрипторов, которые следует проверять, соответственно, на готовность к чтению, записи и на наличие исключительных ситуаций. Сама функция select() – блокирующая, она возвращает управление, если хотя бы один из проверяемых сокетов готов к выполнению соответствующей операции. В качестве последнего параметра функции select() можно указать интервал времени, по прошествии которого она вернет управление в любом случае (тайм-аут). Вызов select() для проверки наличия входящих данных на сокете sock может выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
fd_set set;&lt;br /&gt;
struct timeval interval;&lt;br /&gt;
FD_SET(sock, &amp;amp;set);&lt;br /&gt;
tv.tv_sec = 1;&lt;br /&gt;
tv.tv_usec = 500000;&lt;br /&gt;
...&lt;br /&gt;
select(1, &amp;amp;set, NULL, NULL, &amp;amp;tv);&lt;br /&gt;
if (FD_ISSET(sock, &amp;amp;set)&lt;br /&gt;
{&lt;br /&gt;
  // Есть данные для чтения&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, что касается функции select() теперь объявляется в заголовочном файле sys/select.h (раньше объявления элементов функции&lt;br /&gt;
select() были разбросаны по файлам sys/types.h , sys/time.h и stdlib.h). В приведенном фрагмента кода, FD_SET и FD_ISSET – макросы, предназначенные для работы с набором дескрипторов fd_set. На этом мы закончим знакомство с увлекательным миром межпроцессного взаимодействия Linux. Следующая статья будет посвящена управлению процессами, сигналам и потокам.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:ROOT</id>
		<title>LXF83:ROOT</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:ROOT"/>
				<updated>2008-04-26T08:26:28Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Примечения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Продолжая традиции: ROOT ==&lt;br /&gt;
'' '''Часть 3''' Данные мало получить – надо ещё понять, а есть ли от них польза. '''Евгений Балдин''' представляет вашему вниманию «новинку» среди приложений для анализа данных.''&lt;br /&gt;
&lt;br /&gt;
Даже если данных много – их надо как-то проанализировать. Это может сделать только человек. Компьютер в этом деле только помощник. Выбор инструмента очень важен. ROOT – хороший инструмент. У него был достойный предок и он мог бы быть гораздо лучше. Но здесь и сейчас надо анализировать данные, фиксируя недостатки, дабы исправить их в будущем. Это возможно, потому что ROOT – это свободный продукт.&lt;br /&gt;
&lt;br /&gt;
Примерно через десять лет после возникновения команде PAW (Physics Analysis Workstation) стало скучно, и ее лидер PAW Рене Брюн (Ren Brun) сотоварищи начал новый проект ROOT – An Object Oriented Data Analysis Framework &amp;lt;ref&amp;gt;Почему ROOT так называется? У меня есть только догадки: OO — видимо, Object Oriented, а сам ROOT от английского «корень» или «источник» (root). Предполагается, что ROOT — это база для разработок, а не просто система анализа, то есть корень всех …&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Компьютеры стали много мощнее, но и поток данных увеличился. ROOT стал разрабатываться в рамках эксперимента NA49, где поток данных за один заход мог превышает 10 Тб &amp;lt;ref&amp;gt;Таких заходов было чуть меньше 5 тысяч. Грубо, 1 Тб=103 Гб=106 Мб.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
С начала 2006 года ROOT ([http://root.cern.ch/ http://root.cern.ch/]) стал выпускаться под лицензией GNU, и, возможно, скоро попадёт во все основные дис трибутивы GNU/Linux.&lt;br /&gt;
&lt;br /&gt;
=== Сравнение с PAW ===&lt;br /&gt;
PAW является предком ROOT, если уж не в смысле кода, то уж в смысле реализации идей точно. Поэтому полезно понять, чем эти пакеты отличаются и в чём совпадают. Сравнительная таблица не претендует на фундаментальность, а просто отражает личные пристрастия автора.&lt;br /&gt;
&lt;br /&gt;
Почему PAW? Если в вашем проекте PAW уже используется, особых причин для смены инструмента нет. Для стандартных операций анализа ROOT использовать значительно сложнее, чем PAW. Это плата за попытку объять необъятное.&lt;br /&gt;
&lt;br /&gt;
Почему ROOT? &amp;lt;ref&amp;gt;Я слышал такой вариант ответа: «потому что, в отличие от PAW, в графическом окне ROOT можно мышкой подправить экспериментальные данные» – очень надеюсь, что это была шутка.&amp;lt;/ref&amp;gt; С++ популярнее FORTRAN и KUIP. С++ привычнее и с его помощью проще решать задачи, которые являются вспомогательными к анализу – для всего используется один инструмент. ROOT активно поддерживается и развивается. У ROOT есть довольно мощное сообщество. На сайте [http://root.cern.ch http://root.cern.ch] можно найти ответ почти на все вопросы, касающиеся пакета, в RootTalk (там же) можно задать вопрос любой сложности, на который вам с очень большой вероятностью ответят.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;'''Сравнение PAW и ROOT (IMHO)'''&amp;lt;/center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;background:white;color:black;&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#dfcfe6;color:black&amp;quot;&lt;br /&gt;
! Признак&lt;br /&gt;
! PAW&lt;br /&gt;
! ROOT&lt;br /&gt;
|-&lt;br /&gt;
| Авторы &lt;br /&gt;
| Рене Брюн и др. &lt;br /&gt;
| Рене Брюн и др.&lt;br /&gt;
|-&lt;br /&gt;
| Возраст &lt;br /&gt;
| 20 лет &lt;br /&gt;
| Чуть больше 10 лет&lt;br /&gt;
|-&lt;br /&gt;
| GNU &lt;br /&gt;
| Начиная с 2000 года &lt;br /&gt;
| С начала 2006 года&lt;br /&gt;
|-&lt;br /&gt;
| Интерпретатор &lt;br /&gt;
| FORTRAN (COMIS) &lt;br /&gt;
| C++ (CINT)&lt;br /&gt;
|-&lt;br /&gt;
| Командный процессор &lt;br /&gt;
| KUIP &lt;br /&gt;
| C++ (CINT)&lt;br /&gt;
|-&lt;br /&gt;
| Ускорение набора команд &lt;br /&gt;
| Сокращение &lt;br /&gt;
| TAB-completion&lt;br /&gt;
|-&lt;br /&gt;
| Кириллица? &lt;br /&gt;
| Никак &lt;br /&gt;
| Аналогично&lt;br /&gt;
|-&lt;br /&gt;
| Состояние&lt;br /&gt;
| Матёрая, но немного устаревшая система&lt;br /&gt;
| Надо повзрослеть, пора бы уже&lt;br /&gt;
|-&lt;br /&gt;
| Система помощи&lt;br /&gt;
| Подробная официальная документация в &lt;br /&gt;
почти 500 страниц, help в командной строке&lt;br /&gt;
| Пухлое руководство пользователя, &lt;br /&gt;
автодокументация по исходным текстам, но нет help.&lt;br /&gt;
|-&lt;br /&gt;
| Что бы сказал Брукс? &lt;br /&gt;
| Старая школа &lt;br /&gt;
| Все признаки «второй системы»&lt;br /&gt;
|-&lt;br /&gt;
| Что есть? &lt;br /&gt;
| То, что нужно для анализа данных&lt;br /&gt;
| То же, плюс много чего ещё лишнего и не очень&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===  Запускаем ROOT ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_92_1.png|thumb|200px|ROOT в действии – демонстрация.]]&lt;br /&gt;
&lt;br /&gt;
Так как ROOT получил лицензию LGPL совсем недавно, то, скорее всего, в вашем настольном дистрибутиве его нет. Поэтому запуск придётся отложить «на потом» после сборки и установки.&lt;br /&gt;
&lt;br /&gt;
Брать исходные тексты лучше всего с основного сайта: [http://root.cern.ch http://root.cern.ch]. После распаковки дерева пакетов следует внимательно изучить инструкцию README/INSTALL. Сборка стандартная:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; ./configure --prefix=/usr/local ; make ; make install&lt;br /&gt;
&lt;br /&gt;
make install необходимо делать от имени root.&lt;br /&gt;
&lt;br /&gt;
Можно попробовать собрать rpm- или deb-пакет. Собрать deb-пакет под Debian 3.1 (Sarge) без дополнительных телодвижений не удаётся, так как отсутствует пакет, на который указывают зависимости. По-видимому, разработка ведётся для тестовой или нестабильной ветки дистрибутива.&lt;br /&gt;
&lt;br /&gt;
После установки перед запуском необходимо установить переменные окружения. Для bash это будет выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; export ROOTSYS=/usr/local/&lt;br /&gt;
 &amp;gt; export PATH=$PATH:$ROOTSYS/bin&lt;br /&gt;
 &amp;gt; export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ROOTSYS/lib/root&lt;br /&gt;
&lt;br /&gt;
Установка LD_LIBRARY_PATH необходима из-за того, что почти весь функционал ROOT вынесен в разделяемые библиотеки, которые подгружаются во время работы программы. Аналогично можно оформить и свою библиотеку, расширив, таким образом, возможности ROOT.&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь открываем терминал и запускаем ROOT:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt; root&lt;br /&gt;
***********************************************************&lt;br /&gt;
* *&lt;br /&gt;
* W E L C O M E to R O O T *&lt;br /&gt;
* *&lt;br /&gt;
* Version 5.11/02 19 April 2006 *&lt;br /&gt;
* *&lt;br /&gt;
* You are welcome to visit our Web site *&lt;br /&gt;
* http://root.cern.ch *&lt;br /&gt;
* *&lt;br /&gt;
***********************************************************&lt;br /&gt;
&lt;br /&gt;
FreeType Engine v2.1.9 used to render TrueType fonts.&lt;br /&gt;
Compiled on 19 May 2006 for linux with thread support.&lt;br /&gt;
&lt;br /&gt;
CINT/ROOT C/C++ Interpreter version 5.16.11, April 14, 2006&lt;br /&gt;
Type ? for help. Commands must be C++ statements.&lt;br /&gt;
Enclose multiple statements between { }.&lt;br /&gt;
root [0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получив приглашение, можно приступать к работе. Сказать “Hello World” из ROOT можно следующим образом:&lt;br /&gt;
&lt;br /&gt;
 root [0] cout &amp;lt;&amp;lt; “Hello World” &amp;lt;&amp;lt; endl;&lt;br /&gt;
 Hello World&lt;br /&gt;
&lt;br /&gt;
При запуске ROOT считывается файл настроек .rootrc сначала в текущей директории, а, если здесь его нет, то в домашней; затем берётся системный файл /etc/root/system.rootrc. От версии к версии эта последовательность может меняться &amp;lt;ref&amp;gt;В руководстве пользователя в этом месте присутствуют ошибки.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По умолчанию есть ещё три файла, которые могут управлять поведением программы:&lt;br /&gt;
&lt;br /&gt;
* '''rootlogon.C''' – выполняется при запуске,&lt;br /&gt;
* '''rootalias.C''' – загружается при запуске, но не выполняется,&lt;br /&gt;
* '''rootlogoff.C''' – выполняется при завершении сеанса.&lt;br /&gt;
&lt;br /&gt;
ROOT можно запускать и не в интерактивном режиме. Для этого при запуске следует указать опцию -b. Полный список поддерживаемых опций можно получить при указании ключа -h.&lt;br /&gt;
&lt;br /&gt;
Выйти из ROOT можно с помощью команды .q. Если в процессе анализа удалось зациклить программу, то желание выйти можно усилить с&lt;br /&gt;
помощью команд .qqq, .qqqqq или .qqqqqqq &amp;lt;ref&amp;gt;Чем больше q, тем «сильнее» желание.&amp;lt;/ref&amp;gt;. ^C так же может помочь в непредвиденных ситуациях.&lt;br /&gt;
&lt;br /&gt;
=== «Командная логика» ===&lt;br /&gt;
В качестве командного процессора используется интерпретатор С++ CINT. Это означает, что интерактивная работа очень похожа на написание обычной программы. Знание языка C/C++ при «общении» с ROOT является обязательным. Как и для PAW, напишем программу по вычислению чисел Фибоначчи:&lt;br /&gt;
&lt;br /&gt;
 root [0] {&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; int a=0,b=1;&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; “ “ &amp;lt;&amp;lt; b &amp;lt;&amp;lt; “ “;&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; for (int i=2;i&amp;lt;=10;i++) {&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; int x=a; a=b; b=x+b;&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; cout &amp;lt;&amp;lt; b &amp;lt;&amp;lt; “ “;&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; }&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
 end with ‘}’, ‘@’:abort &amp;gt; }&lt;br /&gt;
 0 1 1 2 3 5 8 13 21 34 55&lt;br /&gt;
&lt;br /&gt;
Команды группируются с помощью фигурных скобок. Этот же код можно сохранить в файл fibonacci.cxx и выполнить его как скрипт:&lt;br /&gt;
&lt;br /&gt;
 root [1] .x fibonacci.cxx&lt;br /&gt;
 0 1 1 2 3 5 8 13 21 34 55&lt;br /&gt;
&lt;br /&gt;
В случае C++ окончание команды отмечается «;». Если «;» опустить, то из ROOT получится неплохой калькулятор:&lt;br /&gt;
&lt;br /&gt;
 root [2] 2*sqrt(5)*sin(2*3.14*75/180)/3.14**2&lt;br /&gt;
 (const double)2.27312089125660893e-01&lt;br /&gt;
 root [3] 2**10&lt;br /&gt;
 (const int)1024&lt;br /&gt;
 root [4] 2.**1023&lt;br /&gt;
 (const double)8.98846567431157954e+307&lt;br /&gt;
&lt;br /&gt;
Все вспомогательные команды ROOT начинаются с точки (.). Для выполнения команд оболочки используется команда .!, за которой следуют shell-инструкции:&lt;br /&gt;
&lt;br /&gt;
 root [5] .! ls *.cxx&lt;br /&gt;
 fibonacci.cxx&lt;br /&gt;
&lt;br /&gt;
Полный список вспомогательных команд можно получить с помощью инструкции .?.&lt;br /&gt;
&lt;br /&gt;
Все необходимые для анализа объекты представлены в виде классов. Класс TFile соответствует файлу, в который можно сохранять ROOT-структуры. Объект TTree представляет из себя более изощрённую реализацию идеи ntuple:&lt;br /&gt;
&lt;br /&gt;
 root [6] TFile *f=new TFile(“ee-ang.root”)&lt;br /&gt;
 root [7] TTree *tree;&lt;br /&gt;
 root [8] tree= (TTree *) f-&amp;gt;Get(“h1”);&lt;br /&gt;
 root [9] tree-&amp;gt;Draw(«TAB»&lt;br /&gt;
 void Draw(Option_t* opt)&lt;br /&gt;
 Long64_t Draw(const char* varexp, const TCut&amp;amp; selection, Option_t*&lt;br /&gt;
 option = “”, Long64_t nentries = 1000000000, Long64_t firstentry = 0)&lt;br /&gt;
 Long64_t Draw(const char* varexp, const char* selection, Option_t*&lt;br /&gt;
 option = “”, Long64_t nentries = 1000000000, Long64_t firstentry = 0)&lt;br /&gt;
 root [10] tree-&amp;gt;Draw(“E1”,”E1&amp;lt;2.&amp;amp;&amp;amp;f1==-11&amp;amp;&amp;amp;f2==11”)&lt;br /&gt;
&lt;br /&gt;
В строке [9] после скобки была нажата клавиша Tab, что привело к выводу подсказки по возможным командам. Отсутствие команды help восполняется автоматически создаваемой подсказкой.&lt;br /&gt;
&lt;br /&gt;
=== Графический интерфейс ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_93_1.png|thumb|200px|Пример графического представления гистограммы (канва E1).]]&lt;br /&gt;
&lt;br /&gt;
Графическое окно в ROOT называется «канвой» (объект TCanvas). Можно открыть сколько угодно таких окон:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Создаём новую канву E1.&lt;br /&gt;
root [11] TCanvas *E1=new TCanvas(“E1”)&lt;br /&gt;
//Создаём новую канву cfunc.&lt;br /&gt;
root [12] TCanvas *cfunc=new TCanvas(“func”)&lt;br /&gt;
//Переходим в канву E1.&lt;br /&gt;
root [13] E1-&amp;gt;cd();&lt;br /&gt;
//Рисуем гистограмму по параметру E1 с условием.&lt;br /&gt;
root [14] tree-&amp;gt;Draw(“E1”,”E1&amp;lt;2.&amp;amp;&amp;amp;f1==-11&amp;amp;&amp;amp;f2==11”)&lt;br /&gt;
//Переходим в канву cfunc.&lt;br /&gt;
root [15] cfunc-&amp;gt;cd()&lt;br /&gt;
//Делим канву cfunc на две части по Y.&lt;br /&gt;
root [16] cfunc-&amp;gt;Divide(1,2)&lt;br /&gt;
//Создаём функцию.&lt;br /&gt;
root [17] TF1 f1(“difr”,”0.1+(sin(x)/x)**2”,-10,10)&lt;br /&gt;
//Переходим в верхнюю половину канвы cfunc.&lt;br /&gt;
root [18] cfunc-&amp;gt;cd(1)&lt;br /&gt;
//Отображаем функцию.&lt;br /&gt;
root [19] f1-&amp;gt;Draw()&lt;br /&gt;
//Переходим в нижнюю половину канвы cfunc.&lt;br /&gt;
root [20] cfunc-&amp;gt;cd(2)&lt;br /&gt;
root [21] f1-&amp;gt;Draw()&lt;br /&gt;
//Устанавливаем для нижней половины канвы cfunc&lt;br /&gt;
//логарифмический масштаб для оси Y.&lt;br /&gt;
root [22] cfunc-&amp;gt;cd(2)-&amp;gt;SetLogy()&lt;br /&gt;
//Из канвы cfunc создаём векторный eps-файл.&lt;br /&gt;
root [23] cfunc-&amp;gt;Print(“root-cfunc.eps”)&lt;br /&gt;
//Из канвы E1 создаём растровый png-файл.&lt;br /&gt;
root [24] E1-&amp;gt;Print(“root-E1.png”)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_93_2.png|thumb||200pxПример графического представления функции (канва cfunc).]]&lt;br /&gt;
&lt;br /&gt;
В отличие от своего предка PAW, ROOT позволяет интерактивно менять параметры картинки с помощью выпадающих меню. Тип меню зависит от того, на какой объект направлен указатель мыши. Также с помощью левой кнопки можно интерактивно изменять масштаб графика. Для возврата в исходное состояние в меню, относящемся к выбранной оси, следует выбрать команду UnZoom.&lt;br /&gt;
&lt;br /&gt;
Не стоит этим увлекаться, так как кажущаяся простота увеличивает время, потраченное на создание картинок. В отличие от набранных команд, осмысленные движения и клики мыши сохранить для повторного использования невозможно.&lt;br /&gt;
&lt;br /&gt;
=== Базовые объекты ===&lt;br /&gt;
ROOT унаследовал все базовые объекты анализа, которые были в PAW. Но, в отличие от PAW, ROOT не ограничивается исключительно анализом. Примером такого подхода, например, служит включение в пакет операций для работы с матрицами (линейная алгебра) и базовых средств для манипуляции объектов OpenGL (отображение физических объёмов). ROOT претендует на нечто большее, чем быть просто пакетом анализа, но всё же в этом разделе будут перечислены только те объекты, которые могут пригодиться для представления данных.&lt;br /&gt;
&lt;br /&gt;
=== Гистограммы ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_93_3.png|thumb|200px|Пример подогнанной гистограммы.]]&lt;br /&gt;
&lt;br /&gt;
Гистограмма является одним из основных объектов анализа. По сравнению с PAW, в ROOT было добавлено больше типов гистограмм. Конструктор гистограмм имеет вид TH1F. Для двумерной гистограммы вместо 1 надо подставить 2, а для трёхмерной (да, такие тоже есть, правда, непонятно, как их смотреть) – 3. F означает, что на один бин используется Float_t, аналогично возможны и другие типы переменных для хранения значения в бине.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Создаём новую канву.&lt;br /&gt;
root [25] TCanvas *ch=new TCanvas(“Hist Test”,”Hist”)&lt;br /&gt;
//Создаём гистограмму в 100 бинов от -3. до 3.&lt;br /&gt;
root [26] TH1F *h = new TH1F(“h”,”Hist Test”,100,-3.,3.)&lt;br /&gt;
//Обычно гистограммы заполняются с помощью метода Fill.&lt;br /&gt;
root [27] h-&amp;gt;Fill(«TAB»&lt;br /&gt;
Int_t Fill(Double_t x)&lt;br /&gt;
Int_t Fill(Double_t x, Double_t w)&lt;br /&gt;
Int_t Fill(const char* name, Double_t w)&lt;br /&gt;
//Но мы сейчас идём другим путём:&lt;br /&gt;
// а) создаём функцию G,&lt;br /&gt;
root [28] TF1 *func = new TF1(“G”,”exp(-x**2)”,-3,3)&lt;br /&gt;
// б) заполняем гистограмму случайным образом&lt;br /&gt;
// по форме функции G.&lt;br /&gt;
root [29] h-&amp;gt;FillRandom(“G”,1000)&lt;br /&gt;
//Меняем цвет гистограммы.&lt;br /&gt;
root [30] h-&amp;gt;SetFillColor(45)&lt;br /&gt;
//Подгоняем гистограмму распределением Гаусса&lt;br /&gt;
root [31] h-&amp;gt;Fit(“gaus”)&lt;br /&gt;
…&lt;br /&gt;
//Сохраняем полученную картинку.&lt;br /&gt;
root [32] ch-&amp;gt;Print(“root-histexample.eps”)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подгонкой «заведует» всё тот же Minuit, что был и в PAW, правда, переписанный на C++. Алгоритмы не поменялись.&lt;br /&gt;
&lt;br /&gt;
=== Деревья ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_94_1.png|thumb|200px|Графическое представление дерева lkravg. Видно, что красные точки в среднем ниже чёрных, что и требовалось доказать.]]&lt;br /&gt;
&lt;br /&gt;
Деревья (tree) в ROOT – это логичное развитие идеи ntuple. ntuple, по сути дела, был таблицей со столбцами переменных типа float. В случае деревьев этого ограничения не существует, и в дереве можно сохранять любые объекты.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Создаём файл на диске.&lt;br /&gt;
root [33] TFile *f = new TFile(“lkravg.root”,”RECREATE”)&lt;br /&gt;
//Заводим новое дерево&lt;br /&gt;
root [34] TTree *lkravg = new TTree(“lkravg”,”LKr degrad”)&lt;br /&gt;
//Считаем файл lkravg.dat - тот самый, что “мучили” в&lt;br /&gt;
//статье про PAW&lt;br /&gt;
root [35] Long64_t nlines = lkravg-&amp;gt;ReadFile(“lkravg.dat”,&lt;br /&gt;
//список переменных&lt;br /&gt;
“time:run:avg:avg_er:P:H”)&lt;br /&gt;
root [36] cout &amp;lt;&amp;lt; “Number of lines: “ &amp;lt;&amp;lt; nlines &amp;lt;&amp;lt; endl&lt;br /&gt;
//Рисуем картинку: чёрные маркеры - есть магнитное поле,&lt;br /&gt;
//красные маркеры - нет магнитного поля.&lt;br /&gt;
root [37] lkravg-&amp;gt;SetMarkerStyle(5)&lt;br /&gt;
root [38] lkravg-&amp;gt;Draw(“avg:time”,”H&amp;gt;0.1”)&lt;br /&gt;
root [39] lkravg-&amp;gt;SetMarkerColor(kRed)&lt;br /&gt;
root [40] lkravg-&amp;gt;Draw(“avg:time”,”H&amp;lt;=0.1”,”same”)&lt;br /&gt;
//Пишем дерево в файл и закрываем файл.&lt;br /&gt;
root [41] lkravg-&amp;gt;Write();&lt;br /&gt;
root [42] f-&amp;gt;Close();&lt;br /&gt;
//Теперь этот файл можно открыть&lt;br /&gt;
root [43] TFile *f2 = new TFile(“lkravg2.root”)&lt;br /&gt;
//и посмотреть что в нём есть - дерево сохранилось.&lt;br /&gt;
root [44] .ls&lt;br /&gt;
TFile** lkravg2.root&lt;br /&gt;
TFile* lkravg2.root&lt;br /&gt;
KEY: TTree lkravg;1 LKr degrad&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В ROOT есть множество способов создать и заполнить дерево. Подробности лучше посмотреть в пользовательской документации.&lt;br /&gt;
&lt;br /&gt;
=== Функции ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_94_2.png|thumb|200px|Примеры графического представления двумерной функции или гистограммы. Множество Мандельброта.]]&lt;br /&gt;
&lt;br /&gt;
Как и в PAW, в ROOT есть мощная поддержка функций как объектов. С помощью метода Fit можно подогнать гистограмму или график. Но до этого следует определить функцию, например, так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Файл mandel.cxx&lt;br /&gt;
//Множество Мандельброта&lt;br /&gt;
Double_t mandel(Double_t *XP,Double_t *par) {&lt;br /&gt;
const Int_t nmax=30;&lt;br /&gt;
Double_t xx=0.,yy=0.,tt,x,y;&lt;br /&gt;
x=XP[0];y=XP[1];&lt;br /&gt;
for (Int_t n=1;n&amp;lt;nmax;n++) {&lt;br /&gt;
tt=xx*xx-yy*yy+x;&lt;br /&gt;
yy=2.*xx*yy+y;&lt;br /&gt;
xx=tt;&lt;br /&gt;
if (xx*xx+yy*yy&amp;gt;4.) break;&lt;br /&gt;
}&lt;br /&gt;
return Double_t(n)/Double_t(nmax);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Текст функции следует сохранить в файле mandel.cxx. После с ним можно работать из ROOT:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Загружаем описание функции mandel.cxx.&lt;br /&gt;
//Теперь можно обращаться к функции.&lt;br /&gt;
root [45] .L mandel.cxx&lt;br /&gt;
root [46] TCanvas *cm=new TCanvas(“mandelbrot”,”Mandelbrot”)&lt;br /&gt;
//Создаём объект «двумерная функция» TF2&lt;br /&gt;
root [47] TF2 *Mandelbrot=new&lt;br /&gt;
TF2(“Mandelbrot”,mandel,-2.4,.8,-1.2,1.2,0)&lt;br /&gt;
root [48] cm-&amp;gt;Divide(2,2)&lt;br /&gt;
root [49] cm-&amp;gt;cd(1)&lt;br /&gt;
root [50] Mandelbrot-&amp;gt;SetNpx(«TAB»&lt;br /&gt;
void SetNpx(Int_t npx = 100) // *MENU*&lt;br /&gt;
//Увеличиваем число шагов отображения.&lt;br /&gt;
//Как и в PAW функции отображаются через гистограммы.&lt;br /&gt;
root [51] Mandelbrot-&amp;gt;SetNpx(200)&lt;br /&gt;
root [52] Mandelbrot-&amp;gt;SetNpy(200)&lt;br /&gt;
//Контурное графическое представление.&lt;br /&gt;
root [53] Mandelbrot-&amp;gt;Draw(“cont”)&lt;br /&gt;
root [54] cm-&amp;gt;cd(2)&lt;br /&gt;
//Графическое представление в виде поверхность.&lt;br /&gt;
root [55] Mandelbrot-&amp;gt;Draw(“surf2”)&lt;br /&gt;
root [56] cm-&amp;gt;cd(3)&lt;br /&gt;
//Множество Мандельброта в цилиндрических координатах.&lt;br /&gt;
root [57] Mandelbrot-&amp;gt;Draw(“surf4cyl”)&lt;br /&gt;
root [58] cm-&amp;gt;cd(4)&lt;br /&gt;
//Графическое представление в стиле LEGO.&lt;br /&gt;
root [59] Mandelbrot-&amp;gt;Draw(“lego”)&lt;br /&gt;
root [60] cm-&amp;gt;Print(“root-mandel.eps”)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Интерпретатор C++ (CINT) ===&lt;br /&gt;
Интерпретатор С++ или CINT, который используется в ROOT, был независимым проектом. Сейчас он является составной частью ROOT, но его можно использовать и отдельно. Домашняя страничка CINT доступна по адресу [http://root.cern.ch/root/Cint.html http://root.cern.ch/root/Cint.html].&lt;br /&gt;
&lt;br /&gt;
CINT охватывает примерно 95% конструкций ANSI C и 85% от C++. Следует понимать, что полное соответствие стандартам никогда не было основной целью CINT. Не следует писать больших программ, опираясь на интерпретатор, так как скорость выполнения команд уступает компилируемой версии программы примерно в десять раз. А где один порядок, там и два. Для небольших скриптов автоматизации анализа CINT вполне подходит, но для серьёзных целей надо писать обычные программы. Благо, абсолютно всё, что доступно в ROOT интерактивно, доступно и через библиотечные вызовы. Так уж ROOT сделан.&lt;br /&gt;
&lt;br /&gt;
Для внешних CINT-скриптов есть две полезные команды:&lt;br /&gt;
&lt;br /&gt;
 //Выполняем скрипт script.cxx&lt;br /&gt;
 root [66] .x script.cxx&lt;br /&gt;
 //Загружаем функции, описанные в lib.cxx&lt;br /&gt;
 root [67] .L lib.cxx&lt;br /&gt;
&lt;br /&gt;
Одной из отличительных особенностей ROOT является возможность делать функции из внешних библиотек доступными для выполнения в скриптах CINT или интерактивно. Ниже будет приведён пример, как подключить пользовательскую C-библиотеку.&lt;br /&gt;
&lt;br /&gt;
Допустим, у вас есть C-библиотека, в которой есть функции myfunc1() и myfunc2(char*), которые необходимо экспортировать в среду ROOT. Для этого нужно создать заголовочный файл myfile.h примерно следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*Файл myfile.h*/&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern “C” {&lt;br /&gt;
#endif&lt;br /&gt;
extern void myfunc1();&lt;br /&gt;
extern int myfunc2(char *);&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пока всё как обычно. Чтобы экспортировать функции в ROOT, необходимо создать ещё один заголовочный файл myfileLinkDef.h (к myfile добавляется LinkDef):&lt;br /&gt;
&lt;br /&gt;
 /*Файл myfileLinkDef.h */&lt;br /&gt;
 #ifdef __CINT__&lt;br /&gt;
 #pragma link C++ function myfunc1();&lt;br /&gt;
 #pragma link C++ function myfunc2(char*);&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
Так же можно экспортировать и структуры, подставив вместо слова function слово struct. После создания описанных заголовочных файлов необходимо создать «словарик»:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; rootcint -f myfileDict.cxx -c myfile.h myfileLinkDef.h&lt;br /&gt;
&lt;br /&gt;
В результате будут созданы файлы myfileDict.h и myfileDict.cxx.&lt;br /&gt;
&lt;br /&gt;
Далее нужно собрать саму библиотеку. Пусть для простоты вся библиотека представляет из себя один C-файл myfile.c:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Компилируем myfile.c.&lt;br /&gt;
&amp;gt; gcc -c -fPIC myfile.c&lt;br /&gt;
# Компилируем словарик.&lt;br /&gt;
&amp;gt; g++ -c -fPIC `root-config --cflags` myfileDict.cxx&lt;br /&gt;
# Создаём разделяемую библиотеку.&lt;br /&gt;
&amp;gt; g++ -shared -o myfile.so myfile.o myfileDict.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь эту вновь созданную библиотеку можно загрузить в ROOT для интерактивной работы:&lt;br /&gt;
&lt;br /&gt;
 root [68] gSystem-&amp;gt;Load(“myfile”)&lt;br /&gt;
 root [69] myfunc1()&lt;br /&gt;
 root [70] Int_t icount=myfunc2(“string”)&lt;br /&gt;
&lt;br /&gt;
Это далеко не единственный способ подключить пользовательскую библиотеку к ROOT. Для компиляции скриптов можно использовать подсистему ACLiC.&lt;br /&gt;
&lt;br /&gt;
P.S. Кроме CINT, в среде ROOT можно использовать скрипты, написанные на Python или Ruby. И наоборот: из этих языков можно общаться с библиотеками ROOT. К сожалению, описание этих механизмов выходит за рамки данной статьи.&lt;br /&gt;
&lt;br /&gt;
=== Заключение ===&lt;br /&gt;
Эта статья – не описание ROOT, а всего лишь набор штрихов к его портрету. Для более подробного знакомства настоятельно рекомендуем посетить [http://root.cern.ch http://root.cern.ch].&lt;br /&gt;
&lt;br /&gt;
ROOT – не просто инструмент анализа; это среда для генерации таких инструментов. Он, возможно, неповоротлив и избыточен, но гибок и очень легко расширяем. Это не идеал, но идеал, скорее всего, будет на него похож.&lt;br /&gt;
&lt;br /&gt;
=== Примечения ===&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:Maxima</id>
		<title>LXF83:Maxima</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:Maxima"/>
				<updated>2008-04-26T08:24:32Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Вот под таким углом... */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/Maxima}}&lt;br /&gt;
&lt;br /&gt;
== Maxima: укротитель выражений ==&lt;br /&gt;
'' '''Часть 3''' Сегодня '''Тихон Тарнавский''' расскажет вам о возможностях Maxima по &amp;lt;strike&amp;gt;укрощению&amp;lt;/strike&amp;gt; упрощению выражений, содержащих рациональные, иррациональные и тригонометрические функции.''&lt;br /&gt;
&lt;br /&gt;
В этот раз я расскажу о штатных возможностях Maxima по упрощению и прочим преобразованиям выражений. В частности, речь пойдет об автоматическом раскрытии скобок и вынесении за скобки; об упрощении как арифметических действий над некоторыми элементами, так и выражений с участием степенных, показательных и логарифмических функций; а также об обработке тригонометрических выражений. Все эти функции призваны облегчать читаемость математических формул и повышать простоту их восприятия, а посему стоит уделить этому уроку достаточно внимания: при верном использовании данные манипуляции позволят сэкономить в процессе работы значительное количество времени.&lt;br /&gt;
&lt;br /&gt;
=== Выражаясь рационально... ===&lt;br /&gt;
Существенная часть интересующих нас сегодня функций предназначена для преобразования рациональных выражений. Напомню, рациональным называется выражение, состоящее только из арифметических операторов и возведения в натуральную степень; естественно, элементы такого выражения могут содержать и неарифметические и нестепенные функции – тогда такие элементы с точки зрения рационального выражения считаются атомарными, т.е. неделимыми и непреобразуемыми.&lt;br /&gt;
&lt;br /&gt;
Функции, работающие с рациональными выражениями, описаны в разделе документации «Polynomials»; потому как рациональные функции с математической точки зрения рассматриваются как расширение многочленов (полиномов) – примерно так же, как рациональные числа считаются расширением целых (многочлены, кстати, тоже иногда называют целыми функциями; хотя общий математический смысл этого термина несколько шире).&lt;br /&gt;
&lt;br /&gt;
Имена всех функций Maxima по обработке рациональных выражений содержат буквосочетание rat, но не от слова «крыса», а от слова «rational». И начнем мы знакомство с ними с функции, которая так и называется: rat(выражение). Эта функция преобразовывает рациональное выражение к так называемой канонической форме (Canonical Rational Expression, CRE). То есть раскрывает все скобки, затем приводит все к общему знаменателю, суммирует и сокращает; кроме того, приводит все числа в конечной десятичной записи к рациональным.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_86_1.png]]&lt;br /&gt;
&lt;br /&gt;
Тут надо заметить, что атомарные элементы, т.е. символы и числа, в канонической форме рационального выражения в Maxima имеют другое внутреннее представление. При работе в интерфейсах Maxima и xMaxima об этом напоминает приписка /R/ после имени ячейки вывода (в wxMaxima и TeXmacs такая приписка отсутствует). При этом внешне, на видимом пользователю уровне, каноническая форма ничем, кроме этого обозначения, от общей не отличается. Но один достаточно интересный момент здесь есть: если каноническая форма рационального выражения используется в других рациональных выражениях, то последние также автоматически приводятся к канонической форме:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_86_2.png]]&lt;br /&gt;
&lt;br /&gt;
Это может быть достаточно удобно, если вам нужно пошагово проделать большое количество рациональных преобразований: вы можете, один раз вызвав rat(), ссылаться на предыдущие ячейки и благодаря этому далее автоматически видеть на каждом шаге итоговое выражение в канонической, а значит, достаточно компактной и удобной к восприятию, форме. Если на каком-то этапе такое поведение станет вам мешать, вы можете вернуть выражение из канонической к общей форме с помощью функции ratdisrep(выражение). Кроме того, каноническая форма автоматически «отменяется» и в случае любых преобразований, не являющихся рациональными:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_86_3.png]]&lt;br /&gt;
&lt;br /&gt;
Здесь, хотя %o2 было выражением в канонической форме, %o3 – уже выражение общего вида, так как оно не является рациональным.&lt;br /&gt;
&lt;br /&gt;
Скажем пару слов о приведении конечной десятичной записи чисел к рациональной. Конечная десятичная запись считается по определению приблизительной, что и понятно, т.к. при вычислениях самой Maxima такая запись может возникнуть исключительно при применении приближенных методов либо при ручном указании о переводе числа в десятичную запись из математической, в результате чего результат тоже, вероятнее всего, окажется приблизительным. Эта приблизительность учитывается и при переводе в рациональные числа, а ее уровень, то есть мера, на которую рациональное число при переводе может отклониться от конечной десятичной записи, регулируется переменной ratepsilon, равной по умолчанию 2.0e-8, т.е. 0.00000002. Если такое положение вещей вас не устраивает, вы можете убедить Maxima оставлять десятичную запись чисел как есть, установив в true значение флага keepfloat (по умолчанию он равен false).&lt;br /&gt;
&lt;br /&gt;
Следующая функция раскрывает скобки в рациональном выражении и называется ratexpand() (одно из значений слова expand и есть «раскрыть скобки»). Здесь также действует опция keepfloat. Кроме нее, есть еще одна опция – ratdenomdivide; по умолчанию она установлена в true, что приводит к тому, что каждая дробь, в которой числитель является суммой, распадается на сумму дробей с одинаковым знаменателем. Если же сбросить эту опцию в false, тогда все дроби с одинаковым знаменателем будут, напротив, объединены в одну дробь с числителем в виде суммы числителей изначальных дробей. То есть внешне результат будет в этом случае выглядеть почти так же, как и у функции rat(); к тому же единственная видимая пользователю разница проявляется только в рациональных выражениях от нескольких переменных (или различных иррациональных выражений). Заключается эта разница в том, что после ratexpand() и в числителе, и в знаменателе дроби все скобки будут раскрыты, в случае же rat() слагаемые, где присутствуют, скажем, две переменных, будут сгруппированы, и одна из них будет вынесена за скобки (в документации такая форма записи называется «рекурсивной» (recursive):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_1.png]]&lt;br /&gt;
&lt;br /&gt;
Кроме того, разница, конечно, заключается и во внутреннем представлении: с точки зрения программы, после ratexpand() выражение будет по-прежнему общего вида. Соответственно и все результаты дальнейших рациональных действий с выражением не будут автоматически «канонизироваться». Я специально обращаю ваше внимание на схожесть между результатами этих двух различных функций, поскольку в документации эта схожесть никак не обозначена: в описании обеих функций и примерах к ним нет вообще никаких ссылок друг на друга.&lt;br /&gt;
&lt;br /&gt;
Помимо флага ratdenomdivide, есть также функция, собирающая воедино дроби с одинаковыми знаменателями; зовут ее combine():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_2.png]]&lt;br /&gt;
&lt;br /&gt;
В дополнение к функции ratexpand() есть также флаг ratexpand, который по умолчанию равен false, а будучи установлен в true, приводит к тому, что все рациональные выражения в канонической форме отображаются и преобразовываются к общему виду сразу же с раскрытыми скобками:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_3.png]]&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что при применении этого флага выражение сохраняет каноническую форму.&lt;br /&gt;
&lt;br /&gt;
Действует в этом случае и флаг ratdenomdivide (напомню, что в строке %i1 этот флаг был установлен локально, используя сокращенную запись функции ev()):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_4.png]]&lt;br /&gt;
&lt;br /&gt;
Иными словами, флаг ratexpand по своему действию аналогичен одноименной функции, но действует он на все без исключения канонические рациональные выражения и при этом оставляет их в канонической внутренней записи и изменяет только внешнее отображение этой записи, сохраняя при этом и дальнейшую автоматическую «канонизацию».&lt;br /&gt;
&lt;br /&gt;
=== ...и не только рационально. ===&lt;br /&gt;
Помимо ratexpand() есть также и функция «просто» expand(). Различий между ними несколько, наиболее принципиальные таковы. Во-первых, ratexpand() раскрывает только рациональное выражение «верхнего уровня», все же подвыражения, не являющиеся рациональными, обрабатываются как атомарные, то есть внутрь них она не залезает; expand() же раскрывает скобки на всех уровнях вложенности:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_5.png]]&lt;br /&gt;
&lt;br /&gt;
Во-вторых, ratexpand() приводит дроби-слагаемые к общему знаменателю, а expand() этого не делает; в-третьих, на функцию expand не действует переключатель ratdenomdivide:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_6.png]]&lt;br /&gt;
&lt;br /&gt;
И в-четвертых, expand() не преобразовывает к рациональным числам конечную десятичную запись – опять-таки, вне зависимости от флага keepfloat.&lt;br /&gt;
&lt;br /&gt;
Функция expand(), в отличие от своего рационального сородича, имеет несколько вариаций – в виде отдельных функций с похожими названиями, которые раскрывают скобки несколько по-разному. Первую мы уже рассмотрели. Вторая называется expandwrt(выражение, x, y, ..., v), где wrt расшифровывается как «with respect to...», то есть «относительно...». Она раскрывает скобки не везде, а только относительно тех символов, которые заданы в списке аргументов после выражения. Другими словами, только там, где из скобок можно вынести хотя бы один из перечисленных символов:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_7.png]]&lt;br /&gt;
&lt;br /&gt;
(На предупреждение, возникающее при первом вызове функций expandwrt*(), можете не обращать внимания – на функционале, о котором идет речь, оно никоим образом не отражается.)&lt;br /&gt;
&lt;br /&gt;
Если в выражении встречаются дроби, то по умолчанию эта функция раскрывает скобки только в их числителях, оставляя знаменатели в покое. Изменить это поведение можно переключателем expandwrt_denom, установив его в true (по умолчанию он равен false):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_1.png]]&lt;br /&gt;
&lt;br /&gt;
И, наконец, последняя функция из этого семейства – expandwrt_factored(выражение, x, y, ..., v) – раскрывает скобки лишь в тех слагаемых, где упомянутые символы встречаются не в одном, а в каждом из сомножителей:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_2.png]]&lt;br /&gt;
&lt;br /&gt;
Раскрытием возведения в целую степень можно управлять как в контексте функции expand(), так и отдельно. В первом случае применяются переменные maxposex и maxnegex, определяющие соответственно максимальные положительный и отрицательный показатель степени, которые будут раскрываться этой функцией. По умолчанию оба параметра равны 1000. Переназначить их можно не только глобально, но и в контексте одного конкретного вызова функции expand() – в таком случае это делается с помощью дополнительных аргументов, задаваемых после выражения:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_3.png]]&lt;br /&gt;
&lt;br /&gt;
В противовес maxposex и maxnegex можно задать максимальные положительную и отрицательную степени, которые будут раскрываться автоматически, без вызова функций группы expand. За это отвечают переменные expop и expon, и по умолчанию они равны нулю, то есть автоматически степени не раскрываются вообще.&lt;br /&gt;
&lt;br /&gt;
Кроме самостоятельной функции expand(), существуют также флаги expand и expand(p, n) у функции ev(). Запись выражение, expand равносильна expand(ev(выражение)), а выражение, expand(p, n) – expand(ev(выражение, p, n)).&lt;br /&gt;
&lt;br /&gt;
Возможности управлять раскрытием скобок на этом не заканчиваются. Еще одна функция – distrib() – представляет как бы облегченный вариант expand(). Она действует аналогично expand(), но только на один уровень в глубину:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_4.png]]&lt;br /&gt;
&lt;br /&gt;
В противоположность функциям *expand*(), раскрывающим скобки, можно также и разложить выражение на множители, то есть максимально повыносить все за скобки. Делается это с помощью функции factor():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_5.png]]&lt;br /&gt;
&lt;br /&gt;
Если функции factor() передать целое число, она разложит его на простые множители; если же передать рациональное число – на множители будут разложены его числитель и знаменатель:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_6.png]]&lt;br /&gt;
&lt;br /&gt;
Если многочлен не может быть представлен в виде произведения нескольких сомножителей, его можно попытаться преобразовать в сумму таких произведений с помощью функции factorsum():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_7.png]]&lt;br /&gt;
&lt;br /&gt;
Функция factorsum() умеет раскладывать на множители только независимые слагаемые, то есть такие, которые не содержат одинаковых переменных. Если мы раскроем скобки в выражении, содержащем в двух разных местах один и тот же символ, то так как коэффициенты при этом символе после раскрытия сгруппируются, factorsum() не сможет понять, каким именно образом разгруппировать их обратно:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_8.png]]&lt;br /&gt;
&lt;br /&gt;
Нужно заметить, что функции factor() и factorsum(), хотя и не имеют в имени приставки rat, все же ведут себя в смысле разбора передаваемых им выражений не как expand() и сопутствующие, а как ratexpend(); то есть на любой не-рациональной функции останавливаются и внутрь не идут:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_9.png]]&lt;br /&gt;
&lt;br /&gt;
Впрочем, об этом можно догадаться из документации, так как функции factor* описаны не в разделе Simplification, куда относятся expand*, а, так же, как и rat*, в разделе Polynomials.&lt;br /&gt;
&lt;br /&gt;
Выносить за скобки, а также раскрывать эти скобки можно не только специальной функцией, но и дополнительным флагом ко все той же канонической форме рациональных выражений. Флаг этот зовут ratfac, и по умолчанию он равен false, то есть вынесение за скобки не происходит. Если же его установить в true, то в каждом рациональном выражении, приведенном к канонической форме, все будет максимально вынесено за скобки, но без вызова функции factor(); например, в примере ниже не произошло обратного свертывания (x+1)&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, хотя, будучи применен к первоначальному выражению, флаг ratfac сохранил и этот множитель нераскрытым (также можете сравнить этот пример с аналогичным примером к функциям ratexpand() и rat()):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Проще простого ===&lt;br /&gt;
Итак, о преобразованиях выражений мы уже поговорили достаточно – теперь перейдем к их упрощению. Об элементарных упрощениях мы уже говорили в предыдущий раз: они могут производиться автоматически, на что влияет установленный флаг simp; и по умолчанию именно так и происходит.&lt;br /&gt;
&lt;br /&gt;
Здесь тоже все начинается с рациональных выражений, которыми занимается функция ratsimp(выражение). Она упрощает выражение за счет рациональных преобразований, но, в отличие от остальных функций по обработке рациональных выражений, работает в том числе и «вглубь», то есть иррациональные части выражения не рассматриваются как атомарные, а упрощаются, в том числе, и все рациональные элементы внутри них:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_2.png]]&lt;br /&gt;
&lt;br /&gt;
На ratsimp() действуют те же флаги, что и на rat(): и ratexpand, и keepfloat, и ratfac. Но отличается она от rat() или ratexpand() не только умением работать «в глубину», но и некоторыми дополнительными рациональными преобразованиями, которые не поддерживаются этими двумя функциями:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_3.png]]&lt;br /&gt;
&lt;br /&gt;
Кроме функции ratsimp(), есть еще и дополнительный переключатель – ratsimpexpons. По умолчанию он установлен в false; если же назначить ему значение true – это приведет к автоматическому упрощению показателей степени:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_4.png]]&lt;br /&gt;
&lt;br /&gt;
Функция ratsimp() – это уже достаточно мощный, и в то же время весьма быстрый, механизм упрощения; но, конечно, не достаточный: ведь те действия, которые можно упростить в разнообразных математических выражениях, не ограничиваются рациональными. Поэтому все же основной плюс этой функции – это скорость. А для более серьезных упрощений существует расширенный вариант – fullratsimp(выражение). Эта функция последовательно применяет к переданному выражению функцию ratsimp(), а также некоторые нерациональные преобразования – и повторяет эти действия в цикле до тех пор, пока выражение не перестанет в процессе них изменяться. За счет этого функция работает несколько медленнее, чем ratsimp(), зато дает более надежный результат – к некоторым выражениям, которые она может упростить с ходу, ratsimp() пришлось бы применять несколько раз, а иногда та и вообще не справилась бы с задачей.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_5.png]]&lt;br /&gt;
&lt;br /&gt;
И третья основная функция упрощения выражений – уже никак с предыдущими двумя не соотносящаяся – radcan(выражение). Если ratsimp() и fullratsimp() ориентированы на упрощение рациональных действий, то radcan() занимается упрощением логарифмических, экспоненциальных функций и степенных с нецелыми рациональными показателями, то есть корней (радикалов). Например, выражение из второго примера в этом разделе radcan() сможет упростить сильнее, чем ratsimp()/fullratsimp():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_90_1.png]]&lt;br /&gt;
&lt;br /&gt;
В некоторых случаях наилучшего результата можно добиться, комбинируя radcan() с ratsimp() или fullratsimp().&lt;br /&gt;
&lt;br /&gt;
С функцией radcan() смежны по действию еще два управляющих ключа. Один из них называется %e_to_numlog. Влияет он не на саму функцию, а на автоматическое упрощение. Если выставить его в true, то выражения вида e&amp;lt;sup&amp;gt;(r*log(выражение))&amp;lt;/sup&amp;gt;, где r – рациональное число, будут автоматически раскрываться в выражениеr. Функция radcan() делает такие преобразования независимо от значения ключа. Второй ключ – radexpand (от radical, не путать с ratexpand) – влияет на упрощение квадратного корня из четной степени какого-либо выражения. Он, в отличие от большинства переключателей, имеет не два, а три значения: при значении all, sqrt(x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) будет раскрываться в x – как для действительных, так и для комплексных чисел; при значении true (по умолчанию), sqrt(x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) для действительных чисел превращается в |x|, а для комплексных не преобразуется; а при значении false, sqrt(x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) не будет упрощаться вообще.&lt;br /&gt;
&lt;br /&gt;
Следующие две функции и один флаг относятся к упрощению факториалов. Функция factcomb(выражение) проводит упрощения вида n!*(n+1) = (n+1)! и тому подобные. Функция minfactorial, напротив, сокращает факториалы, то есть действует по принципу n!/(n–1)! = n. И флаг sumsplitfact, который изначально установлен в true, находясь в состоянии false, приводит к тому, что после того, как отработает factcomb, minfactorial вызывается автоматически.&lt;br /&gt;
&lt;br /&gt;
=== Вот под таким углом... ===&lt;br /&gt;
И напоследок поговорим о функциях для преобразования тригонометрических формул. Здесь так же, как и у рациональных функций, присутствует общая для всех приставка – trig; расшифровывать ее, думаю, особой нужды нет. Начнем по традиции с функции trigexpand(выражение). Она, как нетрудно догадаться, раскрывает скобки в тригонометрических выражениях:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_90_2.png]]&lt;br /&gt;
&lt;br /&gt;
Здесь, как обычно, есть несколько управляющих флагов, первый из которых опять же является тезкой самой функции. Он приводит к повторному раскрытию всех синусов-косинусов, то есть фактически равнозначен повторному вызову самой функции:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_90_2.png]]&lt;br /&gt;
&lt;br /&gt;
Второй флаг – halfangles – управляет раскрытием формул половинных углов. Оба эти флага по умолчанию сброшены. А следующие два флага – trigexpandplus и trigexpandtimes – отвечают соответственно за применение формул сумм углов и кратных углов. То есть в примере выше сначала сработал флаг trigexpandplus, а затем – trigexpandtimes. Эти флаги по умолчанию установлены, что и видно из примера.&lt;br /&gt;
&lt;br /&gt;
Кроме всего уже упомянутого, есть еще флаги trigsign и triginverses. Первый принимает традиционные два значения (по умолчанию – true) и регулирует вынос знака за пределы тригонометрической функции, то есть, к примеру, sin(–x) упростится до –sin(x), а cos(–x) – до cos(x). Флаг triginverses – трехзначный, и умолчательное его значение равно all. Он отвечает за обработку сочетаний вида sin(asin(x)) или atan(tan(x)). Значение all позволяет раскрывать эти сочетания в обоих направлениях (напомню, что при этом часть корней будет теряться); значение true оставляет разрешенным раскрытие только вида sin(asin(x)), то есть блокирует вариант с потерями периодических значений; а случай false запрещает оба направления преобразований.&lt;br /&gt;
&lt;br /&gt;
Функция, обратная trigexpand(), называется trigreduce(выражение) – здесь, в полном соответствии со значением слова reduce, действуют формулы понижения степени. Например, применив дважды эту функцию к результату предыдущего примера, мы получим его в исходном виде (см. рис. наверху страницы).&lt;br /&gt;
&lt;br /&gt;
Эту функцию можно вызвать с более полным списком аргументов: trigreduce(выражение, переменная) – тогда формулы понижения степени будут применяться только по отношению к заданной переменной (переменная может быть, как и почти везде, не только отдельным символом, но и выражением).&lt;br /&gt;
&lt;br /&gt;
Третья функция занимается уже упрощением, и зовут ее, соответственно, trigsimp(выражение). Она старается упростить любое тригонометрическое выражение, используя известные формулы, такие как sin&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(x)+cos&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(x)=1 и тому подобные. Для наилучшего результата ее можно комбинировать с trigreduce(), ratsimp()/fullratsimp() и radcan().&lt;br /&gt;
&lt;br /&gt;
Этим возможности Maxima по преобразованию и упрощению разнообразных выражений еще не совсем исчерпаны, но основные из них мы рассмотрели в полной мере. В следующий раз поговорим немного о применении некоторых встроенных функций, о работе с векторами, матрицами и множествами и, возможно, о работе с логикой, с уравнениями и неравенствами, а также их системами.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:Maxima</id>
		<title>LXF83:Maxima</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:Maxima"/>
				<updated>2008-04-26T08:24:02Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/Maxima}}&lt;br /&gt;
&lt;br /&gt;
== Maxima: укротитель выражений ==&lt;br /&gt;
'' '''Часть 3''' Сегодня '''Тихон Тарнавский''' расскажет вам о возможностях Maxima по &amp;lt;strike&amp;gt;укрощению&amp;lt;/strike&amp;gt; упрощению выражений, содержащих рациональные, иррациональные и тригонометрические функции.''&lt;br /&gt;
&lt;br /&gt;
В этот раз я расскажу о штатных возможностях Maxima по упрощению и прочим преобразованиям выражений. В частности, речь пойдет об автоматическом раскрытии скобок и вынесении за скобки; об упрощении как арифметических действий над некоторыми элементами, так и выражений с участием степенных, показательных и логарифмических функций; а также об обработке тригонометрических выражений. Все эти функции призваны облегчать читаемость математических формул и повышать простоту их восприятия, а посему стоит уделить этому уроку достаточно внимания: при верном использовании данные манипуляции позволят сэкономить в процессе работы значительное количество времени.&lt;br /&gt;
&lt;br /&gt;
=== Выражаясь рационально... ===&lt;br /&gt;
Существенная часть интересующих нас сегодня функций предназначена для преобразования рациональных выражений. Напомню, рациональным называется выражение, состоящее только из арифметических операторов и возведения в натуральную степень; естественно, элементы такого выражения могут содержать и неарифметические и нестепенные функции – тогда такие элементы с точки зрения рационального выражения считаются атомарными, т.е. неделимыми и непреобразуемыми.&lt;br /&gt;
&lt;br /&gt;
Функции, работающие с рациональными выражениями, описаны в разделе документации «Polynomials»; потому как рациональные функции с математической точки зрения рассматриваются как расширение многочленов (полиномов) – примерно так же, как рациональные числа считаются расширением целых (многочлены, кстати, тоже иногда называют целыми функциями; хотя общий математический смысл этого термина несколько шире).&lt;br /&gt;
&lt;br /&gt;
Имена всех функций Maxima по обработке рациональных выражений содержат буквосочетание rat, но не от слова «крыса», а от слова «rational». И начнем мы знакомство с ними с функции, которая так и называется: rat(выражение). Эта функция преобразовывает рациональное выражение к так называемой канонической форме (Canonical Rational Expression, CRE). То есть раскрывает все скобки, затем приводит все к общему знаменателю, суммирует и сокращает; кроме того, приводит все числа в конечной десятичной записи к рациональным.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_86_1.png]]&lt;br /&gt;
&lt;br /&gt;
Тут надо заметить, что атомарные элементы, т.е. символы и числа, в канонической форме рационального выражения в Maxima имеют другое внутреннее представление. При работе в интерфейсах Maxima и xMaxima об этом напоминает приписка /R/ после имени ячейки вывода (в wxMaxima и TeXmacs такая приписка отсутствует). При этом внешне, на видимом пользователю уровне, каноническая форма ничем, кроме этого обозначения, от общей не отличается. Но один достаточно интересный момент здесь есть: если каноническая форма рационального выражения используется в других рациональных выражениях, то последние также автоматически приводятся к канонической форме:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_86_2.png]]&lt;br /&gt;
&lt;br /&gt;
Это может быть достаточно удобно, если вам нужно пошагово проделать большое количество рациональных преобразований: вы можете, один раз вызвав rat(), ссылаться на предыдущие ячейки и благодаря этому далее автоматически видеть на каждом шаге итоговое выражение в канонической, а значит, достаточно компактной и удобной к восприятию, форме. Если на каком-то этапе такое поведение станет вам мешать, вы можете вернуть выражение из канонической к общей форме с помощью функции ratdisrep(выражение). Кроме того, каноническая форма автоматически «отменяется» и в случае любых преобразований, не являющихся рациональными:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_86_3.png]]&lt;br /&gt;
&lt;br /&gt;
Здесь, хотя %o2 было выражением в канонической форме, %o3 – уже выражение общего вида, так как оно не является рациональным.&lt;br /&gt;
&lt;br /&gt;
Скажем пару слов о приведении конечной десятичной записи чисел к рациональной. Конечная десятичная запись считается по определению приблизительной, что и понятно, т.к. при вычислениях самой Maxima такая запись может возникнуть исключительно при применении приближенных методов либо при ручном указании о переводе числа в десятичную запись из математической, в результате чего результат тоже, вероятнее всего, окажется приблизительным. Эта приблизительность учитывается и при переводе в рациональные числа, а ее уровень, то есть мера, на которую рациональное число при переводе может отклониться от конечной десятичной записи, регулируется переменной ratepsilon, равной по умолчанию 2.0e-8, т.е. 0.00000002. Если такое положение вещей вас не устраивает, вы можете убедить Maxima оставлять десятичную запись чисел как есть, установив в true значение флага keepfloat (по умолчанию он равен false).&lt;br /&gt;
&lt;br /&gt;
Следующая функция раскрывает скобки в рациональном выражении и называется ratexpand() (одно из значений слова expand и есть «раскрыть скобки»). Здесь также действует опция keepfloat. Кроме нее, есть еще одна опция – ratdenomdivide; по умолчанию она установлена в true, что приводит к тому, что каждая дробь, в которой числитель является суммой, распадается на сумму дробей с одинаковым знаменателем. Если же сбросить эту опцию в false, тогда все дроби с одинаковым знаменателем будут, напротив, объединены в одну дробь с числителем в виде суммы числителей изначальных дробей. То есть внешне результат будет в этом случае выглядеть почти так же, как и у функции rat(); к тому же единственная видимая пользователю разница проявляется только в рациональных выражениях от нескольких переменных (или различных иррациональных выражений). Заключается эта разница в том, что после ratexpand() и в числителе, и в знаменателе дроби все скобки будут раскрыты, в случае же rat() слагаемые, где присутствуют, скажем, две переменных, будут сгруппированы, и одна из них будет вынесена за скобки (в документации такая форма записи называется «рекурсивной» (recursive):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_1.png]]&lt;br /&gt;
&lt;br /&gt;
Кроме того, разница, конечно, заключается и во внутреннем представлении: с точки зрения программы, после ratexpand() выражение будет по-прежнему общего вида. Соответственно и все результаты дальнейших рациональных действий с выражением не будут автоматически «канонизироваться». Я специально обращаю ваше внимание на схожесть между результатами этих двух различных функций, поскольку в документации эта схожесть никак не обозначена: в описании обеих функций и примерах к ним нет вообще никаких ссылок друг на друга.&lt;br /&gt;
&lt;br /&gt;
Помимо флага ratdenomdivide, есть также функция, собирающая воедино дроби с одинаковыми знаменателями; зовут ее combine():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_2.png]]&lt;br /&gt;
&lt;br /&gt;
В дополнение к функции ratexpand() есть также флаг ratexpand, который по умолчанию равен false, а будучи установлен в true, приводит к тому, что все рациональные выражения в канонической форме отображаются и преобразовываются к общему виду сразу же с раскрытыми скобками:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_3.png]]&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что при применении этого флага выражение сохраняет каноническую форму.&lt;br /&gt;
&lt;br /&gt;
Действует в этом случае и флаг ratdenomdivide (напомню, что в строке %i1 этот флаг был установлен локально, используя сокращенную запись функции ev()):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_4.png]]&lt;br /&gt;
&lt;br /&gt;
Иными словами, флаг ratexpand по своему действию аналогичен одноименной функции, но действует он на все без исключения канонические рациональные выражения и при этом оставляет их в канонической внутренней записи и изменяет только внешнее отображение этой записи, сохраняя при этом и дальнейшую автоматическую «канонизацию».&lt;br /&gt;
&lt;br /&gt;
=== ...и не только рационально. ===&lt;br /&gt;
Помимо ratexpand() есть также и функция «просто» expand(). Различий между ними несколько, наиболее принципиальные таковы. Во-первых, ratexpand() раскрывает только рациональное выражение «верхнего уровня», все же подвыражения, не являющиеся рациональными, обрабатываются как атомарные, то есть внутрь них она не залезает; expand() же раскрывает скобки на всех уровнях вложенности:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_5.png]]&lt;br /&gt;
&lt;br /&gt;
Во-вторых, ratexpand() приводит дроби-слагаемые к общему знаменателю, а expand() этого не делает; в-третьих, на функцию expand не действует переключатель ratdenomdivide:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_6.png]]&lt;br /&gt;
&lt;br /&gt;
И в-четвертых, expand() не преобразовывает к рациональным числам конечную десятичную запись – опять-таки, вне зависимости от флага keepfloat.&lt;br /&gt;
&lt;br /&gt;
Функция expand(), в отличие от своего рационального сородича, имеет несколько вариаций – в виде отдельных функций с похожими названиями, которые раскрывают скобки несколько по-разному. Первую мы уже рассмотрели. Вторая называется expandwrt(выражение, x, y, ..., v), где wrt расшифровывается как «with respect to...», то есть «относительно...». Она раскрывает скобки не везде, а только относительно тех символов, которые заданы в списке аргументов после выражения. Другими словами, только там, где из скобок можно вынести хотя бы один из перечисленных символов:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_87_7.png]]&lt;br /&gt;
&lt;br /&gt;
(На предупреждение, возникающее при первом вызове функций expandwrt*(), можете не обращать внимания – на функционале, о котором идет речь, оно никоим образом не отражается.)&lt;br /&gt;
&lt;br /&gt;
Если в выражении встречаются дроби, то по умолчанию эта функция раскрывает скобки только в их числителях, оставляя знаменатели в покое. Изменить это поведение можно переключателем expandwrt_denom, установив его в true (по умолчанию он равен false):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_1.png]]&lt;br /&gt;
&lt;br /&gt;
И, наконец, последняя функция из этого семейства – expandwrt_factored(выражение, x, y, ..., v) – раскрывает скобки лишь в тех слагаемых, где упомянутые символы встречаются не в одном, а в каждом из сомножителей:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_2.png]]&lt;br /&gt;
&lt;br /&gt;
Раскрытием возведения в целую степень можно управлять как в контексте функции expand(), так и отдельно. В первом случае применяются переменные maxposex и maxnegex, определяющие соответственно максимальные положительный и отрицательный показатель степени, которые будут раскрываться этой функцией. По умолчанию оба параметра равны 1000. Переназначить их можно не только глобально, но и в контексте одного конкретного вызова функции expand() – в таком случае это делается с помощью дополнительных аргументов, задаваемых после выражения:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_3.png]]&lt;br /&gt;
&lt;br /&gt;
В противовес maxposex и maxnegex можно задать максимальные положительную и отрицательную степени, которые будут раскрываться автоматически, без вызова функций группы expand. За это отвечают переменные expop и expon, и по умолчанию они равны нулю, то есть автоматически степени не раскрываются вообще.&lt;br /&gt;
&lt;br /&gt;
Кроме самостоятельной функции expand(), существуют также флаги expand и expand(p, n) у функции ev(). Запись выражение, expand равносильна expand(ev(выражение)), а выражение, expand(p, n) – expand(ev(выражение, p, n)).&lt;br /&gt;
&lt;br /&gt;
Возможности управлять раскрытием скобок на этом не заканчиваются. Еще одна функция – distrib() – представляет как бы облегченный вариант expand(). Она действует аналогично expand(), но только на один уровень в глубину:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_4.png]]&lt;br /&gt;
&lt;br /&gt;
В противоположность функциям *expand*(), раскрывающим скобки, можно также и разложить выражение на множители, то есть максимально повыносить все за скобки. Делается это с помощью функции factor():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_5.png]]&lt;br /&gt;
&lt;br /&gt;
Если функции factor() передать целое число, она разложит его на простые множители; если же передать рациональное число – на множители будут разложены его числитель и знаменатель:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_6.png]]&lt;br /&gt;
&lt;br /&gt;
Если многочлен не может быть представлен в виде произведения нескольких сомножителей, его можно попытаться преобразовать в сумму таких произведений с помощью функции factorsum():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_7.png]]&lt;br /&gt;
&lt;br /&gt;
Функция factorsum() умеет раскладывать на множители только независимые слагаемые, то есть такие, которые не содержат одинаковых переменных. Если мы раскроем скобки в выражении, содержащем в двух разных местах один и тот же символ, то так как коэффициенты при этом символе после раскрытия сгруппируются, factorsum() не сможет понять, каким именно образом разгруппировать их обратно:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_8.png]]&lt;br /&gt;
&lt;br /&gt;
Нужно заметить, что функции factor() и factorsum(), хотя и не имеют в имени приставки rat, все же ведут себя в смысле разбора передаваемых им выражений не как expand() и сопутствующие, а как ratexpend(); то есть на любой не-рациональной функции останавливаются и внутрь не идут:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_88_9.png]]&lt;br /&gt;
&lt;br /&gt;
Впрочем, об этом можно догадаться из документации, так как функции factor* описаны не в разделе Simplification, куда относятся expand*, а, так же, как и rat*, в разделе Polynomials.&lt;br /&gt;
&lt;br /&gt;
Выносить за скобки, а также раскрывать эти скобки можно не только специальной функцией, но и дополнительным флагом ко все той же канонической форме рациональных выражений. Флаг этот зовут ratfac, и по умолчанию он равен false, то есть вынесение за скобки не происходит. Если же его установить в true, то в каждом рациональном выражении, приведенном к канонической форме, все будет максимально вынесено за скобки, но без вызова функции factor(); например, в примере ниже не произошло обратного свертывания (x+1)&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, хотя, будучи применен к первоначальному выражению, флаг ratfac сохранил и этот множитель нераскрытым (также можете сравнить этот пример с аналогичным примером к функциям ratexpand() и rat()):&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Проще простого ===&lt;br /&gt;
Итак, о преобразованиях выражений мы уже поговорили достаточно – теперь перейдем к их упрощению. Об элементарных упрощениях мы уже говорили в предыдущий раз: они могут производиться автоматически, на что влияет установленный флаг simp; и по умолчанию именно так и происходит.&lt;br /&gt;
&lt;br /&gt;
Здесь тоже все начинается с рациональных выражений, которыми занимается функция ratsimp(выражение). Она упрощает выражение за счет рациональных преобразований, но, в отличие от остальных функций по обработке рациональных выражений, работает в том числе и «вглубь», то есть иррациональные части выражения не рассматриваются как атомарные, а упрощаются, в том числе, и все рациональные элементы внутри них:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_2.png]]&lt;br /&gt;
&lt;br /&gt;
На ratsimp() действуют те же флаги, что и на rat(): и ratexpand, и keepfloat, и ratfac. Но отличается она от rat() или ratexpand() не только умением работать «в глубину», но и некоторыми дополнительными рациональными преобразованиями, которые не поддерживаются этими двумя функциями:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_3.png]]&lt;br /&gt;
&lt;br /&gt;
Кроме функции ratsimp(), есть еще и дополнительный переключатель – ratsimpexpons. По умолчанию он установлен в false; если же назначить ему значение true – это приведет к автоматическому упрощению показателей степени:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_4.png]]&lt;br /&gt;
&lt;br /&gt;
Функция ratsimp() – это уже достаточно мощный, и в то же время весьма быстрый, механизм упрощения; но, конечно, не достаточный: ведь те действия, которые можно упростить в разнообразных математических выражениях, не ограничиваются рациональными. Поэтому все же основной плюс этой функции – это скорость. А для более серьезных упрощений существует расширенный вариант – fullratsimp(выражение). Эта функция последовательно применяет к переданному выражению функцию ratsimp(), а также некоторые нерациональные преобразования – и повторяет эти действия в цикле до тех пор, пока выражение не перестанет в процессе них изменяться. За счет этого функция работает несколько медленнее, чем ratsimp(), зато дает более надежный результат – к некоторым выражениям, которые она может упростить с ходу, ratsimp() пришлось бы применять несколько раз, а иногда та и вообще не справилась бы с задачей.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_5.png]]&lt;br /&gt;
&lt;br /&gt;
И третья основная функция упрощения выражений – уже никак с предыдущими двумя не соотносящаяся – radcan(выражение). Если ratsimp() и fullratsimp() ориентированы на упрощение рациональных действий, то radcan() занимается упрощением логарифмических, экспоненциальных функций и степенных с нецелыми рациональными показателями, то есть корней (радикалов). Например, выражение из второго примера в этом разделе radcan() сможет упростить сильнее, чем ratsimp()/fullratsimp():&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_89_6.png]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_90_1.png]]&lt;br /&gt;
&lt;br /&gt;
В некоторых случаях наилучшего результата можно добиться, комбинируя radcan() с ratsimp() или fullratsimp().&lt;br /&gt;
&lt;br /&gt;
С функцией radcan() смежны по действию еще два управляющих ключа. Один из них называется %e_to_numlog. Влияет он не на саму функцию, а на автоматическое упрощение. Если выставить его в true, то выражения вида e&amp;lt;sup&amp;gt;(r*log(выражение))&amp;lt;/sup&amp;gt;, где r – рациональное число, будут автоматически раскрываться в выражениеr. Функция radcan() делает такие преобразования независимо от значения ключа. Второй ключ – radexpand (от radical, не путать с ratexpand) – влияет на упрощение квадратного корня из четной степени какого-либо выражения. Он, в отличие от большинства переключателей, имеет не два, а три значения: при значении all, sqrt(x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) будет раскрываться в x – как для действительных, так и для комплексных чисел; при значении true (по умолчанию), sqrt(x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) для действительных чисел превращается в |x|, а для комплексных не преобразуется; а при значении false, sqrt(x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) не будет упрощаться вообще.&lt;br /&gt;
&lt;br /&gt;
Следующие две функции и один флаг относятся к упрощению факториалов. Функция factcomb(выражение) проводит упрощения вида n!*(n+1) = (n+1)! и тому подобные. Функция minfactorial, напротив, сокращает факториалы, то есть действует по принципу n!/(n–1)! = n. И флаг sumsplitfact, который изначально установлен в true, находясь в состоянии false, приводит к тому, что после того, как отработает factcomb, minfactorial вызывается автоматически.&lt;br /&gt;
&lt;br /&gt;
=== Вот под таким углом... ===&lt;br /&gt;
И напоследок поговорим о функциях для преобразования тригонометрических формул. Здесь так же, как и у рациональных функций, присутствует общая для всех приставка – trig; расшифровывать ее, думаю, особой нужды нет. Начнем по традиции с функции trigexpand(выражение). Она, как нетрудно догадаться, раскрывает скобки в тригонометрических выражениях:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_90_2.png]]&lt;br /&gt;
&lt;br /&gt;
Здесь, как обычно, есть несколько управляющих флагов, первый из которых опять же является тезкой самой функции. Он приводит к повторному раскрытию всех синусов-косинусов, то есть фактически равнозначен повторному вызову самой функции:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_90_2.png]]&lt;br /&gt;
&lt;br /&gt;
Второй флаг – halfangles – управляет раскрытием формул половинных углов. Оба эти флага по умолчанию сброшены. А следующие два флага – trigexpandplus и trigexpandtimes – отвечают соответственно за применение формул сумм углов и кратных углов. То есть в примере выше сначала сработал флаг trigexpandplus, а затем – trigexpandtimes. Эти флаги по умолчанию установлены, что и видно из примера.&lt;br /&gt;
&lt;br /&gt;
Кроме всего уже упомянутого, есть еще флаги trigsign и triginverses. Первый принимает традиционные два значения (по умолчанию – true) и регулирует вынос знака за пределы тригонометрической функции, то есть, к примеру, sin(–x) упростится до –sin(x), а cos(–x) – до cos(x). Флаг triginverses – трехзначный, и умолчательное его значение равно all. Он отвечает за обработку сочетаний вида sin(asin(x)) или atan(tan(x)). Значение all позволяет раскрывать эти сочетания в обоих направлениях (напомню, что при этом часть корней будет теряться); значение true оставляет разрешенным раскрытие только вида sin(asin(x)), то есть блокирует вариант с потерями периодических значений; а случай false запрещает оба направления преобразований.&lt;br /&gt;
&lt;br /&gt;
Функция, обратная trigexpand(), называется trigreduce(выражение) – здесь, в полном соответствии со значением слова reduce, действуют формулы понижения степени. Например, применив дважды эту функцию к результату предыдущего примера, мы получим его в исходном виде (см. рис. наверху страницы).&lt;br /&gt;
&lt;br /&gt;
Эту функцию можно вызвать с более полным списком аргументов: trigreduce(выражение, переменная) – тогда формулы понижения степени будут применяться только по отношению к заданной переменной (переменная может быть, как и почти везде, не только отдельным символом, но и выражением).&lt;br /&gt;
&lt;br /&gt;
Третья функция занимается уже упрощением, и зовут ее, соответственно, trigsimp(выражение). Она старается упростить любое тригонометрическое выражение, используя известные формулы, такие как sin&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(x)+cos&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(x)=1 и тому подобные. Для наилучшего результата ее можно комбинировать с trigreduce(), ratsimp()/fullratsimp() и radcan().&lt;br /&gt;
&lt;br /&gt;
Этим возможности Maxima по преобразованию и упрощению разнообразных выражений еще не совсем исчерпаны, но основные из них мы рассмотрели в полной мере. В следующий раз поговорим немного о применении некоторых встроенных функций, о работе с векторами, матрицами и множествами и, возможно, о работе с логикой, с уравнениями и неравенствами, а также их системами.&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:Qt/KDE</id>
		<title>LXF83:Qt/KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:Qt/KDE"/>
				<updated>2008-04-26T08:19:49Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Браузер DCOP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/Qt/KDE}}&lt;br /&gt;
&lt;br /&gt;
== Интегрированное совершенство ==&lt;br /&gt;
'' '''ЧАСТЬ 6''' Созданное нами на прошлом уроке приложение было подобно любительским фотоснимкам: вроде бы все есть, но у профессионалов все равно получается лучше. Сегодня '''Андрей Боровский''' расскажет, что отличает мастера от ремесленника''&lt;br /&gt;
&lt;br /&gt;
{|cellspacing=&amp;quot;20&amp;quot;&lt;br /&gt;
|''Если уж я делаю машину времени, то почему бы не придать ей стильный вид? &amp;lt;br&amp;gt; '''Доктор Эмет Браун''', «Назад в будущее!»''&lt;br /&gt;
|Структуры данных и алгоритмы могут работать вместе только потому, что они ничего не знают друг о друге.&amp;lt;br&amp;gt;'''Алекс Степанов''' (один из архитекторов стандартной библиотеки C++).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Присутствие стиля желательно не только для самодельной машины времени. В прошлый раз мы написали KDE-приложение “images”, обладающее всеми основными признаками настоящей программы для малого или домашнего офиса. В этот раз мы займемся шлифовкой программы images и добавим в неё некоторые полезные возможности, которыми обладает каждая (ну или почти каждая) программа KDE. Вносить улучшения мы начнем с той области, в которой наличие или отсутствие стиля обычно сразу же бросается в глаза – с интерфейса программы.&lt;br /&gt;
&lt;br /&gt;
В прошлый раз мы конструировали интерфейс программно, таким образом, что элементы интерфейса, соответствующие определенным в программе действиям, добавлялись с помощью создания соответствующих объектов явным образом с последующим вызовом метода plug(). В результате интерфейс нашей программы был жестко (хотя и с возможностью настройки пользователем) зашит в ее код. Windows-программисту такое положение дел могло бы показаться естественным, но в Unix этот подход не считается слишком удачным. При жестком «приваривании» интерфейса к коду программы нарушается один из основных архитектурных принципов Unix – принцип разделения «движка» и «оснастки». Согласно этому принципу все части программы, которые можно изменить, не нарушая принципов ее работы, следует вынести за пределы программы и настраивать отдельно. Примеры реализации принципа разделения движка и оснастки можно найти на всех уровнях Unix-системы. На фундаментальном уровне этот принцип выражается в строгом разделении алгоритмов и данных. Код программы должен содержать только алгоритмы, все настройки и данные следует вынести в отдельные файлы. Примером разделения на более высоком уровне является система X Window, которая содержит описание механизмов работы графического интерфейса, но не навязывает программам-клиентам какой-либо конкретный набор визуальных элементов (таких наборов существует довольно много и все они, в принципе, независимы от X-сервера). На уровне программирования интерфейса KDE-программы принцип разделения выражается в том, что описание интерфейса (оснастка) может храниться и настраиваться отдельно от самой программы (движок). Мы уже знаем, что пиктограммы кнопок могут храниться в собственных графических файлах. То же самое касается и других медиа-ресурсов, например, звуковых. Но это не все. Описание визуальных элементов-контейнеров, содержащих другие элементы интерфейса, также может храниться в отдельном файле. Примерами визуальных контейнеров, описание которых может храниться отдельно от двоичного файла программы, являются главное меню, контекстные меню и панели быстрого доступа.&lt;br /&gt;
&lt;br /&gt;
Файлы, хранящие описания элементов интерфейса KDE, имеют расширение rc. Если вы откроете один из таких файлов (их можно найти, например, в директориях $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;), то увидите, что это файлы в формате XML (файлы rc являются частью специальной модели KDE, именуемой XMLGUI). Мы научимся создавать файлы описания интерфейса на примере программы images. Из метода images::setup_Controls() мы удалим все строки, связанные с созданием и отображением меню и панели быстрого доступа. Оставим только вызовы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KAction * command = new KAction(...);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
command-&amp;gt;setToolTip(...):&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее откроем вкладку Automake Manager (по умолчанию она припаркована у правого края главного окна KDevelop), Раскроем группу «Данные в rc» и найдем файл imagesui.rc ( как нетрудно догадаться, имя файла сгенерировано по шаблону &amp;lt;имя_приложения&amp;gt;ui.rc). Этот файл создается автоматически в процессе генерации проекта, но по умолчанию он пустой и заполнить его мы должны сами. Далее следует текст файла imagesui.rc, который можно ввести с помощью текстового редактора:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM “kpartgui.dtd”&amp;gt;&lt;br /&gt;
&amp;lt;kpartgui name=”images” version=”1”&amp;gt;&lt;br /&gt;
&amp;lt;MenuBar&amp;gt;&lt;br /&gt;
 &amp;lt;Menu name=”proc_menu”&amp;gt;&amp;lt;text&amp;gt;&amp;amp;amp;Processing&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”bw_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”contrast_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”intensity_command” /&amp;gt;&lt;br /&gt;
 &amp;lt;/Menu&amp;gt;&lt;br /&gt;
&amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”bw_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”contrast_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”intensity_command” /&amp;gt;&lt;br /&gt;
&amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&amp;lt;/kpartgui&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Корневым тэгом документа является тэг &amp;lt;kpartgui&amp;gt;. Модификации подлежат атрибуты name и version этого тэга. Структура главного меню определяется парным тэгом &amp;lt;MenuBar&amp;gt;. Тэг &amp;lt;name&amp;gt; позволяет задать внутренне имя ниспадающего меню, а тэг &amp;lt;text&amp;gt; – название, которое пользователь увидит на экране. Сущность &amp;amp;amp; (амперсанд) указывает, как и обычно, подчеркнутый символ для быстрого вызова команды с помощью Alt. Для того, чтобы наполнить ниспадающее меню Processing командами мы добавляем серию непарных тэгов Action, которые, как вы наверное догадались, соответствуют объектам KAction (действиям) нашей программы. Атрибут name содержит имя объектадействия, соответствующее его имени в коллекции actionCollection. Команды будут добавлены в меню в том же порядке, в котором перечислены тэги Action. Тэг &amp;lt;ToolBar&amp;gt; позволяет нам определить структуру панели инструментов. Формат у этого тэга такой же, как и у тэга &amp;lt;Menu&amp;gt;, за исключением того, что у панели инструментов нет видимого имени (а невидимое можно и не указывать, если мы не обращаемся к объекту панели).&lt;br /&gt;
&lt;br /&gt;
На этом работа над описанием интерфейса нашей программы закончена. В прошлый раз нам не требовалось вызывать метод plug() для стандартных объектов-действий KDE. Не требуется указывать их и в файле *ui.rc. Файлы описания интерфейсов позволяют создавать и другие элементы меню и панелей инструментов – горячие клавиши, всплывающие подсказки, разделители, выравнивание и т.п. Более подробную информацию вы сможете найти на сайте KDE (см. врезку).&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы приложение могло воспользоваться файлом *ui.rc, этот файл должен быть размещен в одной из специальных директорий. Программа не увидит неправильно расположенный файл даже если он будет у нее под носом – в рабочем каталоге. Наше KDE-приложение ожидает найти файл *ui.rc либо в директории $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;, либо в локальной директории ~/.kde/share/apps/&amp;lt;имя_приложения&amp;gt;. Файл imagesui.rc будет автоматически установлен в первую директорию, если вы воспользуетесь командой KDevelop «Сборка|Установить (с правами root)».&lt;br /&gt;
&lt;br /&gt;
Возможно, у вас возник вопрос – а зачем, собственно, все это нужно. В качестве ответа я предлагаю вам вспомнить, как легко можно изменить внешний вид приложения KDE с помощью менеджера тем. Менеджер тем может модифицировать файлы *ui.rc, например, припарковать меню Help у правого края окна, как это принято в Motif. Несмотря на то, что исходные тексты приложений KDE доступны, интерфейс программы будет проще настраивать, если его описание вынесено в отдельный файл простого формата. Мы можем доработать и метод установки пиктограмм для кнопок панели инструментов.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_83_1.png|thumb|200px|Рисунок 1. Automake manager]]&lt;br /&gt;
&lt;br /&gt;
Программа images способна считывать файлы пиктограмм из своей рабочей директории (что она и делала в прошлом примере), однако в KDE существуют специальные правила расположения и наименования этих файлов. Следуя этим правилам, вы не только приобретете репутацию профессионального разработчика, но и позволите другим пользователям настраивать внешний вид панели быстрого доступа с помощью все того же менеджера тем KDE. Сравните простоту изменения облика KDE-приложений, в которых данные об интерфейсе вынесены в легко читаемые файлы, с решением аналогичной задачи для ОС Windows, где программам, модифицирующим интерфейс, приходится получать доступ к приложению различными недокументированными и несанкционированными путями.&lt;br /&gt;
&lt;br /&gt;
Я надеюсь, что я вас убедил. Тогда приступим к редактированию иконок. Имя файла иконки, содержащейся в KDE-проекте, должно начинаться либо с префикса hi, либо с префикса lo, в зависимости от количества цветов. За префиксом следует число, указывающее размер иконки – 16 для 16x16, 22 для 22x22 и т.д.&lt;br /&gt;
&lt;br /&gt;
Далее через дефис следует название контекста иконки (смысловой группы, к которой принадлежит иконка) – action для иконки обозначающий действие, app – для иконки приложения, mime – для значка MIME, device – для значка устройства. Затем, снова через дефис, следует название самой иконки. Например, пиктограмма для приложения images в проекте KDE может носить имя hi32-app-images.png (наименование пиктограммы должно совпадать с именем приложения), а иконка для команды «Настроить контрастность» - hi32-action-contrast. png (чаще всего иконки хранятся в файлах PNG, но можно использовать и другие растровые форматы, поддерживаемые KDE). Во время установки приложения система модифицирует имя иконки. Например, иконка hi32-action-contrast.png переименовывается в contrast.png и помещается в директорию $KDEDIR/share/icons/hicolor/32x32/actions. Иконки также могут устанавливаться в директории $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;, $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;/pics и ~/.kde/share/apps/&amp;lt;имя_приложения&amp;gt;. Для того, чтобы добавить иконку в наш проект, раскроем группу «Данные о пиктограммах» на вкладке Automake Manager (вы, наверное, уже поняли, что Automake Manager (рис. 1) – важнейший инструмент KDevelop после редактора исходных текстов) и выберем команду контекстного меню «Добавить пиктограмму...». Перед нами откроется диалоговое окно добавления пиктограммы (рис. 2) в котором можно выбрать размеры и тип файла. Если в поддиректории src директории проекта KDE не существует файла с выбранным именем, в этой поддиректории будет создан пустой графический файл.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_83_2.png|thumb|200px|Рисунок 2. Окно добавления пиктограммы]]&lt;br /&gt;
&lt;br /&gt;
В исходный текст images также нужно внести некоторые изменения. В новом варианте программы вызов конструктора объекта-действия “contrast_command” будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
command = new KAction(i18n(“&amp;amp;Contrast”),&lt;br /&gt;
          QIconSet(BarIcon(“contrast”)), 0, this,&lt;br /&gt;
          SLOT(procContrast()),&lt;br /&gt;
          actionCollection(), “contrast_command”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_84_1.png|thumb|200px|Рисунок 3. Обновленная программа “Images”.]]&lt;br /&gt;
&lt;br /&gt;
Для загрузки графического файла мы используем стандартную функцию BarIcon(), которой передаем только имя иконки. Функция сама будет искать соответствующий файл в одной из стандартных директорий (но не в рабочей директории программы). Теперь модифицировать пиктограммы нашего приложения стало не трудно, чем мы и воспользуемся (рис. 3).&lt;br /&gt;
&lt;br /&gt;
=== Обмен данными с помощью DCOP ===&lt;br /&gt;
&lt;br /&gt;
Пора закончить издевательства над пользовательским интерфейсом и заняться расширением функциональности images. Разработчики объектно-ориентированной оболочки KDE не устояли перед искушением создать объектно-ориентированный механизм межпроцессного обмена данными и автоматизации. Протокол DCOP (Desktop COmmunication Protocol) построен на основе стандартного протокола межпроцессного взаимодействия X Window Inter Client Exchange. В клиент-серверной модели DCOP все программы, с которыми работает пользователь, являются клиентами. Роль сервера DCOP выполняет специальный демон, который осуществляет диспетчеризацию запросов и передачу данных между программами. С точки зрения разработчика модель DCOP напоминает распределенные объектные модели COM и CORBA. Приложение-поставщик сервисов DCOP экспортирует интерфейсы своих классов. Методы этих интерфейсов могут быть вызваны другим приложением посредством специального механизма.&lt;br /&gt;
&lt;br /&gt;
В проекте приложения images уже содержатся элементы, необходимые для того, чтобы превратить это приложение в источник данных DCOP. Откройте файл imagesiface.h. В этом файле вы найдете объявление класса imagesIface, который является потоком класса DCOPObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
class imagesIface : virtual public DCOPObject&lt;br /&gt;
{&lt;br /&gt;
 K_DCOP&lt;br /&gt;
public:&lt;br /&gt;
k_dcop:&lt;br /&gt;
 virtual void show_Image(const QPixmap data) = 0;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Полезные ссылки&lt;br /&gt;
|Содержание=* Описание архитектуры XMLGUI можно найти по адресу:&lt;br /&gt;
[http://developer.kde.org/documentation/library/kdeqt/kde3arch/xmlgui.html http://developer.kde.org/documentation/library/kdeqt/kde3arch/xmlgui.html]&lt;br /&gt;
* Описание механизмов DCOP содержится по адресу:&lt;br /&gt;
[http://developer.kde.org/documentation/library/kdeqt/kde3arch/dcop.html http://developer.kde.org/documentation/library/kdeqt/kde3arch/dcop.html]&lt;br /&gt;
* Хорошее англоязычное руководство по основам KDE-программирования (с примером DCOP) вы найдете&lt;br /&gt;
по ссылке:&lt;br /&gt;
[http://developer.kde.org/~larrosa/tutorial/ http://developer.kde.org/~larrosa/tutorial/]&lt;br /&gt;
|Ширина=420px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Класс DCOPObject – базовый для всех, экспортирующих интерфейсы DCOP. Макрос K_DCOP указывает препроцессору KDE, что данный класс содержит описания интерфейса. Перед заголовками методов интерфейса следует ставить еще один макрос – k_dcop. Класс ImagesIface экспортирует один метод – show_Image(). Данный метод получает объект класса QPixmap и выводит переданное в нем изображение в окно программы. Благодаря методу show_Image() другие программы смогут выводить изображение с помощью программы images. Поскольку imagesIface – всего лишь интерфейс, метод show_Image() объявлен в нем как виртуальный метод без реализации (pure virtual, в некоторых кругах, вероятно, сказали бы «чисто виртуальный метод»). Если теперь вы посмотрите на объявление класса imagesView, то увидите, что этот класс наследует ImagesIface. Именно в классе imagesView следует поместить реализацию метода show_Image(). Добавить реализацию просто. В объявлении класса imagesView, в разделе public напишите:&lt;br /&gt;
 void show_Image(const QPixmap data);&lt;br /&gt;
&lt;br /&gt;
Теперь щелкните правой кнопкой мыши по этому имени и в контекстном меню выберите команду «Генерировать член класса». В файле imagesview.cpp должна появиться заготовка метода, в которую мы впишем одну строчку кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void imagesView::show_Image(const QPixmap data)&lt;br /&gt;
{&lt;br /&gt;
  setPixmap(KPixmap(data));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видим, все очень просто. В конструктор класса imagesView следует добавить код, регистрирующий классы приложения на сервере DCOP (при этом регистрируются сразу все классы, в которых присутствует макрос K_DCOP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
DCOPClient * client = kapp-&amp;gt;dcopClient();&lt;br /&gt;
client-&amp;gt;attach();&lt;br /&gt;
client-&amp;gt;registerAs(“images”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Прежде всего, нам нужен объект класса DCOPClient. Этот объект предоставляется нам главным объектом приложения (объектом класса KApplication), к которому мы можем получить доступ из методов любых наших классов с помощью переменной kapp. Метод attach() объекта DCOPClient связывает наше приложение с сервером DCOP, а метод registerAs() регистрирует приложение (регистрировать нужно только те программы, которые экспортируют интерфейсы DCOP, но не те, которые только вызывают методы других объектов). Зарегистрированное имя images будет использоваться другими приложениями для доступа к нашей программе. Теперь наша программа images может быть источником сервисов DCOP.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы проверить механизм DCOP в работе, напишем программу, использующую экспортируемый метод show_image(). На диске вы найдете программу iclient, созданную в KDevelop на основе заготовки Simple KDE Application. Логика работы этой программы очень проста. Щелчок кнопки открывает диалоговое окно, в котором нужно выбрать графический файл. Выбранный файл считывается и по протоколу DCOP передается для отображения в предварительно запущенной программе images. В конструкторе главного и единственного визуального элемента, – кнопки KPushButton, мы связываем программу iclient с сервером DCOP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
DCOPClient *client = kapp-&amp;gt;dcopClient();&lt;br /&gt;
client-&amp;gt;attach();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Программа iclient не экспортирует никаких сервисов, так что метод registerAs() вызывать не нужно. В обработчике сигнала clicked, методе button_Click(), мы выполняем загрузку файла и вызываем метод show_Image() приложения images:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void iclient::button_Clicked()&lt;br /&gt;
{&lt;br /&gt;
  QString fn = KFileDialog::getImageOpenURL(NULL, (QWidget *) this, i18n(“Open Image”)).path();&lt;br /&gt;
  QPixmap pixmap;&lt;br /&gt;
  pixmap.load(fn);&lt;br /&gt;
  QByteArray param;&lt;br /&gt;
  QDataStream dataStream(param, IO_WriteOnly);&lt;br /&gt;
  dataStream &amp;lt;&amp;lt; pixmap;&lt;br /&gt;
  DCOPClient * client = kapp-&amp;gt;dcopClient();&lt;br /&gt;
  if (!client-&amp;gt;send(“images*”, “imagesIface”, “show_Image(QPixmap)”, param))&lt;br /&gt;
    kdDebug() &amp;lt;&amp;lt; “DCOP error\n”;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разбор листинга мы начнем с конца. Метод send() класса DCOPClient осуществляет обращение к серверу DCOP. Первый параметр метода send() – имя приложения-поставщика сервисов DCOP (имя, под которым приложение зарегистрировалось на сервере DCOP). Поскольку сервер по умолчанию добавляет к имени приложения его PID (почему – мы увидим ниже), мы используем «звездочку», чтобы указать, что мы обращаемся к любому (точнее – к каждому) приложению, у которого зарегистрированное имя начинается с “images”. Второй параметр – имя интерфейса, к которому мы хотим обратиться (подчеркнем, что указывается имя интерфейса, а не класса реализации), третий параметр – имя вызываемого метода, записанное так же, как записывается имя сигнала или слота при вызове QObject::connect(). Четвертый параметр представляет собой массив значений параметров вызываемого метода. Значением этого параметра должен быть объект класса QByteArray. Для того, чтобы записать значение параметров (в нашем случае – единственного параметра объекта класса QPixmap) в QByteArray, мы создаем объект класса QDataStream (поток данных), указываем этому объекту, что приемник данных – объект param касса QByteArray, и с помощью оператора &amp;lt;&amp;lt; записываем значение объекта pixmap в этот поток.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_85_1.png|thumb|200px|Рисунок 4. Окно «Параметры проекта».]]&lt;br /&gt;
&lt;br /&gt;
Чтобы скомпилировать программу iclient, необходимо добавить в проект ссылку на библиотеку libkio.so. Эта библиотека является составной частью KDE, однако по умолчанию она не подключается к проекту Simple KDE Application. Для подключения библиотеки мы воспользуемся диалоговым окном «Параметры проекта» (команда «Проект|Параметры проекта»). В этом окне, на вкладке «Параметры make» (рис. 4), можно указать значения переменных для make-файла, в том числе значение переменной LIBS. Для подключения к проекту библиотеки libkio.so добавим значение&lt;br /&gt;
&lt;br /&gt;
 LIBS = -lkio&lt;br /&gt;
&lt;br /&gt;
Теперь можно компилировать программу.&lt;br /&gt;
&lt;br /&gt;
Что произойдет, если в системе уже запущено какое-то другое приложение с именем images? Ничего страшного не случится. Данные получит только тот экземпляр программы по имени images, в котором присутствует объект-потомок класса imagesIface и метод show_Image(QPixmap). Такое совпадение маловероятно, так что даже если на сервере DCOP одновременно зарегистрированы два приложения images, данные будут переданы только нашему приложению, но не другому. Сервер передает данные всем экземплярам приложения images, в которых существуют соответствующий объект и метод. Попробуйте запустить несколько экземпляров images, а затем передайте серверу DCOP изображение с помощью программы iclient. Вы увидите, что каждый экземпляр images получил копию картинки. Для того, чтобы данные направлялись только одному экземпляру, необходимо указывать полное DCOP-имя приложения, включающее PID. Впрочем, можно регистрировать приложение и не указывая PID. Для этого в тексте конструктора imagesView заменим вызов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
client-&amp;gt;registerAs(“images”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
на&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
client-&amp;gt;registerAs(“images”, FALSE);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь приложение будет зарегистрировано под именем “images”.&lt;br /&gt;
&lt;br /&gt;
=== Браузер DCOP ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_85_2.png|thumb|200px|Рисунок 5. Браузер DCOP.]]&lt;br /&gt;
&lt;br /&gt;
Отладка пар приложений, работающих совместно, представляет собой более сложный процесс, чем отладка самостоятельного приложения. При возникновении сбоя в обмене данными между разными приложениями трудно сразу определить, какая из программ виновна в ошибке. При отладке распределенных приложений очень полезно иметь инструмент, представляющий собой эталонную, заведомо верную реализацию клиентской или серверной части. Имея в своем распоряжении такой инструмент, мы можем добиться правильной работы по крайней мере одного компонента системы, а затем использовать этот компонент для отладки второго. В случае отладки приложений, обменивающихся данными с помощью DCOP, мы располагаем эталонным инструментом, позволяющим убедиться в том, что приложение, зарегистрировавшее свой интерфейс на сервере DCOP, работает правильно. Функции отладки нам предоставляет браузер DCOP (DCOP Browser), рис. 5.&lt;br /&gt;
&lt;br /&gt;
Программу-браузер можно запустить с консоли командой kdcop. В окне браузера мы сначала увидим список всех приложений пользователя, зарегистрированных на сервере DCOP. Щелкнув по значку приложения, мы получим список экспортируемых им DCOP-интерфейсов. Если мы запустили приложение images до запуска браузера, мы увидим в списке и его имя. Мы также можем запустить интересующее нас приложение после запуска браузера и воспользоваться кнопкой «Обновить». Щелкнув по имени интересующего нас интерфейса (в нашем случае – imagesIface), мы получим список его методов. Мы можем использовать эти методы для передачи данных экспортирующему приложению прямо из окна браузера. Если мы щелкнем по имени метода, откроется окно ввода данных для параметров вызываемого метода (число полей в окне ввода будет соответствовать числу параметров). В браузере DCOP мы можем передавать не только строковые и численные значения параметров, но и создавать более сложные структуры данных. Например, для того, чтобы создать экземпляр класса QPixmap, нам надо просто указать имя графического файла, из которого будет считано изображение. После того как мы заполним все поля ввода и щелкнем кнопку OK, будет вызван соответствующий метод DCOP-приложения с установленными нами значениями параметров. Таким образом, мы можем проверить, действительно ли приложение images обрабатывает запросы правильно. Если с images все в порядке, мы можем приступить к отладке iclient.&lt;br /&gt;
&lt;br /&gt;
Механизм DCOP – не единственный инструмент интеграции приложений KDE. В следующей статье мы рассмотрим другой мощный инструмент интеграции – подключаемые модули.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:Qt/KDE</id>
		<title>LXF83:Qt/KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:Qt/KDE"/>
				<updated>2008-04-26T08:19:03Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* Обмен данными с помощью DCOP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/Qt/KDE}}&lt;br /&gt;
&lt;br /&gt;
== Интегрированное совершенство ==&lt;br /&gt;
'' '''ЧАСТЬ 6''' Созданное нами на прошлом уроке приложение было подобно любительским фотоснимкам: вроде бы все есть, но у профессионалов все равно получается лучше. Сегодня '''Андрей Боровский''' расскажет, что отличает мастера от ремесленника''&lt;br /&gt;
&lt;br /&gt;
{|cellspacing=&amp;quot;20&amp;quot;&lt;br /&gt;
|''Если уж я делаю машину времени, то почему бы не придать ей стильный вид? &amp;lt;br&amp;gt; '''Доктор Эмет Браун''', «Назад в будущее!»''&lt;br /&gt;
|Структуры данных и алгоритмы могут работать вместе только потому, что они ничего не знают друг о друге.&amp;lt;br&amp;gt;'''Алекс Степанов''' (один из архитекторов стандартной библиотеки C++).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Присутствие стиля желательно не только для самодельной машины времени. В прошлый раз мы написали KDE-приложение “images”, обладающее всеми основными признаками настоящей программы для малого или домашнего офиса. В этот раз мы займемся шлифовкой программы images и добавим в неё некоторые полезные возможности, которыми обладает каждая (ну или почти каждая) программа KDE. Вносить улучшения мы начнем с той области, в которой наличие или отсутствие стиля обычно сразу же бросается в глаза – с интерфейса программы.&lt;br /&gt;
&lt;br /&gt;
В прошлый раз мы конструировали интерфейс программно, таким образом, что элементы интерфейса, соответствующие определенным в программе действиям, добавлялись с помощью создания соответствующих объектов явным образом с последующим вызовом метода plug(). В результате интерфейс нашей программы был жестко (хотя и с возможностью настройки пользователем) зашит в ее код. Windows-программисту такое положение дел могло бы показаться естественным, но в Unix этот подход не считается слишком удачным. При жестком «приваривании» интерфейса к коду программы нарушается один из основных архитектурных принципов Unix – принцип разделения «движка» и «оснастки». Согласно этому принципу все части программы, которые можно изменить, не нарушая принципов ее работы, следует вынести за пределы программы и настраивать отдельно. Примеры реализации принципа разделения движка и оснастки можно найти на всех уровнях Unix-системы. На фундаментальном уровне этот принцип выражается в строгом разделении алгоритмов и данных. Код программы должен содержать только алгоритмы, все настройки и данные следует вынести в отдельные файлы. Примером разделения на более высоком уровне является система X Window, которая содержит описание механизмов работы графического интерфейса, но не навязывает программам-клиентам какой-либо конкретный набор визуальных элементов (таких наборов существует довольно много и все они, в принципе, независимы от X-сервера). На уровне программирования интерфейса KDE-программы принцип разделения выражается в том, что описание интерфейса (оснастка) может храниться и настраиваться отдельно от самой программы (движок). Мы уже знаем, что пиктограммы кнопок могут храниться в собственных графических файлах. То же самое касается и других медиа-ресурсов, например, звуковых. Но это не все. Описание визуальных элементов-контейнеров, содержащих другие элементы интерфейса, также может храниться в отдельном файле. Примерами визуальных контейнеров, описание которых может храниться отдельно от двоичного файла программы, являются главное меню, контекстные меню и панели быстрого доступа.&lt;br /&gt;
&lt;br /&gt;
Файлы, хранящие описания элементов интерфейса KDE, имеют расширение rc. Если вы откроете один из таких файлов (их можно найти, например, в директориях $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;), то увидите, что это файлы в формате XML (файлы rc являются частью специальной модели KDE, именуемой XMLGUI). Мы научимся создавать файлы описания интерфейса на примере программы images. Из метода images::setup_Controls() мы удалим все строки, связанные с созданием и отображением меню и панели быстрого доступа. Оставим только вызовы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
KAction * command = new KAction(...);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
command-&amp;gt;setToolTip(...):&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее откроем вкладку Automake Manager (по умолчанию она припаркована у правого края главного окна KDevelop), Раскроем группу «Данные в rc» и найдем файл imagesui.rc ( как нетрудно догадаться, имя файла сгенерировано по шаблону &amp;lt;имя_приложения&amp;gt;ui.rc). Этот файл создается автоматически в процессе генерации проекта, но по умолчанию он пустой и заполнить его мы должны сами. Далее следует текст файла imagesui.rc, который можно ввести с помощью текстового редактора:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM “kpartgui.dtd”&amp;gt;&lt;br /&gt;
&amp;lt;kpartgui name=”images” version=”1”&amp;gt;&lt;br /&gt;
&amp;lt;MenuBar&amp;gt;&lt;br /&gt;
 &amp;lt;Menu name=”proc_menu”&amp;gt;&amp;lt;text&amp;gt;&amp;amp;amp;Processing&amp;lt;/text&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”bw_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”contrast_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”intensity_command” /&amp;gt;&lt;br /&gt;
 &amp;lt;/Menu&amp;gt;&lt;br /&gt;
&amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”bw_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”contrast_command” /&amp;gt;&lt;br /&gt;
  &amp;lt;Action name=”intensity_command” /&amp;gt;&lt;br /&gt;
&amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&amp;lt;/kpartgui&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Корневым тэгом документа является тэг &amp;lt;kpartgui&amp;gt;. Модификации подлежат атрибуты name и version этого тэга. Структура главного меню определяется парным тэгом &amp;lt;MenuBar&amp;gt;. Тэг &amp;lt;name&amp;gt; позволяет задать внутренне имя ниспадающего меню, а тэг &amp;lt;text&amp;gt; – название, которое пользователь увидит на экране. Сущность &amp;amp;amp; (амперсанд) указывает, как и обычно, подчеркнутый символ для быстрого вызова команды с помощью Alt. Для того, чтобы наполнить ниспадающее меню Processing командами мы добавляем серию непарных тэгов Action, которые, как вы наверное догадались, соответствуют объектам KAction (действиям) нашей программы. Атрибут name содержит имя объектадействия, соответствующее его имени в коллекции actionCollection. Команды будут добавлены в меню в том же порядке, в котором перечислены тэги Action. Тэг &amp;lt;ToolBar&amp;gt; позволяет нам определить структуру панели инструментов. Формат у этого тэга такой же, как и у тэга &amp;lt;Menu&amp;gt;, за исключением того, что у панели инструментов нет видимого имени (а невидимое можно и не указывать, если мы не обращаемся к объекту панели).&lt;br /&gt;
&lt;br /&gt;
На этом работа над описанием интерфейса нашей программы закончена. В прошлый раз нам не требовалось вызывать метод plug() для стандартных объектов-действий KDE. Не требуется указывать их и в файле *ui.rc. Файлы описания интерфейсов позволяют создавать и другие элементы меню и панелей инструментов – горячие клавиши, всплывающие подсказки, разделители, выравнивание и т.п. Более подробную информацию вы сможете найти на сайте KDE (см. врезку).&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы приложение могло воспользоваться файлом *ui.rc, этот файл должен быть размещен в одной из специальных директорий. Программа не увидит неправильно расположенный файл даже если он будет у нее под носом – в рабочем каталоге. Наше KDE-приложение ожидает найти файл *ui.rc либо в директории $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;, либо в локальной директории ~/.kde/share/apps/&amp;lt;имя_приложения&amp;gt;. Файл imagesui.rc будет автоматически установлен в первую директорию, если вы воспользуетесь командой KDevelop «Сборка|Установить (с правами root)».&lt;br /&gt;
&lt;br /&gt;
Возможно, у вас возник вопрос – а зачем, собственно, все это нужно. В качестве ответа я предлагаю вам вспомнить, как легко можно изменить внешний вид приложения KDE с помощью менеджера тем. Менеджер тем может модифицировать файлы *ui.rc, например, припарковать меню Help у правого края окна, как это принято в Motif. Несмотря на то, что исходные тексты приложений KDE доступны, интерфейс программы будет проще настраивать, если его описание вынесено в отдельный файл простого формата. Мы можем доработать и метод установки пиктограмм для кнопок панели инструментов.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_83_1.png|thumb|200px|Рисунок 1. Automake manager]]&lt;br /&gt;
&lt;br /&gt;
Программа images способна считывать файлы пиктограмм из своей рабочей директории (что она и делала в прошлом примере), однако в KDE существуют специальные правила расположения и наименования этих файлов. Следуя этим правилам, вы не только приобретете репутацию профессионального разработчика, но и позволите другим пользователям настраивать внешний вид панели быстрого доступа с помощью все того же менеджера тем KDE. Сравните простоту изменения облика KDE-приложений, в которых данные об интерфейсе вынесены в легко читаемые файлы, с решением аналогичной задачи для ОС Windows, где программам, модифицирующим интерфейс, приходится получать доступ к приложению различными недокументированными и несанкционированными путями.&lt;br /&gt;
&lt;br /&gt;
Я надеюсь, что я вас убедил. Тогда приступим к редактированию иконок. Имя файла иконки, содержащейся в KDE-проекте, должно начинаться либо с префикса hi, либо с префикса lo, в зависимости от количества цветов. За префиксом следует число, указывающее размер иконки – 16 для 16x16, 22 для 22x22 и т.д.&lt;br /&gt;
&lt;br /&gt;
Далее через дефис следует название контекста иконки (смысловой группы, к которой принадлежит иконка) – action для иконки обозначающий действие, app – для иконки приложения, mime – для значка MIME, device – для значка устройства. Затем, снова через дефис, следует название самой иконки. Например, пиктограмма для приложения images в проекте KDE может носить имя hi32-app-images.png (наименование пиктограммы должно совпадать с именем приложения), а иконка для команды «Настроить контрастность» - hi32-action-contrast. png (чаще всего иконки хранятся в файлах PNG, но можно использовать и другие растровые форматы, поддерживаемые KDE). Во время установки приложения система модифицирует имя иконки. Например, иконка hi32-action-contrast.png переименовывается в contrast.png и помещается в директорию $KDEDIR/share/icons/hicolor/32x32/actions. Иконки также могут устанавливаться в директории $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;, $KDEDIR/share/apps/&amp;lt;имя_приложения&amp;gt;/pics и ~/.kde/share/apps/&amp;lt;имя_приложения&amp;gt;. Для того, чтобы добавить иконку в наш проект, раскроем группу «Данные о пиктограммах» на вкладке Automake Manager (вы, наверное, уже поняли, что Automake Manager (рис. 1) – важнейший инструмент KDevelop после редактора исходных текстов) и выберем команду контекстного меню «Добавить пиктограмму...». Перед нами откроется диалоговое окно добавления пиктограммы (рис. 2) в котором можно выбрать размеры и тип файла. Если в поддиректории src директории проекта KDE не существует файла с выбранным именем, в этой поддиректории будет создан пустой графический файл.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_83_2.png|thumb|200px|Рисунок 2. Окно добавления пиктограммы]]&lt;br /&gt;
&lt;br /&gt;
В исходный текст images также нужно внести некоторые изменения. В новом варианте программы вызов конструктора объекта-действия “contrast_command” будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
command = new KAction(i18n(“&amp;amp;Contrast”),&lt;br /&gt;
          QIconSet(BarIcon(“contrast”)), 0, this,&lt;br /&gt;
          SLOT(procContrast()),&lt;br /&gt;
          actionCollection(), “contrast_command”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_84_1.png|thumb|200px|Рисунок 3. Обновленная программа “Images”.]]&lt;br /&gt;
&lt;br /&gt;
Для загрузки графического файла мы используем стандартную функцию BarIcon(), которой передаем только имя иконки. Функция сама будет искать соответствующий файл в одной из стандартных директорий (но не в рабочей директории программы). Теперь модифицировать пиктограммы нашего приложения стало не трудно, чем мы и воспользуемся (рис. 3).&lt;br /&gt;
&lt;br /&gt;
=== Обмен данными с помощью DCOP ===&lt;br /&gt;
&lt;br /&gt;
Пора закончить издевательства над пользовательским интерфейсом и заняться расширением функциональности images. Разработчики объектно-ориентированной оболочки KDE не устояли перед искушением создать объектно-ориентированный механизм межпроцессного обмена данными и автоматизации. Протокол DCOP (Desktop COmmunication Protocol) построен на основе стандартного протокола межпроцессного взаимодействия X Window Inter Client Exchange. В клиент-серверной модели DCOP все программы, с которыми работает пользователь, являются клиентами. Роль сервера DCOP выполняет специальный демон, который осуществляет диспетчеризацию запросов и передачу данных между программами. С точки зрения разработчика модель DCOP напоминает распределенные объектные модели COM и CORBA. Приложение-поставщик сервисов DCOP экспортирует интерфейсы своих классов. Методы этих интерфейсов могут быть вызваны другим приложением посредством специального механизма.&lt;br /&gt;
&lt;br /&gt;
В проекте приложения images уже содержатся элементы, необходимые для того, чтобы превратить это приложение в источник данных DCOP. Откройте файл imagesiface.h. В этом файле вы найдете объявление класса imagesIface, который является потоком класса DCOPObject.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
class imagesIface : virtual public DCOPObject&lt;br /&gt;
{&lt;br /&gt;
 K_DCOP&lt;br /&gt;
public:&lt;br /&gt;
k_dcop:&lt;br /&gt;
 virtual void show_Image(const QPixmap data) = 0;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Полезные ссылки&lt;br /&gt;
|Содержание=* Описание архитектуры XMLGUI можно найти по адресу:&lt;br /&gt;
[http://developer.kde.org/documentation/library/kdeqt/kde3arch/xmlgui.html http://developer.kde.org/documentation/library/kdeqt/kde3arch/xmlgui.html]&lt;br /&gt;
* Описание механизмов DCOP содержится по адресу:&lt;br /&gt;
[http://developer.kde.org/documentation/library/kdeqt/kde3arch/dcop.html http://developer.kde.org/documentation/library/kdeqt/kde3arch/dcop.html]&lt;br /&gt;
* Хорошее англоязычное руководство по основам KDE-программирования (с примером DCOP) вы найдете&lt;br /&gt;
по ссылке:&lt;br /&gt;
[http://developer.kde.org/~larrosa/tutorial/ http://developer.kde.org/~larrosa/tutorial/]&lt;br /&gt;
|Ширина=420px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Класс DCOPObject – базовый для всех, экспортирующих интерфейсы DCOP. Макрос K_DCOP указывает препроцессору KDE, что данный класс содержит описания интерфейса. Перед заголовками методов интерфейса следует ставить еще один макрос – k_dcop. Класс ImagesIface экспортирует один метод – show_Image(). Данный метод получает объект класса QPixmap и выводит переданное в нем изображение в окно программы. Благодаря методу show_Image() другие программы смогут выводить изображение с помощью программы images. Поскольку imagesIface – всего лишь интерфейс, метод show_Image() объявлен в нем как виртуальный метод без реализации (pure virtual, в некоторых кругах, вероятно, сказали бы «чисто виртуальный метод»). Если теперь вы посмотрите на объявление класса imagesView, то увидите, что этот класс наследует ImagesIface. Именно в классе imagesView следует поместить реализацию метода show_Image(). Добавить реализацию просто. В объявлении класса imagesView, в разделе public напишите:&lt;br /&gt;
 void show_Image(const QPixmap data);&lt;br /&gt;
&lt;br /&gt;
Теперь щелкните правой кнопкой мыши по этому имени и в контекстном меню выберите команду «Генерировать член класса». В файле imagesview.cpp должна появиться заготовка метода, в которую мы впишем одну строчку кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void imagesView::show_Image(const QPixmap data)&lt;br /&gt;
{&lt;br /&gt;
  setPixmap(KPixmap(data));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видим, все очень просто. В конструктор класса imagesView следует добавить код, регистрирующий классы приложения на сервере DCOP (при этом регистрируются сразу все классы, в которых присутствует макрос K_DCOP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
DCOPClient * client = kapp-&amp;gt;dcopClient();&lt;br /&gt;
client-&amp;gt;attach();&lt;br /&gt;
client-&amp;gt;registerAs(“images”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Прежде всего, нам нужен объект класса DCOPClient. Этот объект предоставляется нам главным объектом приложения (объектом класса KApplication), к которому мы можем получить доступ из методов любых наших классов с помощью переменной kapp. Метод attach() объекта DCOPClient связывает наше приложение с сервером DCOP, а метод registerAs() регистрирует приложение (регистрировать нужно только те программы, которые экспортируют интерфейсы DCOP, но не те, которые только вызывают методы других объектов). Зарегистрированное имя images будет использоваться другими приложениями для доступа к нашей программе. Теперь наша программа images может быть источником сервисов DCOP.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы проверить механизм DCOP в работе, напишем программу, использующую экспортируемый метод show_image(). На диске вы найдете программу iclient, созданную в KDevelop на основе заготовки Simple KDE Application. Логика работы этой программы очень проста. Щелчок кнопки открывает диалоговое окно, в котором нужно выбрать графический файл. Выбранный файл считывается и по протоколу DCOP передается для отображения в предварительно запущенной программе images. В конструкторе главного и единственного визуального элемента, – кнопки KPushButton, мы связываем программу iclient с сервером DCOP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
DCOPClient *client = kapp-&amp;gt;dcopClient();&lt;br /&gt;
client-&amp;gt;attach();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Программа iclient не экспортирует никаких сервисов, так что метод registerAs() вызывать не нужно. В обработчике сигнала clicked, методе button_Click(), мы выполняем загрузку файла и вызываем метод show_Image() приложения images:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
void iclient::button_Clicked()&lt;br /&gt;
{&lt;br /&gt;
  QString fn = KFileDialog::getImageOpenURL(NULL, (QWidget *) this, i18n(“Open Image”)).path();&lt;br /&gt;
  QPixmap pixmap;&lt;br /&gt;
  pixmap.load(fn);&lt;br /&gt;
  QByteArray param;&lt;br /&gt;
  QDataStream dataStream(param, IO_WriteOnly);&lt;br /&gt;
  dataStream &amp;lt;&amp;lt; pixmap;&lt;br /&gt;
  DCOPClient * client = kapp-&amp;gt;dcopClient();&lt;br /&gt;
  if (!client-&amp;gt;send(“images*”, “imagesIface”, “show_Image(QPixmap)”, param))&lt;br /&gt;
    kdDebug() &amp;lt;&amp;lt; “DCOP error\n”;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разбор листинга мы начнем с конца. Метод send() класса DCOPClient осуществляет обращение к серверу DCOP. Первый параметр метода send() – имя приложения-поставщика сервисов DCOP (имя, под которым приложение зарегистрировалось на сервере DCOP). Поскольку сервер по умолчанию добавляет к имени приложения его PID (почему – мы увидим ниже), мы используем «звездочку», чтобы указать, что мы обращаемся к любому (точнее – к каждому) приложению, у которого зарегистрированное имя начинается с “images”. Второй параметр – имя интерфейса, к которому мы хотим обратиться (подчеркнем, что указывается имя интерфейса, а не класса реализации), третий параметр – имя вызываемого метода, записанное так же, как записывается имя сигнала или слота при вызове QObject::connect(). Четвертый параметр представляет собой массив значений параметров вызываемого метода. Значением этого параметра должен быть объект класса QByteArray. Для того, чтобы записать значение параметров (в нашем случае – единственного параметра объекта класса QPixmap) в QByteArray, мы создаем объект класса QDataStream (поток данных), указываем этому объекту, что приемник данных – объект param касса QByteArray, и с помощью оператора &amp;lt;&amp;lt; записываем значение объекта pixmap в этот поток.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_85_1.png|thumb|200px|Рисунок 4. Окно «Параметры проекта».]]&lt;br /&gt;
&lt;br /&gt;
Чтобы скомпилировать программу iclient, необходимо добавить в проект ссылку на библиотеку libkio.so. Эта библиотека является составной частью KDE, однако по умолчанию она не подключается к проекту Simple KDE Application. Для подключения библиотеки мы воспользуемся диалоговым окном «Параметры проекта» (команда «Проект|Параметры проекта»). В этом окне, на вкладке «Параметры make» (рис. 4), можно указать значения переменных для make-файла, в том числе значение переменной LIBS. Для подключения к проекту библиотеки libkio.so добавим значение&lt;br /&gt;
&lt;br /&gt;
 LIBS = -lkio&lt;br /&gt;
&lt;br /&gt;
Теперь можно компилировать программу.&lt;br /&gt;
&lt;br /&gt;
Что произойдет, если в системе уже запущено какое-то другое приложение с именем images? Ничего страшного не случится. Данные получит только тот экземпляр программы по имени images, в котором присутствует объект-потомок класса imagesIface и метод show_Image(QPixmap). Такое совпадение маловероятно, так что даже если на сервере DCOP одновременно зарегистрированы два приложения images, данные будут переданы только нашему приложению, но не другому. Сервер передает данные всем экземплярам приложения images, в которых существуют соответствующий объект и метод. Попробуйте запустить несколько экземпляров images, а затем передайте серверу DCOP изображение с помощью программы iclient. Вы увидите, что каждый экземпляр images получил копию картинки. Для того, чтобы данные направлялись только одному экземпляру, необходимо указывать полное DCOP-имя приложения, включающее PID. Впрочем, можно регистрировать приложение и не указывая PID. Для этого в тексте конструктора imagesView заменим вызов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
client-&amp;gt;registerAs(“images”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
на&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp-qt&amp;quot;&amp;gt;&lt;br /&gt;
client-&amp;gt;registerAs(“images”, FALSE);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь приложение будет зарегистрировано под именем “images”.&lt;br /&gt;
&lt;br /&gt;
=== Браузер DCOP ===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_85_2.png|thumb|200px|Рисунок 5. Браузер DCOP.]]&lt;br /&gt;
&lt;br /&gt;
Отладка пар приложений, работающих совместно, представляет собой более сложный процесс, чем отладка самостоятельного приложения. При возникновении сбоя в обмене данными между разными приложениями трудно сразу определить, какая из программ виновна в ошибке. При отладке распределенных приложений очень полезно иметь инструмент, представляющий собой эталонную, заведомо верную реализацию клиентской или серверной части. Имея в своем распоряжении такой инструмент, мы можем добиться правильной работы по крайней мере одного компонента системы, а затем использовать этот компонент для отладки второго. В случае отладки приложений, обменивающихся данными с помощью DCOP, мы располагаем эталонным инструментом, позволяющим убедиться в том, что приложение, зарегистрировавшее свой интерфейс на сервере DCOP, работает правильно. Функции отладки нам предоставляет браузер DCOP (DCOP Browser), рис. 5.&lt;br /&gt;
&lt;br /&gt;
Программу-браузер можно запустить с консоли командой kdcop. В окне браузера мы сначала увидим список всех приложений пользователя, зарегистрированных на сервере DCOP. Щелкнув по значку приложения, мы получим список экспортируемых им DCOP-интерфейсов. Если мы запустили приложение images до запуска браузера, мы увидим в списке и его имя. Мы также можем запустить интересующее нас приложение после запуска браузера и воспользоваться кнопкой «Обновить». Щелкнув по имени интересующего нас интерфейса (в нашем случае – imagesIface), мы получим список его методов. Мы можем использовать эти методы для передачи данных экспортирующему приложению прямо из окна браузера. Если мы щелкнем по имени метода, откроется окно ввода данных для параметров вызываемого метода (число полей в окне ввода будет соответствовать числу параметров). В браузере DCOP мы можем передавать не только строковые и численные значения параметров, но и создавать более сложные структуры данных. Например, для того, чтобы создать экземпляр класса QPixmap, нам надо просто указать имя графического файла, из которого будет считано изображение. После того как мы заполним все поля ввода и щелкнем кнопку OK, будет вызван соответствующий метод DCOP-приложения с установленными нами значениями параметров. Таким образом, мы можем проверить, действительно ли приложение images обрабатывает запросы правильно. Если с images все в порядке, мы можем приступить к отладке iclient.&lt;br /&gt;
&lt;br /&gt;
Механизм DCOP – не единственный инструмент интеграции приложений KDE. В следующей статье мы рассмотрим другой мощный инструмент интеграции – подключаемые модули.&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:Ogre</id>
		<title>LXF83:Ogre</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:Ogre"/>
				<updated>2008-04-26T08:15:49Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ogre. Добавь движенья и воды! ==&lt;br /&gt;
'' '''ЧАСТЬ 2''' Что толку от изменяющегося ландшафта, если вы прикованы к месту? '''Пол Хадсон''' знает ответ.''&lt;br /&gt;
&lt;br /&gt;
В прошлый раз мы начали работать над игрой – кандидатом в самые продаваемые в 2007 году: Висельник Чед. Мы поместили нашего героя Чеда Холла на автоматически сгенерированный ландшафт под пустым небосводом. Он готов убегать от полицейских. Но из-за пространственных ограничений мы не дали ему возможности перемещаться по игровому полю – он может только осмотреться вокруг при помощи игрока, держащего мышь. Какой преступник не может убежать от полиции? Только совершенно бестолковый. Значит, надо сделать его подвижным: пусть носится по территории. Итак, ввод с клавиатуры будет преобразовываться в движение по горизонтали и по вертикали в соответствии с рельефом.&lt;br /&gt;
&lt;br /&gt;
=== Театр Буфф(еризации) ===&lt;br /&gt;
Для начала добавим поддержку стандартных клавиш WASD. Нам самим необходимо перехватывать нажатия клавиш, а затем передавать их в Ogre, чтобы он соответственным образом переместил камеру (помните, что это стрелялка от первого лица, поэтому на самом деле мы Чеда не видим). В прошлый раз мы уже обработали клавишу Escape, поэтому вы уже примерно представляете, как написать новую часть кода. Чтобы было немного понятнее, я объединил классы CChadFrameListner и CChadGame в один класс (CChadGame). Теперь этот класс занимается и обработкой кадра, и вводом от клавиатуры, а в конце концов будет также обрабатывать механизмы игры – надеюсь, это сделает код более читабельным, ценой легкой объектной инкапсуляции!&lt;br /&gt;
&lt;br /&gt;
Для начала необходимо буферизовать ввод Ogre. Это значит, что если кто-то лупит по клавишам быстрее, чем Ogre успевает обработать, то Ogre сможет отследить, сколько раз была нажата клавиша, а затем осуществить обработку нажатий как можно скорее – даже в случае, когда клавиша была позже отжата. Например, если некий особо продвинутый игрок путешествует по нашему игровому миру, совершая хитрые трюки и маневры, чтобы побить других игроков, он может превысить число вводов в единицу времени, поддающееся обработке. Если мы будем буферизовать все, то игрок, может, пальнет и на 10 миллисекунд позже, чем планировал, но все-таки пальнет!&lt;br /&gt;
&lt;br /&gt;
Достигнуть этого можно всего одной строкой кода Ogre. Добавьте следующее в файл '''chad.h''' в конструкторе, после остальных строк:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
m_InputDevice-&amp;gt;setBufferedInput(true, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь займемся нажимаемыми клавишами – для них потребуется несколько вызовов метода isKeyDown(). Создадим вектор, задающий направление перехода (просто линия, соединяющая конечную и начальную точки); мы можем сказать Ogre, что хотим прибавить или вычесть смещение по X, Y и Z. Связав эту операцию с нажатием клавиш, мы и получим движение.&lt;br /&gt;
&lt;br /&gt;
Если вы боитесь, что это сложно, расслабьтесь – я представлю вам восхитительные 6 строк, которые выполняют всю работу. Вставьте их перед return true в методе frameStarted() заголовка '''chadframelistner.h'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Vector3 translateVector = Vector3::ZERO;&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_W)) translateVector.z = -0.1f;&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_S)) translateVector.z = +0.1f;&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_A)) translateVector.x = -0.1f;&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_D)) translateVector.x = +0.1f;&lt;br /&gt;
m_Camera-&amp;gt;moveRelative(translateVector);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраните, наберите make и запустите игру – наслаждайтесь новообретенной свободой!&lt;br /&gt;
&lt;br /&gt;
=== Птица высокого полета ===&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Почему ввод Ogre так несносен&lt;br /&gt;
|Содержание=Поэкспериментировав со вводом Ogre, вы заметите одну вещь: он капризный, непредсказуемый, простецкий и в целом невыносим. Как случилось, что лучший в мире инструментарий разработки игр имеет столь хромую систему ввода? Ответ прост: Ogre не претендует на роль инструментария для игр, занимаясь графикой, графикой и еще раз графикой – система ввода была дана разработчикам игр исключительно для создания кросс-платформенных демо. Будьте спокойны: как только понадобится более продвинутый вариант ввода, мы тут же оставим систему Ogre, но пока ее вполне достаточно для путешествий по пространству этаким одиноким облаком.&lt;br /&gt;
|Ширина=250px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Передвигаясь, вы столкнетесь с тремя большими проблемами:&lt;br /&gt;
*Так как ландшафт бугристый, кое-где вы можете вдруг провалиться сквозь землю.&lt;br /&gt;
*Направив мышь вверх и шагнув вперед (или направив ее вниз и шагнув назад), вы ни с того ни с сего взлетаете.&lt;br /&gt;
*Когда вы упираетесь в границу мира (или взлетаете в небо), ландшафт кончается, и вы видите черноту там, куда небо не достает.&lt;br /&gt;
&lt;br /&gt;
Первые две проблемы можно решить, отслеживая позицию игрока относительно ландшафта и автоматически сопоставляя высоту камеры и высоту ландшафта. Не самым худшим будет чтение файла ландшафта для извлечения точной высоты нашей текущей позиции. Реализация этой идеи сопряжена с трудностями, потому что ландшафт описан как набор точек и их высот, которые интерполируются для создания гладкой поверхности: пусть точка (0,0) имеет высоту 0, а точка (0,1) высоту 1 – все работает гладко, если игрок решит перейти из точки (0,0) в (0,1). Но в стрелялке от первого лица передвижение измеряется не в целочисленных единицах – игрок может перейти в точку (0,0.1239), а для этого значения в файле данных нет.&lt;br /&gt;
&lt;br /&gt;
Поэтому вместо этого мы прочертим линию или луч от места, где находится наша камера, вниз, затем найдем координату, где он пересекается с ландшафтом. Таким образом мы получим высоту ландшафта относительно нашей координатной системы, а затем надо изменить ее на высоту камеры относительно ландшафта (то есть рост игрока).&lt;br /&gt;
&lt;br /&gt;
Это немного сложнее, но Ogre предоставляет некоторые необходимые ресурсы. Когда начинается кадр, вызывается метод frameStarted (который теперь находится в файле '''chad.cpp''', т.к. довольно быстро разрастается!), и мы обрабатываем нажатия клавиш. Передвинув камеру, надо проверить расстояние до земли и сделать соответствующие поправки.&lt;br /&gt;
&lt;br /&gt;
Ogre предоставляет класс Ray, экземпляр которого можно создать, задав начало луча и направление. Начало задается просто координатами X,Z нашей камеры (координата Y должна быть довольно большой, чтобы гарантировать, что мы находимся над землей), а направление – вниз. Затем мы создаем объект RaySceneObject, который и проведет проверку на пересечение с землей – мы просто передадим объекту луч, созданный ранее, и велим ему выполнить запрос.&lt;br /&gt;
&lt;br /&gt;
По выполнении запроса мы беремся за пересечение (если оно есть) и устанавливаем высоту камеры соответственно высоте ландшафта. Наконец, надо освободить память, занимаемую запросом, с помощью метода destroyQuery(). Если вы думаете, что это не так легко, вы правы. Но по крайней мере этим не придется заниматься часто. Добавьте следующий код до выражения return true в методе frameStarted():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Vector3 campos = m_Camera-&amp;gt;getPosition();&lt;br /&gt;
Ray camray(Vector3(campos.x, 1000.0f, campos.z), Vector3::NEGATIVE_UNIT_Y);&lt;br /&gt;
RaySceneQuery* query = m_SceneMgr-&amp;gt;createRayQuery(Ray() );&lt;br /&gt;
query-&amp;gt;setRay(camray);&lt;br /&gt;
RaySceneQueryResult &amp;amp;result = query-&amp;gt;execute();&lt;br /&gt;
RaySceneQueryResult::iterator iter = result.begin();&lt;br /&gt;
if (iter != result.end() &amp;amp;&amp;amp; iter-&amp;gt;worldFragment) {&lt;br /&gt;
  float terrainheight = iter-&amp;gt;worldFragment-&amp;gt;singleIntersection.y;&lt;br /&gt;
  if ((terrainheight + 3.0f) != campos.y) m_Camera-&amp;gt;setPosition(campos.x, terrainheight + 3.0f, campos.z);&lt;br /&gt;
  }&lt;br /&gt;
m_SceneMgr-&amp;gt;destroyQuery(query);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перекомпилируйте. Вы увидите, что теперь две первые проблемы решены! Ура!&lt;br /&gt;
&lt;br /&gt;
=== Водный мир ===&lt;br /&gt;
Наша третья проблема состоит в том, что, добравшись до границы ландшафта, вы видите черную пустоту там, где кончается небосвод, а могли бы созерцать что-нибудь поприятнее. Ситуацию можно поправить, окружив наш остров океаном – пусть вы все еще выходите «за грань», но по крайней мере видите реалистичную воду.&lt;br /&gt;
&lt;br /&gt;
Используем для нашего океана плоскость, на которую мы можем наложить любой материал (так же, как было с небом). Мы проделаем это за пять шагов, с каждым из которых наша вода будет становиться все привлекательнее.&lt;br /&gt;
&lt;br /&gt;
Сначала необходимо создать плоскость, а затем наложить на нее одну из предустановленных в Ogre водных текстур. Для создания плоскости используем класс Plane и метод createPlane(), затем создадим объект Ogre и добавим плоскость к сцене. Вот этот код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Entity* OceanEntity;&lt;br /&gt;
Plane OceanPlane;&lt;br /&gt;
OceanPlane.normal = Vector3::UNIT_Y;&lt;br /&gt;
MeshManager::getSingleton().createPlane(&lt;br /&gt;
  “OceanPlane”,&lt;br /&gt;
      ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,&lt;br /&gt;
      OceanPlane,&lt;br /&gt;
      16000, 16000,&lt;br /&gt;
      10, 10,&lt;br /&gt;
      true, 1,&lt;br /&gt;
      50, 50,&lt;br /&gt;
      Vector3::UNIT_Z);&lt;br /&gt;
OceanEntity = m_SceneMgr-&amp;gt;createEntity(“water”, “OceanPlane”);&lt;br /&gt;
OceanEntity-&amp;gt;setMaterialName(“Examples/TextureEffect2”);&lt;br /&gt;
OceanNode = m_SceneMgr-&amp;gt;getRootSceneNode()-&amp;gt;createChildScene&lt;br /&gt;
Node(“OceanNode”);&lt;br /&gt;
OceanNode-&amp;gt;attachObject(OceanEntity)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также вам понадобится добавить одну строчку в конец CChadGame в '''chad.h''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
SceneNode* OceanNode;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подойдя к границе острова, вы увидите простирающийся океан, представленной простой текстурой &amp;lt;!--(Рис. 1)!--&amp;gt;. Для первой попытки неплохо, но пора создать нашу собственную настраиваемую текстуру воды. Создайте новый файл '''chad.material''' и введите&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
material Chad/Water&lt;br /&gt;
{&lt;br /&gt;
 technique&lt;br /&gt;
 {&lt;br /&gt;
  pass&lt;br /&gt;
  {&lt;br /&gt;
   ambient 0.2 0.5 0.8&lt;br /&gt;
   texture_unit&lt;br /&gt;
   {&lt;br /&gt;
    texture Water02.jpg&lt;br /&gt;
    scroll_anim 0.02 0&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Водная текстура та же, что и до этого, но взято меньшее значение scroll_anim, чтобы вода двигалась не так быстро. Также устанавливается синий цвет среды, чтобы вода стала более темной (Рис. 2). В '''resources.cfg''' проверьте, что за строкой [General] идет:&lt;br /&gt;
&lt;br /&gt;
 FileSystem=.&lt;br /&gt;
&lt;br /&gt;
Это позволит нам загружать материалы и другие ресурсы из рабочего каталога нашей игры, поэтому теперь можно использовать '''chad.material'''. Вернемся к файлу '''chad.cpp''': найдите строку&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
OceanEntity-&amp;gt;setMaterialName(“Examples/TextureEffect2”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и замените ее на&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
OceanEntity-&amp;gt;setMaterialName(“Chad/Water”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перекомпилируйте и увидите, что океан стал малость (ну самую малость) реалистичнее.&lt;br /&gt;
&lt;br /&gt;
Следующий шаг – использование материала из двух текстур, одна из которых будет двигаться по прямой, а вторая будет менять свое направление во время движения. Вместе они придают более естественный вид воде и больше реализма игре. В '''chad.material''' добавьте второй блок texture_unit сразу же после первого:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
texture_unit&lt;br /&gt;
{&lt;br /&gt;
   texture Water02.jpg&lt;br /&gt;
   wave_xform scroll_y sine 0 0.1 0 0.1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы меняли только файл с материалом, запускать make необходимости нет: просто наберите chad – и увидите новую воду.&lt;br /&gt;
&lt;br /&gt;
На следующем этапе, специально для любителей горных омутов, поднимем нашу воду над землей так, чтобы она затопила низины ландшафта и образовала бассейны (Рис. 3). Это очень просто – добавьте одну строчку в конец метода createScene():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
OceanNode-&amp;gt;translate(2000, 20, 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И последнее изменение: добавим воде немного движения, напоминающего легкий прилив/отлив. Реализацию можно осуществить множеством хороших, продвинутых и сложных способов – но мы этого делать не будем! На самом деле наша плоскость с водой будет подниматься и опускаться каждый кадр. Некоторые норовят написать для этого не меньше десяти строк кода, хотя на самом деле нужно всего три. Вот первая – добавьте ее под CChadGame в файле '''chad.'''h, но до определения OceanNode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
double m_OceanFlowNum;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь добавьте следующие две строки в конец frameStarted() в файле '''chad.cpp''' перед выражением return true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
OceanNode-&amp;gt;translate(0, sin(m_OceanFlowNum) / 2000, 0);&lt;br /&gt;
m_OceanFlowNum += 0.001;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь у нас есть вода, которая использует две независимо двигающиеся текстуры, и она имеет определенную высоту, что позволяет образовать небольшие водоемы на острове. В качестве бонуса, мы добавили небольшой эффект текучести, придав сцене динамики. Пока этого более чем достаточно; перейдем к следующей теме...&lt;br /&gt;
&lt;br /&gt;
=== Берем еще одну планку ===&lt;br /&gt;
Все выглядит неплохо, но на этом уроке я хочу реализовать еще одну вещь: простую инфраструктуру для нашего игрока. Развивать ее мы будем после, а сейчас я хочу представить вам базовый класс игрока, отслеживающий, бежим мы или идем. В данный момент наша камера по нажатию клавиш передвигается на фиксированное расстояние, поэтому надо немного поработать, чтобы класс игрока сам решал, как мы должны передвигаться, в зависимости от состояния (бежит, ползет, прыгает и так далее).&lt;br /&gt;
&lt;br /&gt;
Заинтригованы? Отлично. Создайте новый файл '''chadplayer.h''' и запишите в него следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CChadPlayer {&lt;br /&gt;
public:&lt;br /&gt;
  CChadPlayer();&lt;br /&gt;
  float getSpeed();&lt;br /&gt;
  bool m_IsRunning;&lt;br /&gt;
  bool m_IsCrouching;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это определение простого класса игрока; позже мы добавим и другие элементы. Сейчас он содержит только метод getSpeed(), который возвращает скорость, с которой надо передвинуть игрока, а также две булевые переменные, отслеживающие наше состояние – бежим или ползем. Реализация этого класса, '''chadplayer.cpp''', выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include “chadplayer.h”&lt;br /&gt;
CChadPlayer::CChadPlayer() {&lt;br /&gt;
  m_IsRunning = false;&lt;br /&gt;
  m_IsCrouching = false;&lt;br /&gt;
}&lt;br /&gt;
float CChadPlayer::getSpeed() {&lt;br /&gt;
  if (m_IsCrouching) return 0.005f;&lt;br /&gt;
  if (m_IsRunning) return 0.2f;&lt;br /&gt;
  return 0.1f;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пока ничего сложного, но, как я уже сказал, на следующих уроках мы расширим его возможности.&lt;br /&gt;
&lt;br /&gt;
Следующим шагом создадим и удалим объект игрока внутри '''chad.cpp''', поэтому добавьте эту строку после объявления m_Viewport в '''chad.h'''...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CChadPlayer* m_Player;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...затем в '''chad.cpp''' добавьте строку в начало метода run()...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
m_Player = new CChadPlayer();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...и, наконец, строку в деструктор ~CChadGame() в '''chad.cpp'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
delete m_Player;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы добавили код для игрока, но чтобы игра заново скомпилировалась, необходимо подредактировать Makefile так, чтобы '''chadplayer.cpp''' оказался в списке сразу после '''chad.cpp''' в цели all.&lt;br /&gt;
&lt;br /&gt;
Теперь надо изменить код, отвечающий за передвижение игрока в методе frameStarted(), чтобы он использовал метод getSpeed(). Самым простым будет вызвать getSpeed() четыре раза, но гораздо лучше использовать промежуточную переменную, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
float playerspeed = m_Player-&amp;gt;getSpeed();&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_W)) translateVector.z = -playerspeed;&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_S)) translateVector.z = +playerspeed;&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_A)) translateVector.x = -playerspeed;&lt;br /&gt;
if (m_InputReader-&amp;gt;isKeyDown(KC_D)) translateVector.x = +playerspeed;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь игра должна компилироваться и запускаться, хотя сейчас вы никакой разницы не заметите, потому что мы не устанавливали значения m_IsRunnig и m_IsCrouching. Приступим к последнему заданию на сегодня&lt;br /&gt;
&lt;br /&gt;
=== Идем верным путем ===&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Тестируем воду&lt;br /&gt;
|Содержание=На каждом новом уроке мы будем увеличивать реализм игры, чтобы игрок все больше втягивался в игровой мир. Но, пытаясь быть реалистичным, вы&lt;br /&gt;
столкнетесь с проблемой, похожей на ту, что мы получили с водой – что считать реализмом? Какого цвета должна быть вода – синего, зеленого, смешанного или просто прозрачной? Должны ли отдаленные предметы заволакиваться дымкой? Если да, то насколько?&lt;br /&gt;
Если вы живете в правильном месте, можете выйти наружу и посмотреть, какие цвета и настройки использовать для игры; увы, для большинства из нас это роскошь. Но не горюйте: иногда реализм не означает приближения к реальной жизни. &lt;br /&gt;
На самом деле необходимо выдерживать стереотип, который сложился у сотен людей, листавших каталоги путешествий. Сделайте вашу воду синей (или зеленой), на собственный вкус, лишь бы она казалась реальной лично вам и не мешала продолжать разработку – только это нам и важно.&lt;br /&gt;
|Ширина=250px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Это сравнительно небольшое изменение, но оно действительно придаст игре достойный вид. Мы собираемся отслеживать нажатие левого Ctrl (ползти) и левого Shift (бежать). Придется немного поработать, потому что надо расширить класс CChadGame, чтобы реализовать класс KeyListener (а также классы FrameListener, MouseListner, MouseMotionListener).&lt;br /&gt;
&lt;br /&gt;
Шаг первый: добавьте в проект файл '''OgreKeyEvent.h'''. Он позволит определять, какая клавиша была нажата. Добавьте следующий код рядом с другими выражениями #include в '''chad.h''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include “OgreKeyEvent.h”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ниже вы увидите строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CChadGame : public FrameListener, public MouseListener, public MouseMotionListener {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавьте после MouseMotionListner запятую, а затем KeyListner.&lt;br /&gt;
&lt;br /&gt;
Идем дальше вниз – перед строкой Root* m_Ogre добавьте эти три строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void keyPressed(KeyEvent *e);&lt;br /&gt;
void keyReleased(KeyEvent *e);&lt;br /&gt;
void keyClicked(KeyEvent *e) { }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эти три метода необходимы для реализации класса KeyListener. Мы собираемся реализовать первые два метода, когда клавиша нажата и когда отпущена соответственно. Последний метод мы оставим пустым, так как он нам не нужен – этот метод вызывается, когда клавиша сначала нажимается, затем отпускается.&lt;br /&gt;
&lt;br /&gt;
Покончив с файлом '''chad.h''', переходим к '''chad.cpp''', в котором нам надо реализовать методы keyPressed() и keyReleased():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void CChadGame::keyPressed(KeyEvent *e) {&lt;br /&gt;
  printf(“Key pressed!\n”);&lt;br /&gt;
  switch (e-&amp;gt;getKey()) {&lt;br /&gt;
    case KC_LCONTROL:&lt;br /&gt;
    m_Player-&amp;gt;m_IsCrouching = true;&lt;br /&gt;
    break;&lt;br /&gt;
    case KC_LSHIFT:&lt;br /&gt;
    m_Player-&amp;gt;m_IsRunning = true;&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
void CChadGame::keyReleased(KeyEvent *e) {&lt;br /&gt;
  switch (e-&amp;gt;getKey()) {&lt;br /&gt;
    case KC_LCONTROL:&lt;br /&gt;
    m_Player-&amp;gt;m_IsCrouching = false;&lt;br /&gt;
    break;&lt;br /&gt;
    case KC_LSHIFT:&lt;br /&gt;
    m_Player-&amp;gt;m_IsRunning = false;&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не думаю, что стоит комментировать этот код, но на всякий случай скажу, что KC_LCONTROL означает ‘код клавиши левого Ctrl’, а KC_LSHIFT означает ‘код левого Shift’.&lt;br /&gt;
&lt;br /&gt;
Далее найдите метод addFrameListner(). Сразу же за ним добавьте эту строчку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
m_Ogre-&amp;gt;addKeyListener(this);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраните все файлы и запустите make – теперь вы играете в полноценную игру: можете и бегать, и на четвереньках ползти, наблюдать волны и даже наслаждаться простым обнаружением столкновений. Система ввода Ogre хотя и слабовата, но работает, и поэтому мы можем в следующем номере заняться чем-нибудь поинтереснее. Присоединяйтесь!&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:XDMCP</id>
		<title>LXF83:XDMCP</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:XDMCP"/>
				<updated>2008-04-26T08:14:20Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* На старт, внимание... Настроить клиент-серверный графический инструмент */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== XDMCP за 10 минут ===&lt;br /&gt;
''Боитесь сокращений длиннее трёх букв? '''Пол Хадсон''' познакомит вас с одним из тех, которые никак нельзя пропустить…''&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Что нужно:&lt;br /&gt;
|Содержание=* Fedora Core 5&lt;br /&gt;
* Xorg 7.0&lt;br /&gt;
* Домашняя сеть&lt;br /&gt;
|Ширина=150px&lt;br /&gt;
}}&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Что получится:&lt;br /&gt;
|Содержание=* Соединённые в сеть рабочие столы на каждом компьютере.&lt;br /&gt;
* Функционал тонких клиентов задаром.&lt;br /&gt;
* Доступ к рабочему столу Linux из Windows и Mac OS X.&lt;br /&gt;
|Ширина=150px&lt;br /&gt;
}}&lt;br /&gt;
Иметь в гостиной супермощный компьютер непрактично – разве что вы не представляете свою жизнь без постоянного шума компьютерной техники. Однако Linux уже довольно давно имеет решение этой проблемы: спрячьте ваш новейший двухпроцессорный мегасервер на антресоли и соедините его по локальной сети со скромной тихой системой в другой части дома.&lt;br /&gt;
&lt;br /&gt;
Используя мощь XDMCP – X Display Manager Control Protocol – можно подключить один компьютер к другому «прозрачно» и использовать рабочий стол с другого компьютера, так, как если бы вы на нём и работали. Если вы когда-либо работали с VNC, то это покажется вам знакомым, однако XDMCP выводит этот принцип на новый уровень, отображая удалённый рабочий стол на весь экран, а не в окне. Дополнительным преимуществом XDMCP является возможность сканирования сети, поэтому вы можете использовать графический браузер и авторизоваться в любом доступном физическом компьютере.&lt;br /&gt;
&lt;br /&gt;
В этом десятиминутном руководстве мы настроим XDMCP на Fedora Core 5, который установлен на двух компьютерах: супермощном сервере и более скромном по производительности клиенте.&lt;br /&gt;
&lt;br /&gt;
Впервые за всю историю Linux Format на нашем диске (директория Magazine) вы найдёте видеозапись, иллюстрирующую это руководство. Файл закодирован в формате Ogg Theora и должен проигрываться во всех современных дистрибутивах. Если файл у вас не проигрывается, найдите и установите пакет “ogg” для вашей системы.&lt;br /&gt;
&lt;br /&gt;
== На старт, внимание... Настроить клиент-серверный графический инструмент ==&lt;br /&gt;
[[Изображение:Img_83_68_1.png|right|200px]]&lt;br /&gt;
1. На сервере (у нас ему присвоено имя hannah) перейдите в System &amp;gt; Administration &amp;gt; Login Screen. В других дистрибутивах появившееся окно может называться по-другому – в Ubuntu это Login Window, например. Если в меню данного пункта нет, просто дайте команду gdmsetup от имени суперпользователя.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_68_2.png|right|200px]]&lt;br /&gt;
2. Перейдите на вкладку Remote и переключите пункт Style на значение Same as Local. Это задействует XDMCP и теперь удалённо подключившиеся пользователи увидят тот же экран приветствия, что и локальные пользователи.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_68_3.png|right|200px]]&lt;br /&gt;
3. В нижнем правом углу окна нажмите кнопку Configure XDMCP. Теперь проверьте номер порта в пункте Listen on UDP Port – скорее всего, там указан номер 177. Нужно открыть доступ по этому порту в брандмауэре для того, чтобы XDMCP заработал.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_68_4.png|right|200px]]&lt;br /&gt;
4.Вперед, на брандмауэр! В Fedora нужные нам настройки находятся в System &amp;gt; Administration &amp;gt; Security Level and Firewall. В других дистрибутивах для настройки брандмауэра вам может понадобиться специальный инструмент, вроде Lokkit.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_68_5.png|right|200px]]&lt;br /&gt;
5. Теперь давайте выберем XDMCP. Fedora предоставляет стандартный список доверяемых сервисов, которые можно включать или выключать с помощью галочек. К сожалению, XDMCP в списке нет, поэтому вам нужно заглянуть в раздел Other Ports и добавить порт, нажав кнопку Add.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_68_6.png|right|200px]]&lt;br /&gt;
6. В появившемся окне нам необходимо вписать порт, который будет прослушиваться XDMCP. Запомнив, что Fedora сопоставила XDMCP порт 177, вписываем это число в наше окно и щёлкаем ОК.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_1.png|right|200px]]&lt;br /&gt;
7. Возвращаемся к окну настройки уровня безопасности (Security Level Configuration). Нажмите Yes для того, чтобы закрыть диалог и ещё раз Yes, когда Fedora напомнит об изменении настроек брандмауэра.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_2.png|right|200px]]&lt;br /&gt;
8. Теперь мы пересаживаемся за второй компьютер, который на наше счастье тихо работает в гостиной. Машине присвоено имя susannah. Вы уже заметили, что мы специально поменяли тему оформления GDM для того, чтобы вам было легче отличать два компьютера. Войдите в систему как обычно.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_3.png|right|200px]]&lt;br /&gt;
9. На втором компьютере зайдите в настройки уровня безопасности и добавьте порт 177 для UDP и порт 6000 для TCP. Последний необходим для сетевого подключения к X-серверу.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_4.png|right|200px]]&lt;br /&gt;
10. На этом настройки компьютера susannah закончены. Вы можете выйти из системы обратно к экрану приветствия.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_5.png|right|200px]]&lt;br /&gt;
11. Здесь вам нужно найти пункт Options. Если его нигде не видно, поместите курсор в поле для ввода имени и нажмите F10. У вас должен появиться список опций, среди которых будет Remote Login via XDMCP.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_6.png|right|200px]]&lt;br /&gt;
12. На некоторое время (пока X-сервер перезагружается) ваш экран погаснет, а затем появится окно специального диалога, который сканирует сеть на предмете хостов XDMCP. Дождитесь, пока программа найдет ваш сервер.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_7.png|right|200px]]&lt;br /&gt;
13. Если предыдущее окно не нашло ваш хост (не волнуйтесь, это обычное явление!), подойдите к нему, откройте терминал и дайте от имени суперпользователя команду ifconfig. Вы увидите подробный вывод, где найдёте свой IP-адрес.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_8.png|right|200px]]&lt;br /&gt;
14. Возвращаемся к гостевому компьютеру. В окне добавления хостов (Add Host) вводим этот IP-адрес и добавляем его кнопкой Add. Теперь в верхней части окна появится наш хост с указанием точной версии ядра – для того, чтобы вы знали, куда подключились.&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_69_9.png|right|200px]]&lt;br /&gt;
15. Когда вы нажмёте на кнопку Connect, X-сервер ещё раз перезагрузится, но на этот раз на экране появится приветствие удаленного хоста. Для входа используйте имя пользователя и пароль удаленного хоста, а не гостевого компьютера. Получилось!&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:AppArmor</id>
		<title>LXF83:AppArmor</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:AppArmor"/>
				<updated>2008-04-26T08:11:33Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: /* ПК на замке */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Армированный Linux ==&lt;br /&gt;
''AppArmor – отличный, гибкий инструмент безопасности для Linux. Его создатель, '''Криспин Коуэн''', поведает вам о нем.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основная беда безопасности приложений – невозможно сказать, как поведет себя ваше приложение в нестандартных условиях: число состояний и вариантов ввода слишком велико, чтобы исчерпывающе протестировать даже небольшую программу. Когда это выливается в проблему? Когда некто обнаруживает, что определённый набор входных данных приводит к некорректному поведению программы, и разрабатывает приложение, эксплуатирующее найденную уязвимость (подобные приложения так и называют – эксплойты, exploits).&lt;br /&gt;
&lt;br /&gt;
Для решения проблемы эксплойтов и разработан AppArmor. AppArmor обеспечивает безопасность приложений, заставляя их делать только то, что они обязаны делать и не более того. Конкретно, AppArmor контролирует файлы и функции POSIX.1e (см. '''man 7 capabilities'''), к которым приложение имеет доступ, поскольку контроль над этими ресурсами и привилегиями на вашей машине и есть мечта злоумышленника. В данной статье мы разъясним, как настроить и использовать AppArmor для защиты ваших программ и системы от атак.&lt;br /&gt;
&lt;br /&gt;
AppArmor полностью интегрирован в SUSE Linux 10.1, SLES 9 SP3 и SUSE Linux Enterprise 10. Он устанавливается и работает по умолчанию, но использует скромный набор профилей (об этом позже). Намного больший набор профилей можно найти в '''/etc/apparmor/profiles/extras/'''; вы можете скопировать их в '''/etc/apparmor.d''', где хранятся активные профили. В SUSE, интерфейс пользователя Yast содержит кнопку AppArmor, которая выводит графический эквивалент описываемых здесь инструментов genprof и logprof.&lt;br /&gt;
&lt;br /&gt;
AppArmor вступил в жизнь как проприетарная система, но после приобретения Immunix Inc в 2005 году фирмой Novell приложение выпускается по лицензии GPL. С тех пор AppArmor был портирован на Slackware, Ubuntu и Pardus Linux, турецкий  дистрибутив.&lt;br /&gt;
&lt;br /&gt;
Для установки AppArmor в Ubuntu, выполните&lt;br /&gt;
&lt;br /&gt;
 sudo dpkg -i apparmor-* libapparmor1_2.0-0ubuntu2_i386.deb linux-image-2.6.15-21-386_2.6.15-21.32mr1_i386.deb&lt;br /&gt;
&lt;br /&gt;
Заметьте, что эти пакеты включают новое ядро, поскольку для поддержки AppArmor необходима небольшая заплатка для ядра. Ubuntu основан на Debian, так что пакеты прекрасно подойдут для Debian, MEPIS и прочих систем на базе Debian. Если вы хотите использовать AppArmor в другой системе Linux, потребуется его портировать – см. врезку [[LXF83:AppArmor#Врезка2|«Двигаемся дальше»]].&lt;br /&gt;
&lt;br /&gt;
=== Обезопасим NTPD ===&lt;br /&gt;
Теории достаточно; обратимся к примеру. Рассмотрим NTPD, Network Time Protocol Daemon. Он обеспечивает синхронизацию вашей системы с главным сервером вашей локальной сети или с интернетом – важная задача! Однако для изменения вашего системного времени NTPD потребуются привилегии суперпользователя (root), а также открытый сетевой порт, чтобы узнавать время на главном сервере. В итоге получается убойная комбинация: открытый сетевой порт и доступ к процессам с правами суперпользователя – классический пример из руководства по безопасности. Злодей, нашедший уязвимость в коде NTPD, сможет атаковать демона NTP и получить права суперпользователя на вашем компьютере.&lt;br /&gt;
&lt;br /&gt;
Права суперпользователя отнять нельзя – ведь тогда NTPD не сможет менять время; открытый сетевой порт удалить тоже нельзя – тогда NTPD не сможет узнавать время. Тут-то и поможет AppArmor, ограничив привилегии NTPD посредством профиля безопасности. Вот AppArmor-профиль для программы ntpd:&lt;br /&gt;
 /usr/sbin/ntpd {&lt;br /&gt;
   #include &amp;lt;abstractions/base&amp;gt;&lt;br /&gt;
   #include &amp;lt;abstractions/nameservice&amp;gt;&lt;br /&gt;
   capability ipc_lock,&lt;br /&gt;
   capability net_bind_service,&lt;br /&gt;
   capability setgid,&lt;br /&gt;
   capability setuid,&lt;br /&gt;
   capability sys_chroot,&lt;br /&gt;
   capability sys_resource,&lt;br /&gt;
   capability sys_time,&lt;br /&gt;
   /drift/ntp.drift rwl,&lt;br /&gt;
   /drift/ntp.drift.TEMP rwl,&lt;br /&gt;
   /etc/ntp.conf r,&lt;br /&gt;
   /etc/ntp/drift* rwl,&lt;br /&gt;
   /etc/ntp/keys r,&lt;br /&gt;
   /etc/ntp/step-tickers r,&lt;br /&gt;
   /tmp/ntp* rwl,&lt;br /&gt;
   /usr/sbin/ntpd rix,&lt;br /&gt;
   /var/lib/ntp/drift rwl,&lt;br /&gt;
   /var/lib/ntp/drift.TEMP rwl,&lt;br /&gt;
   /var/lib/ntp/drift/ntp.drift r,&lt;br /&gt;
   /var/lib/ntp/var/run/ntp/ntpd.pid w,&lt;br /&gt;
   /var/log/ntp w,&lt;br /&gt;
   /var/log/ntp.log w,&lt;br /&gt;
   /var/run/ntpd.pid w,&lt;br /&gt;
 }&lt;br /&gt;
Сейчас ntpd запускается от имени root, то есть имеет доступ ко всем функциям POSIX.1e. Но этот профиль ограничивает доступ ntpd семью функциями, описанными в коде. Будучи root-процессом, ntpd мог бы читать, записывать и запускать любой файл в файловой системе, но теперь ему доступны только файлы, описанные в профиле.&lt;br /&gt;
&lt;br /&gt;
Что же произойдёт, при наличии данного профиля, если злоумышленник припас программу-эксплойт, направленную против ntdp? Будьте спокойны: ничего. У него нет прав на выполнение, а значит, простой shell-код [«полезная нагрузка» эксплойта, выполняющая задуманные злоумышленником действия, – прим. ред.] вида exec(sh) не пройдет. Если ntpd зачем-либо потребуется командная оболочка (shell), злоумышленник сможет запустить ее, но только из-под профиля, и сможет читать и записывать лишь файлы, принадлежащие ntpd на основании профиля. Короче говоря, злоумышленник сможет разве что изменить ваше системное время. AppArmor разрешил ntpd выполнять только конкретные операции – в литературе по безопасности это называется запуском приложения с наименьшими привилегиями.&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Как устроен AppArmor&lt;br /&gt;
|Содержание=&lt;br /&gt;
[[Изображение:Img_83_45_1.png|center]]&lt;br /&gt;
&lt;br /&gt;
*'''Ядро Linux 2.6''' Имеет новый интерфейс модулей безопасности Linux (Linux Security Modules), допускающий подключаемые модули безопасности. Процессы пользователя обращаются к ядру, которое при помощи всех загруженных LSM-модулей прове ряет корректность доступа.&lt;br /&gt;
&lt;br /&gt;
*'''Модуль ядра AppArmo'''r Обеспечивает реальную политику безопасности, сверяя обращение программы с профилем и запрещая либо разрешая действие.&lt;br /&gt;
&lt;br /&gt;
*'''Профили приложений''' Содержат вашу политику безопасности и описывают, что позволено делать каждому приложению.&lt;br /&gt;
&lt;br /&gt;
*'''AppArmor''' Набор программ уровня пользователя для отображения и управления профилями AppArmor. Наиболее важным из них является синтаксический анализатор (parser), который читает профили, преобразует их в структуры данных, понятные ядру, и переправляет их модулю AppArmor.&lt;br /&gt;
&lt;br /&gt;
*'''Отчеты и предупреждения''' Предоставляет отчеты о конфигурации AppArmor и предупреждает о попытках вторжения.&lt;br /&gt;
&lt;br /&gt;
*'''Yast-интерфейс''' В системах без Yast, AppArmor может управляться посредством его родного интерфейса командной строки.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Как обезопасить Apache и другие приложения ==&lt;br /&gt;
В мире огромное число приложений – фактически бесконечное, ведь люди не перестают писать код. И если вы собираетесь использовать систему безопасности, контролирующую деятельность приложений, очень важно, чтобы поддержка совместимости политик безопасности с программным обеспечением была простой, особенно при наличии постоянно прибывающих новых приложений.&lt;br /&gt;
&lt;br /&gt;
Профили AppArmor достаточно просты: нетрудно сообразить, как создать их вручную. Фактически, когда в 1998 г. появился AppArmor, именно так и делалось. Сейчас AppArmor поставляется с обучающейся системой: вы запускаете ваши приложения как обычно, а AppArmor следит и запоминает, что требуется разрешать приложению.&lt;br /&gt;
&lt;br /&gt;
Выбрав приложение, для которого нужно разработать профиль, вы отсылаете модулю ядра исходный вариант профиля, функционирующий в режиме ‘complain’ («жалоба»): нарушения политик не блокируются, а записываются в log-файл (журнал). Затем вы запускаете приложение обычным способом, и оно какое-то время работает, заодно заполняя журнал событий, характеризующих его поведение. После этого вы применяете к созданному журналу анализатор AppArmor, который задаст вам интерактивные вопросы о добавлении событий в окончательный профиль.&lt;br /&gt;
&lt;br /&gt;
=== Фабричные профили ===&lt;br /&gt;
Скрипты, поставляемые с AppArmor, выполнят за вас большую часть работы. Посмотрим, как можно создать профиль для вашего web-сервера и его web-приложений. Выполните от имени суперпользователя (root) '''genprof /usr/sbin/httpd2-prefork'''. Если для Apache ещё нет профиля, genprof создаст его, а если есть, то воспользуется уже существующим. Загрузив профиль в ядро в complain-режиме и попросив вас запустить ваше приложение с другого терминала или иным способом, genprof примется создавать журнал событий. В случае Apache, поупражняйтесь с '''/etc/init.d/apache stop''' и '''/etc/init.d/apache'''.&lt;br /&gt;
&lt;br /&gt;
Затем посетите ваш web-сайт и займитесь обслуживаемыми web-страницами. Как вы скоро увидите, посещать каждую отдельную страницу не обязательно, хотя это довольно просто, если использовать «паучка», например: '''wget --mirror http://example.com'''. Зато следует запустить каждый исполняемый файл, относящийся к сайту. Посетив достаточное для представления количество web-страниц, вновь выполните '''/etc/init.d/Apache stop''' и вернитесь к genprof.&lt;br /&gt;
&lt;br /&gt;
Нажмите S, чтобы попросить genprof просканировать журнал событий, который находится в '''/var/log/audit/audit.log''', и genprof задаст вам серию вопросов о том, как обрабатывать события. Вопросы задаются по блокам; первый – об управлении дочерними процессами, запускаемыми из программы, для которой создается профиль. Выберите из следующего:&lt;br /&gt;
&lt;br /&gt;
'''Inherit (наследование)''' Дочернее приложение (потомок) запускается с тем же профилем безопасности, что и родитель. Идеально для служебных программ; пример – сценария командной оболочки, запускающего программу cp с целью скопировать файл.&lt;br /&gt;
&lt;br /&gt;
'''Profile (профиль)''' Потомок имеет свой профиль. Осторожно: этот профиль имеет действие во всей системе, так что для его создания вам придётся проделать большую работу. Если этого потомка (например, web-приложение, обычно запускаемое web-сервером) использует только одна программа, то выбор P является безопасным. Если потомок используется разными программами, придётся погонять его во всех режимах, чтобы правильно определить его поведение для профиля.&lt;br /&gt;
&lt;br /&gt;
'''Unconfined (неограниченный)''' Потомок запускается вообще без профиля. Это очень опасный выбор, предполагающий, что у потомка нет уязвимостей. Он существует преимущественно для того, чтобы позволить системным администраторам удаленно управлять AppArmor, потому как программам с ограничениями манипуляции с AppArmor не разрешены.&lt;br /&gt;
&lt;br /&gt;
'''Deny (запрещено)''' просто не позволяет родителю запускать этого потомка.&lt;br /&gt;
&lt;br /&gt;
В каждом из блоков вопросов также имеются дополнительные опции '''abort''', которая отменяет все изменения и выходит из genprof, а также '''Finish''', которая обрывает создание профиля на данном этапе и осуществляет выход.&lt;br /&gt;
&lt;br /&gt;
Следующий блок вопросов касается функций POSIX.1e. Здесь имеются опции '''Allow (Разрешить)''' приложению доступ к этим функциям, или '''Deny (Запретить)'''. Если вы уверены, что ваше приложение не атаковалось в момент обучения, то '''Allow''', скорее всего, верный ответ. Однако если профиль создается на машине, открытой для Интернета, ваше приложение вполне может быть атаковано во время «обучения», и здесь нужна осторожность. Создание профиля приложений подобно обучению детей: они учатся на примерах, поэтому не делайте ничего дурного в их присутствии. Последний блок вопросов касается доступа к файлам. Кроме простых '''Allow''' и '''Deny''', здесь есть опции:&lt;br /&gt;
&lt;br /&gt;
'''Glob this access («Глобализовать» доступ)''' Каждое нажатие клавиши G заменяет на шаблон очередной уровень «хвоста» полного (включающего путь) имени файла. Одно нажатие '''G''' превратит '''/srv/www/htdocs/images/star.gif''' в '''/srv/www/htdocs/images/*''', второе – в '''/srv/www/htdocs/*''', и т.д.&lt;br /&gt;
&lt;br /&gt;
'''Glob with extensions («Глобализовать» с расширением)''' Создаёт шаблон из последней части пути и расширения, так что '''/usr/local/myfile.html''' превратится в '''/usr/local/*.html'''.&lt;br /&gt;
&lt;br /&gt;
'''New path specifier (Описание нового пути)''' Добавьте свой собственный путь путем создания шаблонов вручную, используя '''*''', '''?''', '''[''', ''']''', '''-''', '''{''' и '''}'''.&lt;br /&gt;
&lt;br /&gt;
Получив ответ на все вопросы, genprof вновь попросит перейти к сканированию журнала; на сей раз нажмите F. Программа genprof завершится, переведя профиль Apache в режим подавления (enforce-режим). Вам не потребуется перезапускать Apache; AppArmor может изменять статус профилей на фоне запущенного процесса. Теперь ваша система функционирует с ограничениями AppArmor согласно созданной вами политике. Эта политика будет работать и после перезагрузки – вы можете посмотреть ее в '''/etc/apparmor.d/usr.sbin.httpd2-prefork'''.&lt;br /&gt;
&lt;br /&gt;
=== Общие правила ===&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Советы по профилям AppArmor&lt;br /&gt;
|Содержание=* При обучении AppArmor, всегда оставляйте окно терминала открытым, выполнив команду '''tail -f /var/log/audit/audit.log''', чтобы видеть в реальном времени, чем занимается AppArmor.&lt;br /&gt;
* Если вам показалось, что AppArmor где-то навредил, grep’ните файл '''APPARMOR /var/log/audit/audit.log'''. Если в нём ничего нет, то причина проблемы – не AppArmor. Если есть, то AppArmor объяснит, почему он что-то заблокировал. Еще лучше запустить '''logprof''', чтобы AppArmor нашел блокирующее событие и спросил, хотите ли вы добавить его в список разрешенных для данного профиля.&lt;br /&gt;
* Команда '''complain /etc/apparmor.d/*''' быстро переведет всё в complain-режим, разрешающий все действия, так что AppArmor вообще ничего не будет блокировать. И обратно – '''enforce /etc/apparmor.d/*''' блокирует всё.&lt;br /&gt;
* Прежде чем создавать новый профиль, загляните в /etc/apparmor/profiles/extras/ – нет ли готового профиля, чтобы взять его в качестве исходного: это значительно сократит работу. AppArmor прекрасно улучшает существующие профили.&lt;br /&gt;
|Ширина=350px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Вопросы о файловом доступе, на которые вы отвечали, лишь номинально относятся к запретам. Намного важнее возможность создать общее правило доступа к файлам. Простейший случай – работа с временными (temporary) файлами, которым обычно намеренно даются случайные имена. Заменив последнюю часть пути шаблоном, вы будете уверены, что программа будет нормально работать, а не закроется с ошибкой, потому что имена временных файлов с каждым запуском меняются.&lt;br /&gt;
&lt;br /&gt;
Другой пример обобщения – имена библиотек. Например, если программе необходим доступ к '''/usr/lib/libdb_cxx-4.3.so''', наш друг genprof может предложить альтернативу '''/usr/lib/libdb_cxx-*.so''', чтобы профиль работал и после обновления версии библиотеки. Пользователю предоставляется компромисс: широкое использование шаблонов сделает профили более удобными и безотказными, но платой за это будут большие разрешения и, как следствие, снижение безопасности. Но даже с широким использованием шаблонов профили AppArmor все еще более безопасны, чем без AppArmor.&lt;br /&gt;
&lt;br /&gt;
Вот ещё один пример: genprof замечает, что событие доступа имеет соответствие в каталоге '''abstractions''', и предлагает, скажем, нечто вроде '''#include &amp;lt;abstractions/nameservice&amp;gt;''', тем самым обеспечивая все правила доступа, необходимые для DNS-запросов и локальных UID-запросов.&lt;br /&gt;
&lt;br /&gt;
=== Под надзором ===&lt;br /&gt;
Программа genprof помещает отметки в журнале и, таким образом, обучается только на событиях, происходящих в течении данной сессии genprof. Но вы можете обучать программу хоть целую неделю, невзирая на перезагрузки. Команда '''complain /usr/bin/моя_программа''' или '''complain /etc/apparmor.d/usr.bin.моя_программа''' переведет профиль программы моя_программа в complain-режим и оставит его в этом состоянии, а '''complain/etc/apparmor.d/*''' переводит все профили вашей системы в complain-режим.&lt;br /&gt;
&lt;br /&gt;
Запустите ваше приложение на сколь угодно долгое время, позаботившись, чтобы все журналы сохранялись и не удалялись при ротации. Когда вы посчитаете, что набрали достаточное количество событий, используйте программу logprof для обработки журнала так же, как делает genprof – только logprof прочитает весь файл журнала. logprof имеет ключи командной строки, указывающие, где искать журналы, с какого места журнала начинать анализ и где находится профиль, подлежащий обновлению.&lt;br /&gt;
&lt;br /&gt;
Чтобы полностью разделить процессы обучения и создания профиля, отработайте все обучающие режимы для генерации журнала событий на большой тестовой машине в QA-подразделении, а затем просто отправьте набор профилей и log-файлов по электронной почте эксперту по безопасности, который при помощи logprof преобразует события в профили. По завершении выполните команду enforce, которая работает точно так же, как команда complain, но переводит все профили в режим ‘enforce’ («подавление»).&lt;br /&gt;
&lt;br /&gt;
Эти команды AppArmor могут быть выполнены только из командной оболочки root, причём оболочка должна быть свободна от ограничений AppArmor. Все команды также имеют псевдонимы, начинающиеся с '''aa-''', таким образом вы сможете обнаружить все команды AppArmor в вашей системе, просто набрав '''aa-&amp;lt;TAB&amp;gt;''' в root-строке.&lt;br /&gt;
&lt;br /&gt;
== Как обезопасить свою систему и рабочий стол ==&lt;br /&gt;
&lt;br /&gt;
Существует две системы политик безопасности. Системы Черного списка перечисляют запрещенные вещи*, а всё остальное разрешается; таким образом, это системы, разрешающие по умолчанию. Системы Белого списка определяют то, что разрешено, а всё остальное запрещается, то есть это системы, запрещающие по умолчанию.&lt;br /&gt;
&lt;br /&gt;
Понятно, что системы Белого списка безопаснее, поскольку злоумышленник не может их обойти, просто приискав экзотический способ нагадить, который не пришёл в голову составителям списка. Но системы Черного списка удобнее для пользователей, потому что они не блокируют вас всякий раз, когда вы изобретаете новый способ применения своего ПК.&lt;br /&gt;
&lt;br /&gt;
AppArmor обходит дилемму «безопасность–удобство», используя гибридную модель. При использовании профиля для конкретной программы AppArmor действует как Белый список: разрешены только указанные файлы и функции, и профиль не позволит злоумышленнику подсунуть программе новый вариант работы во вред. Но на уровне системы AppArmor является Черным списком: ограничиваются только программы, обладающие профилем, и их потомки, а прочие программы работают без ограничений.&lt;br /&gt;
&lt;br /&gt;
Но как же определить, какую программу следует ограничить? Это зависит от вашей модели угрозы. Обязательно должны быть ограничены права всех приложений, имеющих нефильтруемый ввод данных, через которые можно осуществить атаку, потому что AppArmor никак не защищает программы без ограничений.&lt;br /&gt;
&lt;br /&gt;
=== Открыты сетевые порты ===&lt;br /&gt;
Очень часто встречающаяся модель угрозы – сетевая: плохой парень «откуда-то оттуда», взламывающий ваш сервер или настольный компьютер. AppArmor предлагает обороняться программой unconfined. Она сканирует вашу машину на наличие открытых сетевых портов, находит прослушивающие их программы и выводит их список, а также их профили, если они есть. Если вы создали профили для всех программ, отмеченных в отчете unconfined, все открытые сетевые порты «упрутся» в профили AppArmor, то есть политика AppArmor полностью определит, что сетевой злоумышленник сможет сделать на вашей машине, даже если для всех прочих программ вашей системы вы профилей не создавали.&lt;br /&gt;
&lt;br /&gt;
Вот листинг результата команды unconfined в защищенной системе (web- и mail-сервер в берлоге автора):&lt;br /&gt;
&lt;br /&gt;
 4406 /sbin/dhcpcd confined by ‘/sbin/dhcpcd (enforce)’&lt;br /&gt;
 4758 /sbin/portmap confined by ‘/sbin/portmap (enforce)’&lt;br /&gt;
 4758 /sbin/portmap confined by ‘/sbin/portmap (enforce)’&lt;br /&gt;
 5339 /usr/sbin/sshd confined by ‘/usr/sbin/sshd (enforce)’&lt;br /&gt;
 5479 /usr/sbin/httpd2-prefork confined by ‘/usr/sbin/httpd2-prefork (enforce)’&lt;br /&gt;
 6151 /usr/sbin/dhcpd confined by ‘/usr/sbin/dhcpd (enforce)’&lt;br /&gt;
 6151 /usr/sbin/dhcpd confined by ‘/usr/sbin/dhcpd (enforce)’&lt;br /&gt;
 6263 /usr/lib/postfix/master confined by ‘/usr/lib/postfix/master (enforce)’&lt;br /&gt;
 6263 /usr/lib/postfix/master confined by ‘/usr/lib/postfix/master (enforce)’&lt;br /&gt;
 6329 /usr/sbin/xinetd confined by ‘/usr/sbin/xinetd (enforce)’&lt;br /&gt;
 6329 /usr/sbin/xinetd confined by ‘/usr/sbin/xinetd (enforce)’&lt;br /&gt;
 8767 /usr/sbin/cupsd confined by ‘/usr/sbin/cupsd (enforce)’&lt;br /&gt;
 8767 /usr/sbin/cupsd confined by ‘/usr/sbin/cupsd (enforce)’&lt;br /&gt;
&lt;br /&gt;
=== ПК на замке ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;Врезка2&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Двигаемся дальше&lt;br /&gt;
|Содержание=&lt;br /&gt;
Если вы не являетесь пользователем SUSE или Debian, но хотите добавить брони AppArmor в вашу систему Linux, то программу можно портировать. Исходный код ([http://forge.novell.com/modules/xfmod/project/?apparmor http://forge.novell.com/modules/xfmod/project/?apparmor]) не зависит от архитектуры и поддерживается на всех аппаратных платформах SUSE Linux (x86, x86-64, Itanium, PowerPC, и Z-series) – один из разработчиков AppArmor в свое свободное время портировал его на свой Sharp Zaurus PDA (ARM). Вот шаги для успешного портирования:&lt;br /&gt;
#Установите на ядро заплатку, экспортирующую семафор пространства имен для ядра 2.6.15 или выше.&lt;br /&gt;
#Убедитесь, что модуль подготовлен для используемого вами ядра.&lt;br /&gt;
#Убедитесь, что скрипты инициализации вашего дистрибутива могут монтировать securityfs.&lt;br /&gt;
#Создайте пакет для вашего дистрибутива аналогично RPM для SUSE и Debs для Ubuntu.&lt;br /&gt;
#Создайте или измените профили в соответствии с вашим дистрибутивом. В частности, существует небольшой набор важных профилей, которые должны быть подправлены, особенно для набора библиотек '''ld.so'''. Удачи!&lt;br /&gt;
|Ширина=350px&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Описанный профиль подходит для сервера сетевой группы, поддерживающего web, электронную почту и печать. А как с безопасностью настольных ПК? Используется тот же подход: ограничить все приложения, подверженные атакам из сети. То есть любые приложения, работающие с сетевыми данными.&lt;br /&gt;
&lt;br /&gt;
Некоторые из этих приложений имеют прямой вход из сети, например, почтовый клиент. Другие получают данные из сети опосредованно (например, OpenOffice.org, использующийся для открытия DOC-файлов, которые некто выслал вам в виде почтового вложения). Несмотря на отсутствие прямого соединения с сетью, они осуществляют сетевой ввод и тем создают нешуточную опасность. Анализатор unconfined поможет и здесь, но учтите, что он не сможет найти приложения с чрезвычайно изменчивыми открытыми портами (некоторые IM-клиенты) и, естественно, приложения с опосредованным соединением (такие, как OOo).&lt;br /&gt;
&lt;br /&gt;
Наша настольная политика защищает систему от сетевых атак, но ничего не делает для защиты от консольного пользователя, поскольку в нашем представлении пользователь – человек опытный, который выложил немалые деньги за свой ПК и полностью его контролирует. Однако на рабочей станции переговорного пункта или в общественном киоске консоль становится основным источником опасности. Для устранения угрозы следует выявить все приложения, предоставляемые терминалом, и убедиться, что все они имеют профиль AppArmor. В данном случае клавиатура и мышь обязаны рассматриваться как угроза, точно такая же, какой сеть является для нашего сервера. Только создав профили для всего, до чего может добраться и использовать злоумышленник, мы можем считать свой долг выполненным.&lt;br /&gt;
&lt;br /&gt;
Гибкость Черного списка всей системы AppArmor позволяет обезопасить только те программы, которые внушают беспокойство. Платой за удобство является необходимость определения таких программ, для чего надо представить себе источники угрозы. Многие из нас ожидают угрозу преимущественно из сети, вот почему программа unconfined столь полезна. По-программный Черный список AppArmor разрешает каждой программе делать только то, что ей полагается, и ничего другого, игнорируя атаки злоумышленников. Комбинация списков помогает вам контролировать работу вашей системы легко и эффективно. Наслаждайтесь!&lt;br /&gt;
&lt;br /&gt;
Проект AppArmor также пытается привлечь больше участников из сообщества Open Source. Если вы администратор или пользователь Linux, вы можете запускать приложения для своих целей и публиковать результаты в списке рассылки apparmor-general ([http://forge.novell.com/mailman/listinfo/apparmor-general http://forge.novell.com/mailman/listinfo/apparmor-general]). Если вы разработчик приложений, подумайте над разработкой и распространением профилей AppArmor с вашим приложением. Намного легче обслуживать профили AppArmor, если они являются частью процесса разработки приложения. Или вы можете помочь в разработке новых возможностей AppArmor. Узнайте больше, посетив [http://en.opensuse.org/Apparmor http://en.opensuse.org/Apparmor]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_45_1.png</id>
		<title>Файл:Img 83 45 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_45_1.png"/>
				<updated>2008-04-26T08:10:45Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:Kopete</id>
		<title>LXF83:Kopete</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:Kopete"/>
				<updated>2008-04-26T08:00:22Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Сравнение&lt;br /&gt;
|кратко=Клиент мгновенных сообщений, способный работать с несколькими разными протоколами. Аналоги: Gaim или Skype.&lt;br /&gt;
|изображение=Img_83_13_2.png&lt;br /&gt;
|подпись=''Kopete'' может быть маленьким значком, а может занять весь рабочий стол.&lt;br /&gt;
|разработчик= Duncan Mac-Vicar Prett и команда разработчиков Kopete&lt;br /&gt;
|сайт=kopete.kde.org&lt;br /&gt;
|цена= Бесплатно по лицензии GPL&lt;br /&gt;
|параметр1=ФУНКЦИОНАЛЬНОСТЬ&lt;br /&gt;
|оценка1=9&lt;br /&gt;
|параметр2=ПРОИЗВОДИТЕЛЬНОСТЬ&lt;br /&gt;
|оценка2=9&lt;br /&gt;
|параметр3=ПРОСТОТА ИСПОЛЬЗОВАНИЯ&lt;br /&gt;
|оценка3=9&lt;br /&gt;
|параметр4=ДОКУМЕНТАЦИЯ&lt;br /&gt;
|оценка4=7&lt;br /&gt;
|итог=До твёрдых 10 баллов не хватает только функции Buddy Pounce, как у Gaim.&lt;br /&gt;
|рейтинг=9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Kopete 0.12.0 ==&lt;br /&gt;
''Пусть в Чили это слово значит «выпивон с друзьями»; для '''Грэма Моррисона''' Kopete – солидный IM-клиент.''&lt;br /&gt;
&lt;br /&gt;
Мы часто критикуем разработчиков KDE за увлечение сверх-функциональностью, но в некоторых случаях им удаётся соблюсти чувство меры. ''Kopete'' – один из таких случаев. Она может соединить вас одновременно с десятью разными службами мгновенных сообщений, причем сделает это, почти не озадачив пользователя. Здесь есть внушительный пакет модулей, настраиваемый пользовательский интерфейс, разнообразные оконные темы и на удивление плавный скроллинг.&lt;br /&gt;
&lt;br /&gt;
Центр вселенной ''Kopete'' – окно со списком «друзей» (buddy list). Именно здесь вы найдёте свой перечень контактов. Можно создать иерархическую структуру каталогов для друзей, родни и коллег, добавляя контакты как с помощью небольшого Мастера, так и через «приглашения», которые ваши респонденты посылают через собственные программы мгновенных сообщений.&lt;br /&gt;
&lt;br /&gt;
Конечно, все эти способности целиком зависят от используемых служб сообщений. ''Kopete'' поддерживает их во множестве (см. врезку «Переговорные сети» ниже), от IRC и Jabber до троицы наимоднейших на сегодняшний день протоколов, Microsoft’s Messenger, Yahoo’s Messenger и AOL’s instant messenger (AIM). К несчастью, все три – частные, что чрезвычайно усложняет отслеживание внутренних изменений и работу со скрытыми функциями для сторонних клиентов вроде Kopete. В результате некоторые подключения проваливаются, а больше всего страдает обмен файлами – особенно между ''Kopete'' и ''MS Messenger''. Получить файлы от клиентов MS Messenger мы ещё смогли, а вот отправить – уже нет.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Left&lt;br /&gt;
|Заголовок=ПЕРЕГОВОРНЫЕ СЕТИ&lt;br /&gt;
|Содержание=Kopete работает со следующими протоколами:&lt;br /&gt;
* AIM&lt;br /&gt;
* Gadu-Gadu&lt;br /&gt;
* Novell’s GroupWise&lt;br /&gt;
* ICQ&lt;br /&gt;
* IRC&lt;br /&gt;
* Jabber&lt;br /&gt;
* MSN Messenger&lt;br /&gt;
* SMS&lt;br /&gt;
* WinPopup&lt;br /&gt;
* Yahoo&lt;br /&gt;
|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
С Jabber, открытым протоколом, таких проблем не возникает. ''Kopete'' бесперебойно работает с Jabber messaging от Google через Google Talk, поэтому просто здорово, если у ваших друзей есть Gmail.&lt;br /&gt;
&lt;br /&gt;
=== Мета-контакты ===&lt;br /&gt;
Службы сообщений, которыми пользуются ваши респонденты, отображены маленькими значками рядом с их именами. Но действительно по-умному ''Kopete'' управляется с этим скопищем контактов и протоколов при помощи так называемых мета-контактов (они позволяют одному контакту иметь несколько разных протоколов). Например, если у Пола есть учётные записи в Jabber, AIM и Yahoo, для каждого из этих протоколов можно создать отдельную запись в списке. С помощью мета-контакта подтащите все протоколы к его имени и наблюдайте за их состоянием по значку протокола – существенная экономия места, и пользоваться удобно. Чтобы связаться с Полом через Jabber, просто щёлкните значок Jabber напротив его имени.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_83_13_1.png|thumb|Hot New Stuff позволяет загружать значки и темы для ''Kopete''.]]&lt;br /&gt;
&lt;br /&gt;
Разработчики ''Kopete'' не сидят сложа руки: последние несколько месяцев они потратили на отладку нескольких новых функций для нынешней версии 0.12. Самая заметная из них – Hot New Stuff (Горячие Новинки). Это (ужасный) KDE-термин для загружаемого контента, включенного в приложения, а в ''Kopete'' он означает новейшие значки, темы и оконные стили чатов с [http://www.kde-look.org www.kde-look.org]. Загружаются Новинки с помощью двух дополнительных кнопок в панелях настройки окон «Emoticons» и «Chat». В отличие от ''SuperKaramba'', где соединения с Hot New Stuff иногда срываются, в ''Kopete'' всё работает надёжно – и это прекрасная возможность освежить вид вашей программы.&lt;br /&gt;
&lt;br /&gt;
Ещё одно заметное новшество – экспериментальное включение Jingle, голосового расширения Jabber для работы с Google Talk. Нам удалось добиться некоторых успехов при общении ''Kopete-Kopete'', но вот попытки поговорить через ''Kopete'' с Google Talk неизменно проваливались.&lt;br /&gt;
&lt;br /&gt;
На грустной ноте заканчивать не хотелось бы, ведь ''Kopete'', наряду с ''Gaim'', один из лучших клиентов мгновенных сообщений для любой системы. Если уж на то пошло, можно сказать, что нынешняя версия ''Kopete'' превзошла Gnome-соперника. И вообще, есть целый ряд причин, почему ''Kopete'' – это хорошо: проверка правописания в реальном времени, оконные стили в XML, система чатов-вкладок в единственном окне, модули перевода на разные языки, текстовые эффекты, IRC и мгновенные сообщения из единственного приложения, шифрование переговоров, плавные графические переходы, отправка сообщений на мобильные телефоны.&lt;br /&gt;
&lt;br /&gt;
Ну, как тут не попробовать ''Kopete''?&lt;br /&gt;
&lt;br /&gt;
[[Категория:Обзоры]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_13_2.png</id>
		<title>Файл:Img 83 13 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_13_2.png"/>
				<updated>2008-04-26T07:59:52Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_13_1.png</id>
		<title>Файл:Img 83 13 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_13_1.png"/>
				<updated>2008-04-26T07:59:37Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: загружена новая версия «Изображение:Img 83 13 1.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF83:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-23T13:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Врезка&lt;br /&gt;
|Заголовок= Наши эксперты&lt;br /&gt;
|Содержание=Наши эксперты найдут ответ на самый трудный ваш вопрос. Если у вас проблемы с установкой, настройкой модема, сетью или еще чем-нибудь – просто напишите нам, а обо всем остальном мы позаботимся.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:img_83_106_1.jpg|thumb|Владея Интернет провайдером, а заодно подрабатывая редактором дисков для LXF, Нейл Ботвик скромно зовет себя мастером на все руки.]]&lt;br /&gt;
[[Изображение:img_83_106_2.jpg|thumb|Для административных вопросов: Кингс Коблер является системным инженером и администратором Linux в Rackspace, и использует Linux 10 лет.]]&lt;br /&gt;
|Ширина=220px}}&lt;br /&gt;
&lt;br /&gt;
=== Fedora без сети ===&lt;br /&gt;
:* Я установил Fedora Core 5, и все вроде прекрасно, кроме одного. Когда я пытаюсь выполнить Add/Remove Programs (Добавить/Удалить программы) или Packager Updater (Обновление пакетов), у меня запрашивается пароль root. Затем я получаю сообщение об ошибке: «Не могу получить информацию о приложении» или «Не могу получить информацию об обновлении». Единственным отступлением от стандартной установки является отказ от Logical Volume Manager; вместо этого я вручную разбил диск на /boot (100 MБ), / (38 ГБ) и swap (1024 МБ). Да еще мой ПК не подключен к Интернету. Я пытался установить и с CD, и с вашего DVD приложения. Но получаю те же ошибки. '''Альфред Мифсуд [Alfred Mifsud]'''&lt;br /&gt;
&lt;br /&gt;
Отсутствие Интернет-соединения и есть причина этих сообщений. Обе программы при работе пытаются прочитать информацию из online-репозитория программ. В случае Software Updater это неизбежно: по самой своей природе обновления новее пакетов на установочных носителях, так что без соединения с Интернетом не обойтись.&lt;br /&gt;
&lt;br /&gt;
Во избежание этой ошибки с Add/Remove Programs, вам нужно отредактировать файлы репозитория: отключить все online-источники и добавить DVD. Делается это из-под root. Загрузите /etc/yum.repos.d/fedora-core.repo в ваш любимый текстовый редактор, найдите начало раздела [core] и закомментируйте строки baseurl и mirrorlist, поместив в начало каждой строки #. Затем добавьте новую строку вида&lt;br /&gt;
&lt;br /&gt;
 baseurl=file:///media/disk&lt;br /&gt;
&lt;br /&gt;
Создастся новый репозиторий на /media/disk, где смонтирован DVD. Затем вам следует отредактировать другие .repo-файлы и изменить все вхождения enabled=1 на enabled=0. Теперь единственный активный репозиторий – это DVD, и запуск Add/Remove Software должен позволить вам установить приложения с диска. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Черепашья почта ===&lt;br /&gt;
:* Мой почтовый сервер на основе Qmail отправляет почту с большой задержкой. Я пытался ускорять его, но ничего не вышло. Не могли бы вы перечислить, что может вызывать задержку? '''Т.Мэтьюс [T Matthews]'''&lt;br /&gt;
&lt;br /&gt;
Наиболее вероятная причина задержек – запросы DNS. Первое и главное, убедитесь, что имя сервера нормально разрешается. Кроме того, для IP-адреса, используемого сервером для отправки почты, должна быть создана PTR-запись. Вы также можете ускорить запросы, запустив собственный локальный кэширующий сервер имен.&lt;br /&gt;
&lt;br /&gt;
Также можно отключить DNS-запросы вообще. Если вы запускаете qmail-smtpd через tcpserver, то добавьте в его опции флаг -H, чтобы он не искал имена хостов в DNS, и удалите переменную среды $TCPREMOTEHOST. Во избежание зацикливания вы должны использовать эту опцию для серверов по TCP-порту 53. Если это не так, то вы, вероятно, запускаете его через inetd/xinetd; и можете добавить в конфигурацию флаг -Rt0, в пункте server_args конфигурационного файла вашего inetd/xinetd. Это запретит Qmail выполнять запросы ident при установлении SMTP-соединения. Проделанные действия проявляют себя в задержке между установлением TCP-соединения и появлением приглашения.&lt;br /&gt;
&lt;br /&gt;
А если ваша очередь постоянно переполняется, можете добавить файл '''/var/qmail/control/queuelifetime''' и установить в нем срок менее семи дней (срок по умолчанию, означающий, что попытки отправки всех поступающих писем будут повторяться в течение недели). Одного или двух дней вполне хватит. Эти шаги должны снизить время, необходимое Qmail для отображения приглашения. '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Реаниматор ===&lt;br /&gt;
:* Мой друг владеет маленькой юридической фирмой (шесть пользователей, использующих Windows XP Pro, Linux proxy/mail сервер). Они часто портят компьютеры, и он зовет меня чинить их. Обычно это означает резервирование всех документов, сохраненных где попало, и переустановку Windows.&lt;br /&gt;
&lt;br /&gt;
:Поэтому я пытаюсь найти и установить полностью автоматизированную систему на базе Linux для восстановления после сбоев, которая бы производила резервирование после каждой установки (типа Ghost или G4L) и еженощно резервировала бы каждую рабочую станцию, чтобы, если кто-то навредил, нужно было только загрузиться с другого компьютера в сети или с CD и восстановить систему из образов с backup-сервера. '''Кристос Иоанну [Christos Ioannou]'''&lt;br /&gt;
&lt;br /&gt;
Здесь две отдельных проблемы. Первая – это создание резервной копии на CD или в сети, чтобы полностью переустановить систему в серьезном случае. Вторая – регулярное резервирование данных.&lt;br /&gt;
&lt;br /&gt;
Вы не ошибетесь, если для первого пути выберите Partition Image – [http://www.partimage.org www.partimage.org]. Это Linux-программа, имеющая клиент-серверные функции. Вы можете запустить сервер на вашем Linux-компьютере и использовать Live CD для создания образов дисков каждой Windows-машины. Вам понадобится Live-CD дистрибутив, который можно будет использовать для восстановления диска из файл-образа на сервере. RIP (Recovery Is Possible [«восстановление возможно»; также Rest In Peace – покойся с миром – надпись на надгробье; см. стр. 48 – прим. ред.]) вполне подойдет ([http://www.tux.org/pub/people/kent-robotti/looplinux/rip www.tux.org/pub/people/kent-robotti/looplinux/rip]). Документация содержит детальные инструкции изменения CD-образа под ваши нужды; вы можете добавить небольшой скрипт командной оболочки и вызвать его из /etc/rc.d/rc.local, чтобы автоматизировать полное восстановление системы при загрузке с CD.&lt;br /&gt;
&lt;br /&gt;
Для ночного инкрементного резервирования хорошим выбором будет BackupPC ([http://backuppc.sourceforge.net http://backuppc.sourceforge.net]). Она запускается на Linux сервере и не требует специального ПО, установленного на Windows ПК, т.к. доступ к нему осуществляет Samba. Нужно только настроить на ПК совместное использование, чтобы BackupPC смог заполучить файлы. Вся работа выполняется на Linux-машине, так что ночным резервированием сможет управлять простое задание Cron. BackupPC обладает web-интерфейсом, и пользователям не придется учить загадочные команды для восстановления файлов из резервной копии.&lt;br /&gt;
&lt;br /&gt;
Эта программа особенно хороша при резервировании некоторого числа схожих ПК, поскольку хранит одну копию файла, находящегося на нескольких компьютерах. Вместе со сжатием это значительно уменьшает требуемое пространство для резервирования узлов сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Захват экрана ===&lt;br /&gt;
:* Ищу приложение, которое бы записывало все, что я делаю на машине, в небольшой фильм. Можете ли вы что-то порекомендовать? '''Мак-Скрафф [McScruff]''', с форума&lt;br /&gt;
&lt;br /&gt;
Для этого существует множество решений, в зависимости от предназначения фильма. Если вы хотите опубликовать его в Интернете, лучшим выбором будет Vnc2swf. Она записывает VNC-сессию как Flash-анимацию. Вам нужно будет установить VNC (или Tightvnc с [http://www.tightvnc.com www.tightvnc.com]). VNC создан для удаленного рабочего стола, но вы также можете использовать его на одном компьютере. Запустите VNC-сессию&lt;br /&gt;
&lt;br /&gt;
 vncserver -depth 16 -geometry 800x600&lt;br /&gt;
&lt;br /&gt;
и увидите строку вида:&lt;br /&gt;
&lt;br /&gt;
 New ‘X’ desktop is yourhostname:N&lt;br /&gt;
&lt;br /&gt;
Последняя часть – имя хоста (yourhostname) и номер дисплея. Если ваш компьютер не подключен к сети, можете использовать localhost. Теперь начните сессию командой&lt;br /&gt;
&lt;br /&gt;
 vnc2swf -startrecording -geometry 800x600 -depth 16 -framerate 5 demo.swf yourhostname:N.0&lt;br /&gt;
&lt;br /&gt;
Убедитесь, что разрешение (geometry), глубина цвета (depth), имя хоста (yourhostname) и дисплей соответствуют только что запущенному вами VNC-серверу. '''.0''' в конце обязателен. Появится новое окно, содержащее рабочий стол VNC-сессии, и все, что вы будете делать в нем, запишется в demo.swf. Завершите запись, закрыв это окно. Программа выведет некоторый HTML-код для просмотра Flash-анимации в web-браузере, который вы при желании можете перенаправить в файл. Размер и количество кадров определяется web-браузером, но для вывода демонстрации локально на монитор или проектор вы можете захотеть увеличить и то и другое.&lt;br /&gt;
&lt;br /&gt;
Для генерации фильма можете использовать Vncrec. Работает она по той же схеме, что и Vnc2swf, но создает файл в своем собственном формате, который вы может перекодировать в AVI или MPEG при помощи transcode.&lt;br /&gt;
&lt;br /&gt;
 vncrec -record demo.vnc&lt;br /&gt;
 transcode -x vnc --use_rgb -y xvid - k --dvd_access_delay 5 -f 10 -i demo.vnc -o demo.avi&lt;br /&gt;
&lt;br /&gt;
Используемое разрешение опять-таки должно совпадать с разрешением, в котором запущен сервер. Ключ -f устанавливает количество кадров в секунду для видео. Получившийся файл может быть просмотрен в любом видеопроигрывателе, например, MPlayer или Xine.&lt;br /&gt;
&lt;br /&gt;
Какое бы записывающее приложение вы ни выбрали, если вы хотите, чтобы в начале записи запускалась некоторая программа, то пропишите ее в ~/.vnc/xstartup:&lt;br /&gt;
&lt;br /&gt;
 ooimpress sample.pps&lt;br /&gt;
&lt;br /&gt;
Другая возможность – Istanbul с [http://live.gnome.org/Istanbul http://live.gnome.org/Istanbul]. Это программа для Gnome, но работает и на других рабочих столах. Она помещает иконку на панели: нажмите ее для начала записи, а повторное нажатие остановит запись. Результат сохраняется под именем ~/desktop-recording.ogg, в формате Theora. Она может показаться примитивной по сравнению с альтернативами, но настраивается быстро и легко. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Лишенец прав! ===&lt;br /&gt;
:* Я недавно перешел с Xandros на Fedora Core 5. Я перекачал 3 ГБ данных и обнаружил, что все файлы в моем домашнем каталоге имеют владельца и принадлежат к группе root. Есть ли скрипт, который поможет мне изменить права доступа на мое имя пользователя? '''Д.Ригли [D Wrigley]'''&lt;br /&gt;
&lt;br /&gt;
Если вы скопировали свой домашний каталог (к примеру, /home/dave) с одной машины на другую, наилегчайший способ восстановить владельца в этом каталоге – рекурсивно выполнить chown от имени root в /home/dave с корректными именем и группой владельца. Это можно безопасно сделать в вашем домашнем каталоге, поскольку он обычно содержит только файлы и каталоги, принадлежащие пользователю и группе пользователя, к которому относится этот каталог.&lt;br /&gt;
&lt;br /&gt;
 chown -R macdaddy:macdaddy /home/macdaddy&lt;br /&gt;
&lt;br /&gt;
Если у вас много файлов и каталогов, принадлежащих другим пользователям и группам, необходимо выполнить поиск с заменой. Так что если пользователь ‘dave’ имеет множество файлов и каталогов в '''/var/www/html''' и вы хотите сменить владельца этих файлов на пользователя и группу ‘bigmac’, следует применить chown -R для смены владельца каталогов. Беда в том, что заодно поменяют владельца и те файлы, которые вам трогать не хотелось. Чтобы каталоги, не принадлежащие Dave, остались без изменений, для поиска и смены владельца используйте команду find,:&lt;br /&gt;
&lt;br /&gt;
 find /var/www/html -user dave -group dave -exec chown bigmac:bigmac {} \;&lt;br /&gt;
&lt;br /&gt;
Эта команда найдет любой каталог или файл в /var/www/html, принадлежащий пользователю и группе dave, а затем сменит владельца на bigmac. {} указано для замены найденных файлов, соответствующих критериям -user и -group, а \; необходимо во избежание интерпретации ; командной оболочкой, и чтобы сообщить find, что список параметров закончился.&lt;br /&gt;
&lt;br /&gt;
Итак, для стандартных домашних каталогов наилегчайший способ сменить владельца единовременно – использовать команду chown -R. Помните, что этот метод применим не во всех частях файловой системы! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Пропал Thunderbird ===&lt;br /&gt;
:* Щелкая на email-адресе в KDE, я получаю ошибку: ‘Kdeinit can not start /usr/share/application/Thunderbird/Thunderbird’. Thunderbird установлен в /opt/Thunderbird. Был у меня SUSE, но в сейчас я использую Gentoo, и когда я переносил каталог /home, вероятно, что-то затер в Kdeinit, но не могу понять что. Не могли бы вы сказать мне, как сделать, чтобы Kdeinit искал в нужном месте? '''Стюарт [Stewart]'''&lt;br /&gt;
&lt;br /&gt;
Похоже, что KDE не там ищет Thunderbird. Как и большинство опций KDE, вы можете изменить это в Центре управления KDE; хотя найти нужное место в Центре Управления трудно – там столько всего, и не всегда там, где вы ожидаете увидеть. Центр Управления содержит функцию поиска, которая обычно помогает, но не в этом случае (по крайней мере не в KDE 3.5.3). Нужная вам опция находится в Компоненты &amp;gt; Выбор Компонентов &amp;gt; Email-клиент. Выберите радиокнопку Использовать другой Email-клиент, затем щелкните на маленькой иконке справа от строки ввода чтобы открыть окно выбора приложения. Выбрав программу таким образом, вы установите верный путь.&lt;br /&gt;
&lt;br /&gt;
Thunderbird откроется, но без адреса получателя или любой другой информации. Чтобы исправить это, добавьте следующее в строку запуска Thunderbird:&lt;br /&gt;
&lt;br /&gt;
 -compose “mailto:%t?subject=%s&amp;amp; body=%B”&lt;br /&gt;
&lt;br /&gt;
Задержите курсор мыши над строкой ввода, чтобы увидеть доступные опции. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Спутанные карты ===&lt;br /&gt;
:* Только что установил Fedora Core 5, и слегка в недоумении: какая из моих сетевых карт работает. У меня их две, и при предыдущих установках по умолчанию использовалась eth0. Вот результат выполнения ifconfig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0 Link encap:Ethernet HWaddr 00:30:18:58:4A:A3&lt;br /&gt;
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
UP BROADCAST MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
eth1 Link encap:Ethernet HWaddr 00:50:BA:B3:B1:A5&lt;br /&gt;
inet addr:192.168.1.152 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::250:baff:feb3: b1a5/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:258479 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:264885 errors:0 dropped:0 overruns:13 carrier:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
: Мне кажется, что при работе в сети весь трафик идет через eth1. Можете ли вы пролить свет на это? '''pk_fox'''&lt;br /&gt;
&lt;br /&gt;
Вы используете DHCP на обеих сетевых картах? Если да, то вот что скорее всего происходит:&lt;br /&gt;
# Обнаруживается первая сетевая карта (NIC) и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
# Определяется вторая NIC и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
&lt;br /&gt;
Четвертый шаг переписывает шлюз по умолчанию в таблице маршрутизации, забивая установки, сделанные на втором шаге. Вы можете проверить это, выполнив&lt;br /&gt;
&lt;br /&gt;
 route -n&lt;br /&gt;
&lt;br /&gt;
Строка, показывающая расположение 0.0.0.0, завершается интерфейсом, используемым по умолчанию. Есть ли причина, по которой вы используете две NIC? Если да, то вам, видимо, придется настроить шлюз по умолчанию вручную. Или же отключите опцию activate device when computer starts для одной из NIC в программе настройки сети. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Сам себе браузер? ===&lt;br /&gt;
:* Я управляю сервисом хостинга, на нем более 100 доменов. Последние несколько дней стало казаться, что наш сервер тормозит. Я выполнил несколько предварительных тестов (используя netstat) и обнаружил множество соединений с моего сервера по TCP-порту 80 к моему серверу по временным портам. Из полученных результатов я понял, что имеются соединения от Apache по порту 80 к другим портам моего сервера. Но почему? Как мой сервер может просматривать мои собственные web-сайты? Используется Apache 2 под Red Hat Enterprise Linux 3. '''Джон [John]'''&lt;br /&gt;
&lt;br /&gt;
Весьма похоже, что это поведение спровоцировал один из ваших новых web-сайтов. Из описанного вами отчета netstat я делаю вывод, что некий код вызывает соединения с вашим сервером. Проанализировав деятельность сервера Apache, мы можем сравнить число netstat-соединений с обслуживаемыми Apache. Для этого поместим следующее в конфигурационный файл Apache (/etc/httpd/conf/httpd.conf):&lt;br /&gt;
&lt;br /&gt;
 ExtendedStatus on&lt;br /&gt;
 &amp;lt;Location /server-status&amp;gt;&lt;br /&gt;
  SetHandler server-status&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы откроете страницу www.domain.com/server-status?refresh=5, то статус вашего сервера будет обновляться раз в пять секунд. Уделите особое внимание загруженности процессора и числу секунд с начала нового запроса (SS). Также, сравнивая число соединений выдаваемых netstat с числом соединений на отдельном виртуальном хосте, вы быстро найдете виновника! '''KK'''&lt;br /&gt;
&lt;br /&gt;
=== Саботаж Sendmail ===&lt;br /&gt;
:* Я создаю сервер для размещения управляющего ПО нашей лаборатории (я написал его на PHP, благодаря урокам в LXF!). Установил сервер Kubuntu с Sendmail – и начались проблемы.&lt;br /&gt;
&lt;br /&gt;
:Я выполнил простую настройку Sendmail, оставив все как есть, поскольку почти ничего не понимаю в настройке Sendmail! Он отправляет почту людям в локальной сети (например, john@localnet.co.uk), но во внешний мир ничего не исходит (например, на john@hotmail.com). Был бы очень благодарен за совет – а может, и за учебник по установке почтового сервера? '''Джон Клейтон [John Clayton]'''&lt;br /&gt;
&lt;br /&gt;
Sendmail – не лучший выбор для вас. Это несомненно мощный почтовый сервер, но, увы, трудно настраиваемый. Postfix или Exim больше подойдут вам, они оба доступны через репозиторий Ubuntu (Postfix – стандартный почтовый сервер и находится на установочных дисках Ubuntu). Эти сервера отлично документированы, файлы настроек имеют обычный текстовый формат, и изучить их настройки проще, чем продираться сквозь множество опций настройки Sendmail.&lt;br /&gt;
&lt;br /&gt;
Какой бы сервер вы ни выбрали, вам следует настраивать его через Webmin, он предоставляет опции в дружественной графической оболочке и позволяет избежать ошибок конфигурирования сервера, приводящих к потере почты или снижению безопасности. При желании вы также сможете читать или подстраивать файлы настроек вручную – Webmin помогает изучать опции настройки, а не прячет их.&lt;br /&gt;
&lt;br /&gt;
Для любого выбранного сервера, файлы журналов (log-файлы) предоставят причину сбоя. Выполните&lt;br /&gt;
&lt;br /&gt;
 tail -f /path/to/logfile&lt;br /&gt;
&lt;br /&gt;
и попытайтесь отправить почту во внешний мир. Вы увидите сообщение об ошибке, соответствующее сбою: варианты – от сбоя DNS (хотя это маловероятно, т.к. Интернет вообще-то работает) до блокирования исходящего SMTP-трафика вашим провайдером. Многие провайдеры делают это в качестве противоспамной меры: или перенаправляют весь SMTP-трафик на собственный почтовый сервер, или блокируют вообще. Если это так, вам необходимо настроить ваш почтовый сервер на использование сервера вашего провайдера как ‘smarthost’, тогда вся почта не для вашей локальной сети будет отсылаться через тот сервер. Для этого в Sendmail поместите в Sendmail.cf следующее:&lt;br /&gt;
&lt;br /&gt;
 DSmail.isp.com&lt;br /&gt;
&lt;br /&gt;
заместив mail.isp.com SMTP-сервером провайдера. Для Postfix такая строка&lt;br /&gt;
&lt;br /&gt;
 relayhost = mail.isp.com&lt;br /&gt;
&lt;br /&gt;
Если вы используете Webmin, это первая опция в модуле Sendmail и четвертая в модуле Postfix. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Damn-ГРУБиян ===&lt;br /&gt;
:* На моем ПК много разделов, и установлено несколько дистрибутивов Linux, хочу поиграть с ними, прежде чем остановиться на одном. Мой загрузчик – XOSL, и со многими дистрибутивами он работает прекрасно, включая штуку из Редмонда! Но он серьезно слетел после дистрибутива Damn Small Linux с LXF80. Скрипт установки DSL на жесткий диск не предоставляет выбора места размещения загрузчика Lilo или Grub – он всегда пишет его прямо в главную загрузочную запись (MBR), туда же, где размещается XOSL! Поэтому, когда я восстанавливаю XOSL, он находит все остальные дистрибутивы, но не DSL. Или ПК загружается только в DSL. Они не работают вместе.&lt;br /&gt;
&lt;br /&gt;
:Не могли бы вы объяснить на уровне начинающего: как настроить загрузку (Lilo или Grub) на разделе, где установлен DSL, чтобы XOSL смог найти и запустить его? '''Джефф [Jeff]'''&lt;br /&gt;
&lt;br /&gt;
Установить Grub на раздел вместо MBR просто, и позор, что DSL не предоставляет такой возможности. Предположим для примера, что DSL установлен на /dev/hda5. Загрузитесь в DSL, откройте root-терминал и выполните Grub. Вы перенесетесь в командую оболочку Grub, где следует набрать&lt;br /&gt;
&lt;br /&gt;
 root (hd0,4)&lt;br /&gt;
 setup (hd0,4)&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
Grub начинает счет с нуля, поэтому первый диск, пятый раздел (hda5 в терминологии Linux) – это hd0,4. Теперь загрузчик DSL установлен в разделе, и вы можете велеть XOSL загружаться с этого раздела. Когда XOSL загрузит DSL, вы перенесетесь в меню Grub – возможно, и зря, поскольку вы уже выбрали, какую ОС загружать. Избавиться от этого можно, отредактировав /boot/Grub/menu.lst и изменив время ожидания с 15 на 0. Если вы хотите сохранить выбор опций DSL, представленных в меню Grub, измените время на меньшее, но ненулевое значение. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
=== Медленно и узко ===&lt;br /&gt;
:* Пытаюсь найти широкополосного провайдера с разумными ценами, имеющего дело с Linux. Поискал высокоскоростное телефонное соединение под Linux, но не достиг успеха. Поэтому я исследовал статистику загрузки под различными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
:Fedora Core 5 оказалась в самом низу с пиком в 1,8 КБ/с и средним около 0,7. Fedora 4 и SUSE достигли максимума 3 КБ/с при средней скорости загрузки 1,5 КБ/с. Knoppix 4 не многим лучше. В Xandros 3 получилось 4 КБ при среднем около 2 КБ. Лучше всех Mandriva 10.1 (использовались Mozilla и Epiphany), с пиком около 13 КБ/с и средним около 6 КБ/с.&lt;br /&gt;
&lt;br /&gt;
:Данные получены для различных соединений в различное время, но результаты вполне согласуются – они все работают плохо около 19:00 и 10:00 и все показали лучший результат в воскресенье утром. Я использую внешний COM-модем 56K. Есть идеи, как получить двузначную цифру скорости? '''Крис Марсден [Chris Marsden]'''&lt;br /&gt;
&lt;br /&gt;
:PS А также, идеи о сети из двух Linux-компьютеров с двумя разными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
В Великобритании есть два провайдера, специализирующихся на пользователях Linux: UKLinux.net и UK Free Software Network ([http://www.ukfsn.org www.ukfsn.org]). Оба предоставляют как ADSL, так и телефонное соединение. Ваши проблемы со скоростью действительно выглядят слегка странными, но сделать выводы трудно, поскольку вы сообщили очень мало информации – даже не указали марку модема.&lt;br /&gt;
&lt;br /&gt;
Было бы интересно сравнить настройки модема в каждом из дистрибутивов. Использование браузера для измерения скорости закачки – не самый надежный тест, на него влияет множество факторов, включая прокси-сервер провайдера. Лучшим тестом будет попытка загрузить файл через wget. Попробуйте в каждом дистрибутиве команду:&lt;br /&gt;
 &lt;br /&gt;
 wget ftp://ftp.mirrorservice.org/sites/ ftp.kde.org/pub/kde/stable/3.5.2/src/ kdeaddons-3.5.2.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Любой файл с FTP-сервера в Великобритании сойдет для теста. Вы не сможете получить двузначную цифру с 56К-модемом, если только не загружаете сжимаемые данные, например, группы новостей или web-страницы (но не картинки). Лучшее, на что вы можете рассчитывать со сжатыми данными вроде указанного выше файла или картинки – это около 7 КБ/с. Сжатые файлы дают истинную оценку качества связи.&lt;br /&gt;
&lt;br /&gt;
Указанные вами времена интересны; 19-00 – это пик использования Интернета в Великобритании (сами решайте, web или Emmerdale), тогда как утром в воскресенье отмечается спад. Стоит также попросить BT протестировать вашу линию. Даже если они скажут, что все в порядке, сам факт тестирования часто способствует улучшению.&lt;br /&gt;
&lt;br /&gt;
При использовании провайдера с поддержкой Linux вы вправе получить такую поддержку. Я бы предложил использовать телефонный доступ через UKFSN (это окупается) и попросить обоих провайдеров помочь со скоростью соединения. Кто окажется полезнее, того и делайте вашим широкополосным партнером.&lt;br /&gt;
&lt;br /&gt;
Что до вашего вопроса о соединении в сеть двух компьютеров с разными дистрибутивами, то это все равно, что два компьютера с одним и тем же вариантом Linux. Хотя инструменты настройки могут различаться, большинство дистрибутивов в принципе схожи. NFS, HTTP, Samba, практически все, что вы хотите использовать для организации сети, работает одинаково во всех дистрибутивах. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Вопрос-Победитель&lt;br /&gt;
|Содержание=&lt;br /&gt;
=== Эволюция для почты ===&lt;br /&gt;
:* Пытаюсь исправить проблемы с аутентификацией на моем почтовом сервере, и единственный обнаруженный способ – его настройка в Evolution. Есть ли другие пути, обходящиеся без создания записи в Evolution? '''Мэтью Саид [Matthew Saeed]'''&lt;br /&gt;
&lt;br /&gt;
Один из лучших способов протестировать множество различных сервисов, включая SMPTP SAUTH –использовать Telnet. Конечно, я не стал бы рекомендовать Telnet для обычного входа, но в качестве теста сервисов он неоценим. Для исправления вашей проблемы надо соединиться с почтовым сервером по порту 25 и зарегистрироваться, используя кодировку BASE64 (читайте об этом на [http://en.wikipedia.org/wiki/Base64 http://en.wikipedia.org/wiki/Base64]). Для начала расшифровка нескольких полезных строк, закодированных при помощи [www.dillfrog.com/tools/base-64_encode www.dillfrog.com/tools/base-64_encode]:&lt;br /&gt;
&lt;br /&gt;
*‘VXNlcm5hbWU6’ расшифровывается как ‘Username:’&lt;br /&gt;
*‘UGFzc3dvcmQ6’ расшифровывается как ‘Password:’&lt;br /&gt;
*‘dGVzdF9seGZAcmV6ZC5jby51a w==’ расшифровывается как ‘test_lxf@rezd.co.uk’&lt;br /&gt;
*‘Zm9vYmFy’ расшифровывается как ‘foobar’&lt;br /&gt;
&lt;br /&gt;
Следующие строки являются проверкой регистрации на сервере. Мы используем BASE64кодирование для нескольких строк описанных выше.&lt;br /&gt;
&lt;br /&gt;
Первое, соединимся при помощи Telnet к домену/IP адресу почтового сервера (т.е. mail.rezd.co.uk или 10.0.0.1) по порту 25:&lt;br /&gt;
&lt;br /&gt;
 telnet 10.0.0.1 25&lt;br /&gt;
&lt;br /&gt;
Сервер отвечает SMTP-приглашением (баннером):&lt;br /&gt;
&lt;br /&gt;
 Trying 10.0.0.1...&lt;br /&gt;
 Connected to mail.rezd.co.uk (10.0.0.1).&lt;br /&gt;
 Escape character is ‘^]’.&lt;br /&gt;
 220 mail.rezd.co.uk ESMTP&lt;br /&gt;
&lt;br /&gt;
Даем команду EHLO:&lt;br /&gt;
&lt;br /&gt;
 EHLO other.domain.rezd.org.uk&lt;br /&gt;
&lt;br /&gt;
Далее сервер сообщает, что именно он поддерживает (в этом почтовые сервера могут различаться).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
250-mail.rezd.co.uk Hello other. domain.rezd.&lt;br /&gt;
org.uk [192.168.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
LOGIN PLAIN&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на почтовом сервере:&lt;br /&gt;
&lt;br /&gt;
 AUTH LOGIN&lt;br /&gt;
&lt;br /&gt;
Он выдает запрос имени пользователя (username):&lt;br /&gt;
&lt;br /&gt;
 334 VXNlcm5hbWU6&lt;br /&gt;
&lt;br /&gt;
Теперь введем имя пользователя, под которым хотим зарегистрироваться, например, test_lxf@rezd.co.uk:&lt;br /&gt;
&lt;br /&gt;
 dGVzdF9seGZAcmV6ZC5jb20=&lt;br /&gt;
&lt;br /&gt;
Затем запрашивается пароль:&lt;br /&gt;
&lt;br /&gt;
 334 UGFzc3dvcmQ6&lt;br /&gt;
&lt;br /&gt;
Мы отвечаем:&lt;br /&gt;
&lt;br /&gt;
 Zm9vYmFy&lt;br /&gt;
&lt;br /&gt;
И, наконец, он говорит «да» (yes), то есть регистрация (authentication) работает:&lt;br /&gt;
&lt;br /&gt;
 235 2.0.0 OK Authenticated&lt;br /&gt;
&lt;br /&gt;
Если мы получаем следующее, то понимаем, что с регистрацией есть проблемы:&lt;br /&gt;
&lt;br /&gt;
 535 5.7.0 authentication failed&lt;br /&gt;
&lt;br /&gt;
Этого достаточно для тестирования регистрации; если мы хотим протестировать отправку писем, то мы должны продолжить SMTP-диалог. '''KK'''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Часто задаваемые вопросы о WPA&lt;br /&gt;
|Содержание=&lt;br /&gt;
* Что такое WPA?&lt;br /&gt;
*: WPA – потомок WEP с улучшенной безопасностью.&lt;br /&gt;
* Спасибо, конечно, но что это?&lt;br /&gt;
*: WPA (Wi-Fi Protected Access – Защищенный Wi-Fi доступ) – система обеспечения защиты передачи данных в беспроводных сетях.&lt;br /&gt;
* А оно мне нужно?&lt;br /&gt;
*: Почти наверняка – да. Беспроводные сети передают ваши данные на сотни метров во всех направлениях. Это означает, что кто угодно с ноутбуком и беспроводной картой может прочесть ваши данные так же легко, как при подсоединении к вашему сетевому хабу.&lt;br /&gt;
* Мой ноутбук даже не дотягивает до всех комнат моего дома, так что я в безопасности, разве нет?&lt;br /&gt;
*: Отнюдь! Хотя доступ вашего ноутбука ко внешним устройствам ограничен неким расстоянием, у другого оборудования это расстояние может быть куда больше. Добавив к вашей беспроводной карте антенну, вы охватите значительно большую площадь. Соответственно улучшенные системы могут перекрывать огромные области. Вам нечего бояться, если вы используете Wi-Fi только дома для выхода в сеть с вашего ноутбука, но если ваша фирма использует слабозащищенные (или не защищенные) беспроводные сети, то ваши конфиденциальные файлы могут читать прямо из машины на офисной парковке.&lt;br /&gt;
* Раз уж вы упомянули: что такое WEP?&lt;br /&gt;
*: WEP – Wired Equivalent Privacy (Эквивалент проводной безопасности), предыдущая попытка защитить беспроводные сети. WEP лучше, чем ничего, но взломать его нетрудно. Он может не допустить вашего соседа к вашему компьютеру, если тот случайно подсоединится к вашей точке доступа вместо своей (так я и узнал, что мой сосед использует небезопасную сеть), но не сможет остановить взломщика.&lt;br /&gt;
* Какое оборудование использует WPA?&lt;br /&gt;
*: Все новые беспроводные сетевые карты и точки доступа поддерживают как WPA, так и WEP. Если у вас старое устройство, может оказаться, что оно поддерживает только WEP.&lt;br /&gt;
* А как насчет программ?&lt;br /&gt;
*: Вам необходима двухуровневая поддержка WPA на уровне драйвера устройства (большинство драйверов ее уже имеют) и программа, реализующая WPA. Наиболее популярна wpa_supplicant, она должна поставляться с вашим дистрибутивом и доступна по адресу [http://hostap.epitest.fi/wpa_supplicant http://hostap.epitest.fi/wpa_supplicant]. Это программа, управляющая согласованием ключей и аутентификацией.&lt;br /&gt;
* Я полагаю, чтобы использовать WPA в Linux, я должен прочесть man-страницы и HOWTO, а также отредактировать файлы конфигурации?&lt;br /&gt;
*: Вы, конечно, можете сделать это, если ладите с Vim. Однако существуют графические инструменты настройки, облегчающие жизнь. Самый продвинутый из них – вероятно, NetworkManager из Gnome ([http://www.gnome.org/projects/NetworkManager www.gnome.org/projects/NetworkManager]). Он включен в последние дистрибутивы, например, Fedora Core 5 и SUSE 10.1. Пользователи KDE могут предпочесть KWlan ([http://www.kde-apps.org/content/show.php?content=37041 www.kde-apps.org/content/show.php?content=37041]) [или KNetworkManager: [http://en.opensuse.org/Projects/KNetworkManager http://en.opensuse.org/Projects/KNetworkManager], – прим. ред.].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Краткая справка: компиляция приложений&lt;br /&gt;
|Содержание=&lt;br /&gt;
Большинство дистрибутивов имеют большие репозитории программ, содержащие готовые пакеты практически на все случаи жизни, но иногда необходимо собрать пакет из исходных текстов. Обычная причина – отсутствие обновленного (или полное отсутствие) пакета для вашего дистрибутива, или необходимость исправить исходный код, добавив функцию или убрав ошибку. Поддержать систему в актуальном состоянии помогает менеджер пакетов вашего дистрибутива, но если вам необходимо собрать пакет из исходных текстов, то процесс милосердно прост.&lt;br /&gt;
&lt;br /&gt;
Во-первых, распакуйте архив с исходными текстами (tarball) одной из двух команд:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar xvzf foo-1.2.3.tar.gz&lt;br /&gt;
tar xvjf foo-1.2.3.tar.bz2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поздние версии tar могут определить чем был создан архив (gzip или bzip2), так что аргументы z или j можно опустить. Исходные тексты обычно распаковываются в папку с именем, совпадающим с названием архива; после выполнения команд введите cd foo-1.2.3. Найдите файлы с именами README или INSTALL и прочтите их – обычно там находится инструкция по установке. Стандартная процедура такова:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
su -c “make install”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая команда проверяет вашу систему, убеждаясь в соблюдении всех зависимостей и установке оптимальных параметров для программы. Неплохо сначала выполнить команду ./configure --help, чтобы увидеть имеющиеся опции.&lt;br /&gt;
&lt;br /&gt;
Вторая команда компилирует приложение, помещая созданные файлы в текущий каталог. Для конфигурирования и компиляции права root не нужны, но третья стадия – это копирование скомпилированных файлов в системные подкаталоги, а потому требует прав root. Вот почему мы используем su для выполнения только этой команды от имени root. Пользователи Ubuntu должны использовать вместо нее команду&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы не указывали для ./configure путь, то по умолчанию скомпилированная программа устанавливается в /usr/local/bin. Если вы работаете в RPM-системе, а configure сообщает, что не найдена библиотека, хотя вы точно знаете, что она есть – установите соответствующий библиотеке пакет -devel, т.е. libbar-devel.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:QA</id>
		<title>LXF83:QA</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:QA"/>
				<updated>2008-04-23T11:57:02Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: «LXF83:QA» переименована в «LXF83:Ответы»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[LXF83:Ответы]]&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF83:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF83:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-23T11:57:02Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: «LXF83:QA» переименована в «LXF83:Ответы»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вопрос? Ответ! ==&lt;br /&gt;
'' Если вы завязли в какой-то проблеме и чтение HOWTO не помогает, почему бы не написать нам? Наши эксперты помогут разобраться даже в самых сложных вопросах.''&lt;br /&gt;
&lt;br /&gt;
{{Врезка|left|&lt;br /&gt;
Заголовок = НАШИ ЭКСПЕРТЫ|&lt;br /&gt;
Содержание =&lt;br /&gt;
[[Изображение:img_83_106_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Владея Интернет-&lt;br /&gt;
провайдером, а&lt;br /&gt;
заодно подрабатывая&lt;br /&gt;
редактором дисков&lt;br /&gt;
для LXF, Нейл&lt;br /&gt;
Ботвик скромно&lt;br /&gt;
зовет себя мастером на все руки.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:img_83_106_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Для административных&lt;br /&gt;
вопросов: Кингс&lt;br /&gt;
Коблер является&lt;br /&gt;
системным&lt;br /&gt;
инженером и&lt;br /&gt;
администратором Linux в Rackspace,&lt;br /&gt;
и использует Linux 10 лет.&lt;br /&gt;
&lt;br /&gt;
Адрес для писем с вопросами:&lt;br /&gt;
email: lxf.answers@futurenet.co.uk.&lt;br /&gt;
E-mail: answers@linuxformat.ru.&lt;br /&gt;
Вопрос по администрированию? Оправьте его Кингсу – sysadminqa@rackspace.co.uk.&lt;br /&gt;
|&lt;br /&gt;
Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fedora без сети ===&lt;br /&gt;
Я установил Fedora Core 5, и все вроде прекрасно, кроме одного. Когда я пытаюсь выполнить Add/Remove Programs (Добавить/Удалить программы) или Packager Updater (Обновление пакетов), у меня запрашивается пароль root. Затем я получаю сообщение об ошибке: «Не могу получить информацию о приложении» или «Не могу получить информацию об обновлении». Единственным отступлением от стандартной установки является отказ от Logical Volume Manager; вместо этого я вручную разбил диск на /boot (100 MБ), / (38 ГБ) и swap (1024 МБ). Да еще мой ПК не подключен к Интернету. Я пытался установить и с CD, и с вашего DVD приложения. Но получаю те же ошибки.&lt;br /&gt;
&lt;br /&gt;
Альфред Мифсуд [Alfred Mifsud]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Отсутствие Интернет-соединения и есть причина этих сообщений. Обе программы при работе пытаются прочитать информацию из online-репозитория программ. В случае Software Updater это неизбежно: по самой своей природе обновления новее пакетов на установочных носителях, так что без соединения с Интернетом не обойтись.&lt;br /&gt;
&lt;br /&gt;
Во избежание этой ошибки с Add/Remove Programs, вам нужно отредактировать файлы репозитория: отключить все online-источники и добавить DVD. Делается это из-под root. Загрузите /etc/yum.repos.d/fedora-core.repo в ваш любимый текстовый редактор, найдите начало раздела [core] и закомментируйте строки baseurl и mirrorlist, поместив в начало каждой строки #. Затем добавьте новую строку вида&lt;br /&gt;
 baseurl=file:///media/disk&lt;br /&gt;
&lt;br /&gt;
Создастся новый репозиторий на /media/disk, где смонтирован DVD. Затем вам следует отредактировать другие .repo-файлы и изменить все вхождения enabled=1 на enabled=0. Теперь единственный активный репозиторий – это DVD, и запуск Add/Remove Software должен позволить вам установить приложения с диска. НБ&lt;br /&gt;
&lt;br /&gt;
=== Черепашья почта ===&lt;br /&gt;
Мой почтовый сервер на основе Qmail отправляет почту с большой задержкой. Я пытался ускорять его, но ничего не вышло. Не могли бы вы перечислить, что может вызывать задержку?&lt;br /&gt;
&lt;br /&gt;
Т.Мэтьюс [T Matthews]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наиболее вероятная причина задержек – запросы DNS. Первое и главное, убедитесь, что имя сервера нормально разрешается. Кроме того, для IP-адреса, используемого сервером для отправки почты, должна быть создана PTR-запись. Вы также можете ускорить запросы, запустив собственный локальный кэширующий сервер имен.&lt;br /&gt;
&lt;br /&gt;
Также можно отключить DNS-запросы вообще. Если вы запускаете qmail-smtpd через tcpserver, то добавьте в его опции флаг -H, чтобы он не искал имена хостов в DNS, и удалите переменную среды $TCPREMOTEHOST. Во избежание зацикливания вы должны использовать эту опцию для серверов по TCP-порту 53. Если это не так, то вы, вероятно, запускаете его через inetd/xinetd; и можете добавить в конфигурацию флаг -Rt0, в пункте server_args конфигурационного файла вашего inetd/xinetd. Это запретит Qmail выполнять запросы ident при установлении SMTP-соединения. Проделанные действия проявляют себя в задержке между установлением TCP-соединения и появлением приглашения.&lt;br /&gt;
&lt;br /&gt;
А если ваша очередь постоянно переполняется, можете добавить файл '''/var/qmail/control/queuelifetime''' и установить в нем срок менее семи дней (срок по умолчанию, означающий, что попытки отправки всех поступающих писем будут повторяться в течение недели). Одного или двух дней вполне хватит. Эти шаги должны снизить время, необходимое Qmail для отображения приглашения. KK&lt;br /&gt;
&lt;br /&gt;
=== Реаниматор ===&lt;br /&gt;
Мой друг владеет маленькой юридической фирмой (шесть пользователей, использующих Windows XP Pro, Linux proxy/mail сервер). Они часто портят компьютеры, и он зовет меня чинить их. Обычно это означает резервирование всех документов, сохраненных где попало, и переустановку Windows.&lt;br /&gt;
&lt;br /&gt;
Поэтому я пытаюсь найти и установить полностью автоматизированную систему на базе Linux для восстановления после сбоев, которая бы производила резервирование после каждой установки (типа Ghost или G4L) и еженощно резервировала бы каждую рабочую станцию, чтобы, если кто-то навредил, нужно было только загрузиться с другого компьютера в сети или с CD и восстановить систему из образов с backup-сервера.&lt;br /&gt;
&lt;br /&gt;
Кристос Иоанну [Christos Ioannou]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Здесь две отдельных проблемы. Первая – это создание резервной копии на CD или в сети, чтобы полностью переустановить систему в серьезном случае. Вторая – регулярное резервирование данных.&lt;br /&gt;
&lt;br /&gt;
Вы не ошибетесь, если для первого пути выберите Partition Image – www.partimage.org. Это Linux-программа, имеющая клиент-серверные функции. Вы можете запустить сервер на вашем Linux-компьютере и использовать Live CD для создания образов дисков каждой Windows-машины. Вам понадобится Live-CD дистрибутив, который можно будет использовать для восстановления диска из файл-образа на сервере. RIP (Recovery Is Possible [«восстановление возможно»; также Rest In Peace – покойся с миром – надпись на надгробье; см. стр. 48 – прим. ред.]) вполне подойдет (www.tux.org/pub/people/kent-robotti/looplinux/rip). Документация содержит детальные инструкции изменения CD-образа под ваши нужды; вы можете добавить небольшой скрипт командной оболочки и вызвать его из /etc/rc.d/rc.local, чтобы автоматизировать полное восстановление системы при загрузке с CD.&lt;br /&gt;
&lt;br /&gt;
Для ночного инкрементного резервирования хорошим выбором будет BackupPC (http://backuppc.sourceforge.net). Она запускается на Linux сервере и не требует специального ПО, установленного на Windows ПК, т.к. доступ к нему осуществляет Samba. Нужно только настроить на ПК совместное использование, чтобы BackupPC смог заполучить файлы. Вся работа выполняется на Linux-машине, так что ночным резервированием сможет управлять простое задание Cron. BackupPC обладает web-интерфейсом, и пользователям не придется учить загадочные команды для восстановления файлов из резервной копии.&lt;br /&gt;
&lt;br /&gt;
Эта программа особенно хороша при резервировании некоторого числа схожих ПК, поскольку хранит одну копию файла, находящегося на нескольких компьютерах. Вместе со сжатием это значительно уменьшает требуемое пространство для резервирования узлов сети. НБ&lt;br /&gt;
&lt;br /&gt;
=== Захват экрана ===&lt;br /&gt;
Ищу приложение, которое бы записывало все, что я делаю на машине, в небольшой фильм. Можете ли вы что-то порекомендовать?&lt;br /&gt;
&lt;br /&gt;
Мак-Скрафф [McScruff], с форума&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для этого существует множество решений, в зависимости от предназначения фильма. Если вы хотите опубликовать его в Интернете, лучшим выбором будет Vnc2swf. Она записывает VNC-сессию как Flash-анимацию. Вам нужно будет установить VNC (или Tightvnc с www.tightvnc.com). VNC создан для удаленного рабочего стола, но вы также можете использовать его на одном компьютере. Запустите VNC-сессию&lt;br /&gt;
 vncserver -depth 16 -geometry 800x600&lt;br /&gt;
и увидите строку вида:&lt;br /&gt;
 New ‘X’ desktop is yourhostname:N&lt;br /&gt;
&lt;br /&gt;
Последняя часть – имя хоста (yourhostname) и номер дисплея. Если ваш компьютер не подключен к сети, можете использовать localhost. Теперь начните сессию командой&lt;br /&gt;
 vnc2swf -startrecording -geometry 800x600 -depth 16 -framerate 5 demo.swf yourhostname:N.0&lt;br /&gt;
&lt;br /&gt;
Убедитесь, что разрешение (geometry), глубина цвета (depth), имя хоста (yourhostname) и дисплей соответствуют только что запущенному вами VNC-серверу. '''.0''' в конце обязателен. Появится новое окно, содержащее рабочий стол VNC-сессии, и все, что вы будете делать в нем, запишется в demo.swf. Завершите запись, закрыв это окно. Программа выведет некоторый HTML-код для просмотра Flash-анимации в web-браузере, который вы при желании можете перенаправить в файл. Размер и количество кадров определяется web-браузером, но для вывода демонстрации локально на монитор или проектор вы можете захотеть увеличить и то и другое.&lt;br /&gt;
&lt;br /&gt;
Для генерации фильма можете использовать Vncrec. Работает она по той же схеме, что и Vnc2swf, но создает файл в своем собственном формате, который вы может перекодировать в AVI или MPEG при помощи transcode.&lt;br /&gt;
 vncrec -record demo.vnc&lt;br /&gt;
 transcode -x vnc --use_rgb -y xvid - k --dvd_access_delay 5 -f 10 -i demo.vnc -o demo.avi&lt;br /&gt;
&lt;br /&gt;
Используемое разрешение опять-таки должно совпадать с разрешением, в котором запущен сервер. Ключ -f устанавливает количество кадров в секунду для видео. Получившийся файл может быть просмотрен в любом видеопроигрывателе, например, MPlayer или Xine.&lt;br /&gt;
&lt;br /&gt;
Какое бы записывающее приложение вы ни выбрали, если вы хотите, чтобы в начале записи запускалась некоторая программа, то пропишите ее в ~/.vnc/xstartup:&lt;br /&gt;
 ooimpress sample.pps&lt;br /&gt;
&lt;br /&gt;
Другая возможность – Istanbul с http://live.gnome.org/Istanbul. Это программа для Gnome, но работает и на других рабочих столах. Она помещает иконку на панели: нажмите ее для начала записи, а повторное нажатие остановит запись. Результат сохраняется под именем ~/desktop-recording.ogg, в формате Theora. Она может показаться примитивной по сравнению с альтернативами, но настраивается быстро и легко. НБ&lt;br /&gt;
&lt;br /&gt;
=== Лишенец прав! ===&lt;br /&gt;
Я недавно перешел с Xandros на Fedora Core 5. Я перекачал 3 ГБ данных и обнаружил, что все файлы в моем домашнем каталоге имеют владельца и принадлежат к группе root. Есть ли скрипт, который поможет мне изменить права доступа на мое имя пользователя?&lt;br /&gt;
&lt;br /&gt;
Д.Ригли [D Wrigley]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если вы скопировали свой домашний каталог (к примеру, /home/dave) с одной машины на другую, наилегчайший способ восстановить владельца в этом каталоге – рекурсивно выполнить chown от имени root в /home/dave с корректными именем и группой владельца. Это можно безопасно сделать в вашем домашнем каталоге, поскольку он обычно содержит только файлы и каталоги, принадлежащие пользователю и группе пользователя, к которому относится этот каталог.&lt;br /&gt;
 chown -R macdaddy:macdaddy /home/macdaddy&lt;br /&gt;
&lt;br /&gt;
Если у вас много файлов и каталогов, принадлежащих другим пользователям и группам, необходимо выполнить поиск с заменой. Так что если пользователь ‘dave’ имеет множество файлов и каталогов в '''/var/www/html''' и вы хотите сменить владельца этих файлов на пользователя и группу ‘bigmac’, следует применить chown -R для смены владельца каталогов. Беда в том, что заодно поменяют владельца и те файлы, которые вам трогать не хотелось. Чтобы каталоги, не принадлежащие Dave, остались без изменений, для поиска и смены владельца используйте команду find,:&lt;br /&gt;
 find /var/www/html -user dave -group dave -exec chown bigmac:bigmac {} \;&lt;br /&gt;
&lt;br /&gt;
Эта команда найдет любой каталог или файл в /var/www/html, принадлежащий пользователю и группе dave, а затем сменит владельца на bigmac. {} указано для замены найденных файлов, соответствующих критериям -user и -group, а \; необходимо во избежание интерпретации ; командной оболочкой, и чтобы сообщить find, что список параметров закончился.&lt;br /&gt;
&lt;br /&gt;
Итак, для стандартных домашних каталогов наилегчайший способ сменить владельца единовременно – использовать команду chown -R. Помните, что этот метод применим не во всех частях файловой системы! KK&lt;br /&gt;
&lt;br /&gt;
=== Пропал Thunderbird ===&lt;br /&gt;
Щелкая на email-адресе в KDE, я получаю ошибку: ‘Kdeinit can not start /usr/share/application/Thunderbird/Thunderbird’. Thunderbird установлен в /opt/Thunderbird. Был у меня SUSE, но в сейчас я использую Gentoo, и когда я переносил каталог /home, вероятно, что-то затер в Kdeinit, но не могу понять что. Не могли бы вы сказать мне, как сделать, чтобы Kdeinit искал в нужном месте?&lt;br /&gt;
&lt;br /&gt;
Стюарт [Stewart]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Похоже, что KDE не там ищет Thunderbird. Как и большинство опций KDE, вы можете изменить это в Центре управления KDE; хотя найти нужное место в Центре Управления трудно – там столько всего, и не всегда там, где вы ожидаете увидеть. Центр Управления содержит функцию поиска, которая обычно помогает, но не в этом случае (по крайней мере не в KDE 3.5.3). Нужная вам опция находится в Компоненты &amp;gt; Выбор Компонентов &amp;gt; Email-клиент. Выберите радиокнопку Использовать другой Email-клиент, затем щелкните на маленькой иконке справа от строки ввода чтобы открыть окно выбора приложения. Выбрав программу таким образом, вы установите верный путь.&lt;br /&gt;
&lt;br /&gt;
Thunderbird откроется, но без адреса получателя или любой другой информации. Чтобы исправить это, добавьте следующее в строку запуска Thunderbird:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-compose “mailto:%t?subject=%s&amp;amp; body=%B”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Задержите курсор мыши над строкой ввода, чтобы увидеть доступные опции. НБ&lt;br /&gt;
&lt;br /&gt;
=== Спутанные карты ===&lt;br /&gt;
Только что установил Fedora Core 5, и слегка в недоумении: какая из моих сетевых карт работает. У меня их две, и при предыдущих установках по умолчанию использовалась eth0. Вот результат выполнения ifconfig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0 Link encap:Ethernet HWaddr 00:30:18:58:4A:A3&lt;br /&gt;
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
UP BROADCAST MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
eth1 Link encap:Ethernet HWaddr 00:50:BA:B3:B1:A5&lt;br /&gt;
inet addr:192.168.1.152 Bcast:192.168.1.255 Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::250:baff:feb3: b1a5/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:258479 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:264885 errors:0 dropped:0 overruns:13 carrier:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Мне кажется, что при работе в сети весь трафик идет через eth1. Можете ли вы пролить свет на это?&lt;br /&gt;
&lt;br /&gt;
pk_fox&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вы используете DHCP на обеих сетевых картах? Если да, то вот что скорее всего происходит:&lt;br /&gt;
# Обнаруживается первая сетевая карта (NIC) и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
# Определяется вторая NIC и загружается модуль.&lt;br /&gt;
# Поднимается её интерфейс и используется DHCP для назначения IP адреса, а также настройки DNS и маршрутизации.&lt;br /&gt;
&lt;br /&gt;
Четвертый шаг переписывает шлюз по умолчанию в таблице маршрутизации, забивая установки, сделанные на втором шаге. Вы можете проверить это, выполнив&lt;br /&gt;
 route -n&lt;br /&gt;
Строка, показывающая расположение 0.0.0.0, завершается интерфейсом, используемым по умолчанию. Есть ли причина, по которой вы используете две NIC? Если да, то вам, видимо, придется настроить шлюз по умолчанию вручную. Или же отключите опцию activate device when computer starts для одной из NIC в программе настройки сети. НБ&lt;br /&gt;
&lt;br /&gt;
=== Сам себе браузер? ===&lt;br /&gt;
Я управляю сервисом хостинга, на нем более 100 доменов. Последние несколько дней стало казаться, что наш сервер тормозит. Я выполнил несколько предварительных тестов (используя netstat) и обнаружил множество соединений с моего сервера по TCP-порту 80 к моему серверу по временным портам. Из полученных результатов я понял, что имеются соединения от Apache по порту 80 к другим портам моего сервера. Но почему? Как мой сервер может просматривать мои собственные web-сайты? Используется Apache 2 под Red Hat Enterprise Linux 3.&lt;br /&gt;
&lt;br /&gt;
Джон [John]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Весьма похоже, что это поведение спровоцировал один из ваших новых web-сайтов. Из описанного вами отчета netstat я делаю вывод, что некий код вызывает соединения с вашим сервером. Проанализировав деятельность сервера Apache, мы можем сравнить число netstat-соединений с обслуживаемыми Apache. Для этого поместим следующее в конфи-&lt;br /&gt;
гурационный файл Apache (/etc/httpd/conf/httpd.conf):&lt;br /&gt;
 ExtendedStatus on&lt;br /&gt;
 &amp;lt;Location /server-status&amp;gt;&lt;br /&gt;
  SetHandler server-status&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы откроете страницу www.domain.com/server-status?refresh=5, то статус вашего сервера будет обновляться раз в пять секунд. Уделите особое внимание загруженности процессора и числу секунд с начала нового запроса (SS). Также, сравнивая число соединений выдаваемых netstat с числом соединений на отдельном виртуальном хосте, вы быстро найдете виновника! KK&lt;br /&gt;
&lt;br /&gt;
=== Саботаж Sendmail ===&lt;br /&gt;
Я создаю сервер для размещения управляющего ПО нашей лаборатории (я написал его на PHP, благодаря урокам в LXF!). Установил сервер Kubuntu с Sendmail – и начались проблемы.&lt;br /&gt;
&lt;br /&gt;
Я выполнил простую настройку Sendmail, оставив все как есть, поскольку почти ничего не понимаю в настройке Sendmail! Он отправляет почту людям в локальной сети (например, john@localnet.co.uk), но во внешний мир ничего не исходит (например, на john@hotmail.com). Был бы очень благодарен за совет – а может, и за учебник по установке почтового сервера?&lt;br /&gt;
&lt;br /&gt;
Джон Клейтон [John Clayton]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sendmail – не лучший выбор для вас. Это несомненно мощный почтовый сервер, но, увы, трудно настраиваемый. Postfix или Exim больше подойдут вам, они оба доступны через репозиторий Ubuntu (Postfix – стандартный почтовый сервер и находится на установочных дисках Ubuntu). Эти сервера отлично документированы, файлы настроек имеют обычный текстовый формат, и изучить их настройки проще, чем продираться сквозь множество опций настройки Sendmail.&lt;br /&gt;
&lt;br /&gt;
Какой бы сервер вы ни выбрали, вам следует настраивать его через Webmin, он предоставляет опции в дружественной графической оболочке и позволяет избежать ошибок конфигурирования сервера, приводящих к потере почты или снижению безопасности. При желании вы также сможете читать или подстраивать файлы настроек вручную – Webmin помогает изучать опции настройки, а не прячет их.&lt;br /&gt;
&lt;br /&gt;
Для любого выбранного сервера, файлы журналов (log-файлы) предоставят причину сбоя. Выполните&lt;br /&gt;
 tail -f /path/to/logfile&lt;br /&gt;
&lt;br /&gt;
и попытайтесь отправить почту во внешний мир. Вы увидите сообщение об ошибке, соответствующее сбою: варианты – от сбоя DNS (хотя это маловероятно, т.к. Интернет вообще-то работает) до блокирования исходящего SMTP-трафика вашим провайдером. Многие провайдеры делают это в качестве противоспамной меры: или перенаправляют весь SMTP-трафик на собственный почтовый сервер, или блокируют вообще. Если это так, вам необходимо настроить ваш почтовый сервер на использование сервера вашего провайдера как ‘smarthost’, тогда вся почта не для вашей локальной сети будет отсылаться через тот сервер. Для этого в Sendmail поместите в Sendmail.cf следующее:&lt;br /&gt;
 DSmail.isp.com&lt;br /&gt;
заместив mail.isp.com SMTP-сервером провайдера. Для Postfix такая строка&lt;br /&gt;
 relayhost = mail.isp.com&lt;br /&gt;
&lt;br /&gt;
Если вы используете Webmin, это первая опция в модуле Sendmail и четвертая в модуле Postfix. НБ&lt;br /&gt;
&lt;br /&gt;
=== Damn-ГРУБиян ===&lt;br /&gt;
На моем ПК много разделов, и установлено несколько дистрибутивов Linux, хочу поиграть с ними, прежде чем остановиться на одном. Мой загрузчик – XOSL, и со многими дистрибутивами он работает прекрасно, включая штуку из Редмонда! Но он серьезно слетел после дистрибутива Damn Small Linux с LXF80. Скрипт установки DSL на жесткий диск не предоставляет выбора места размещения загрузчика Lilo или Grub – он всегда пишет его прямо в главную загрузочную запись (MBR), туда же, где размещается XOSL! Поэтому, когда я восстанавливаю XOSL, он находит все остальные дистрибутивы, но не DSL. Или ПК загружается только в DSL. Они не работают вместе.&lt;br /&gt;
&lt;br /&gt;
Не могли бы вы объяснить на уровне начинающего: как настроить загрузку (Lilo или Grub) на разделе, где установлен DSL, чтобы XOSL смог найти и запустить его?&lt;br /&gt;
&lt;br /&gt;
Джефф [Jeff]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Установить Grub на раздел вместо MBR просто, и позор, что DSL не предоставляет такой возможности. Предположим для примера, что DSL установлен на /dev/hda5. Загрузитесь в DSL, откройте root-терминал и выполните Grub. Вы перенесетесь в командую оболочку Grub, где следует набрать&lt;br /&gt;
 root (hd0,4)&lt;br /&gt;
 setup (hd0,4)&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
Grub начинает счет с нуля, поэтому первый диск, пятый раздел (hda5 в терминологии Linux) – это hd0,4. Теперь загрузчик DSL установлен в разделе, и вы можете велеть XOSL загружаться с этого раздела. Когда XOSL загрузит DSL, вы перенесетесь в меню Grub – возможно, и зря, поскольку вы уже выбрали, какую ОС загружать. Избавиться от этого можно, отредактировав /boot/Grub/menu.lst и изменив время ожидания с 15 на 0. Если вы хотите сохранить выбор опций DSL, представленных в меню Grub, измените время на меньшее, но ненулевое значение. НБ&lt;br /&gt;
&lt;br /&gt;
=== Медленно и узко ===&lt;br /&gt;
'''Вопрос:''' Пытаюсь найти широкополосного провайдера с разумными ценами, имеющего дело с Linux. Поискал высокоскоростное телефонное соединение под Linux, но не достиг успеха. Поэтому я исследовал статистику загрузки под различными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
Fedora Core 5 оказалась в самом низу с пиком в 1,8 КБ/с и средним около 0,7. Fedora 4 и SUSE достигли максимума 3 КБ/с при средней скорости загрузки 1,5 КБ/с. Knoppix 4 не многим лучше. В Xandros 3 получилось 4 КБ при среднем около 2 КБ. Лучше всех Mandriva 10.1 (использовались Mozilla и Epiphany), с пиком около 13 КБ/с и средним около 6 КБ/с.&lt;br /&gt;
&lt;br /&gt;
Данные получены для различных соединений в различное время, но результаты вполне согласуются – они все работают плохо около 19:00 и 10:00 и все показали лучший результат в воскресенье утром. Я использую внешний COM-модем 56K. Есть идеи, как получить двузначную цифру скорости?&lt;br /&gt;
&lt;br /&gt;
Крис Марсден [Chris Marsden]&lt;br /&gt;
&lt;br /&gt;
PS А также, идеи о сети из двух Linux-компьютеров с двумя разными дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ответ:''' В Великобритании есть два провайдера, специализирующихся на пользователях Linux: UKLinux.net и UK Free Software Network (www.ukfsn.org). Оба предоставляют как ADSL, так и телефонное соединение. Ваши проблемы со скоростью действительно выглядят слегка странными, но сделать выводы трудно, поскольку вы сообщили очень мало информации – даже не указали марку модема.&lt;br /&gt;
&lt;br /&gt;
Было бы интересно сравнить настройки модема в каждом из дистрибутивов. Использование браузера для измерения скорости закачки – не самый надежный тест, на него влияет множество факторов, включая прокси-сервер провайдера. Лучшим тестом будет попытка загрузить файл через wget. Попробуйте в каждом дистрибутиве команду:&lt;br /&gt;
 wget ftp://ftp.mirrorservice.org/sites/ ftp.kde.org/pub/kde/stable/3.5.2/src/ kdeaddons-3.5.2.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Любой файл с FTP-сервера в Великобритании сойдет для теста. Вы не сможете получить двузначную цифру с 56К-модемом, если только не загружаете сжимаемые данные, например, группы новостей или web-страницы (но не картинки). Лучшее, на что вы можете рассчитывать со сжатыми данными вроде указанного выше файла или картинки – это около 7 КБ/с. Сжатые файлы дают истинную оценку качества связи.&lt;br /&gt;
&lt;br /&gt;
Указанные вами времена интересны; 19-00 – это пик использования Интернета в Великобритании (сами решайте, web или Emmerdale), тогда как утром в воскресенье отмечается спад. Стоит также попросить BT протестировать вашу линию. Даже если они скажут, что все в порядке, сам факт тестирования часто способствует улучшению.&lt;br /&gt;
&lt;br /&gt;
При использовании провайдера с поддержкой Linux вы вправе получить такую поддержку. Я бы предложил использовать телефонный доступ через UKFSN (это окупается) и попросить обоих провайдеров помочь со скоростью соединения. Кто окажется полезнее, того и делайте вашим широкополосным партнером.&lt;br /&gt;
&lt;br /&gt;
Что до вашего вопроса о соединении в сеть двух компьютеров с разными дистрибутивами, то это все равно, что два компьютера с одним и тем же вариантом Linux. Хотя инструменты настройки могут различаться, большинство дистрибутивов в принципе схожи. NFS, HTTP, Samba, практически все, что вы хотите использовать для организации сети, работает одинаково во всех дистрибутивах. '''НБ'''&lt;br /&gt;
&lt;br /&gt;
== Вопрос-Победитель ==&lt;br /&gt;
''Счастливчик и победитель этого номера по мнению английской редакции – Мэтью.''&lt;br /&gt;
=== Эволюция для почты ===&lt;br /&gt;
''Пытаюсь исправить проблемы с аутентификацией на моем почтовом сервере, и единственный обнаруженный способ – его настройка в Evolution. Есть ли другие пути, обходящиеся без создания записи в Evolution?'' '''Мэтью Саид [Matthew Saeed]'''&lt;br /&gt;
&lt;br /&gt;
Один из лучших способов протестировать множество различных сервисов, включая SMPTP SAUTH –использовать Telnet. Конечно, я не стал бы рекомендовать Telnet для обычного входа, но в качестве теста сервисов он неоценим. Для исправления вашей проблемы надо соединиться с почтовым сервером по порту 25 и зарегистрироваться, используя кодировку BASE64 (читайте об этом на http://en.wikipedia.org/wiki/Base64). Для начала расшифровка нескольких полезных строк, закодированных при помощи www.dillfrog.com/tools/base-64_encode:&lt;br /&gt;
&lt;br /&gt;
*‘VXNlcm5hbWU6’ расшифровывается как ‘Username:’&lt;br /&gt;
*‘UGFzc3dvcmQ6’ расшифровывается как ‘Password:’&lt;br /&gt;
*‘dGVzdF9seGZAcmV6ZC5jby51a w==’ расшифровывается как ‘test_lxf@rezd.co.uk’&lt;br /&gt;
*‘Zm9vYmFy’ расшифровывается как ‘foobar’&lt;br /&gt;
&lt;br /&gt;
Следующие строки являются проверкой регистрации на сервере. Мы используем BASE64кодирование для нескольких строк описанных выше.&lt;br /&gt;
&lt;br /&gt;
Первое, соединимся при помощи Telnet к домену/IP адресу почтового сервера (т.е. mail.rezd.co.uk или 10.0.0.1) по порту 25:&lt;br /&gt;
 telnet 10.0.0.1 25&lt;br /&gt;
&lt;br /&gt;
Сервер отвечает SMTP-приглашением (баннером):&lt;br /&gt;
 Trying 10.0.0.1...&lt;br /&gt;
 Connected to mail.rezd.co.uk (10.0.0.1).&lt;br /&gt;
 Escape character is ‘^]’.&lt;br /&gt;
 220 mail.rezd.co.uk ESMTP&lt;br /&gt;
&lt;br /&gt;
Даем команду EHLO:&lt;br /&gt;
 EHLO other.domain.rezd.org.uk&lt;br /&gt;
&lt;br /&gt;
Далее сервер сообщает, что именно он поддерживает (в этом почтовые сервера могут различаться).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
250-mail.rezd.co.uk Hello other. domain.rezd.&lt;br /&gt;
org.uk [192.168.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
LOGIN PLAIN&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Регистрируемся на почтовом сервере:&lt;br /&gt;
 AUTH LOGIN&lt;br /&gt;
&lt;br /&gt;
Он выдает запрос имени пользователя (username):&lt;br /&gt;
 334 VXNlcm5hbWU6&lt;br /&gt;
&lt;br /&gt;
Теперь введем имя пользователя, под которым хотим зарегистрироваться, например, test_lxf@rezd.co.uk:&lt;br /&gt;
 dGVzdF9seGZAcmV6ZC5jb20=&lt;br /&gt;
&lt;br /&gt;
Затем запрашивается пароль:&lt;br /&gt;
 334 UGFzc3dvcmQ6&lt;br /&gt;
&lt;br /&gt;
Мы отвечаем:&lt;br /&gt;
 Zm9vYmFy&lt;br /&gt;
&lt;br /&gt;
И, наконец, он говорит «да» (yes), то есть регистрация (authentication) работает:&lt;br /&gt;
 235 2.0.0 OK Authenticated&lt;br /&gt;
&lt;br /&gt;
Если мы получаем следующее, то понимаем, что с регистрацией есть проблемы:&lt;br /&gt;
 535 5.7.0 authentication failed&lt;br /&gt;
&lt;br /&gt;
Этого достаточно для тестирования регистрации; если мы хотим протестировать отправку писем, то мы должны продолжить SMTP-диалог. KK&lt;br /&gt;
&lt;br /&gt;
== ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ О WPA ==&lt;br /&gt;
'''Что такое WPA?'''&lt;br /&gt;
&lt;br /&gt;
WPA – потомок WEP с улучшенной безопасностью.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Спасибо, конечно, но что это?'''&lt;br /&gt;
&lt;br /&gt;
WPA (Wi-Fi Protected Access – Защищенный Wi-Fi доступ) – система обеспечения защиты передачи данных в беспроводных сетях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''А оно мне нужно?'''&lt;br /&gt;
&lt;br /&gt;
Почти наверняка – да. Беспроводные сети передают ваши данные на сотни метров во всех направлениях. Это означает, что кто угодно с ноутбуком и беспроводной картой может прочесть ваши данные так же легко, как при подсоединении к вашему сетевому хабу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Мой ноутбук даже не дотягивает до всех комнат моего дома, так что я в безопасности, разве нет?'''&lt;br /&gt;
&lt;br /&gt;
Отнюдь! Хотя доступ вашего ноутбука ко внешним устройствам ограничен неким расстоянием, у другого оборудования это расстояние может быть куда больше. Добавив к вашей беспроводной карте антенну, вы охватите значительно большую площадь. Соответственно улучшенные системы могут перекрывать огромные области. Вам нечего бояться, если вы используете Wi-Fi только дома для выхода в сеть с вашего ноутбука, но если ваша фирма использует слабозащищенные (или не защищенные) беспроводные сети, то ваши конфиденциальные файлы могут читать прямо из машины на офисной парковке.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Раз уж вы упомянули: что такое WEP?'''&lt;br /&gt;
&lt;br /&gt;
WEP – Wired Equivalent Privacy (Эквивалент проводной безопасности), предыдущая попытка защитить беспроводные сети. WEP лучше, чем ничего, но взломать его нетрудно. Он может не допустить вашего соседа к вашему компьютеру, если тот случайно подсоединится к вашей точке доступа вместо своей (так я и узнал, что мой сосед использует небезопасную сеть), но не сможет остановить взломщика.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Какое оборудование использует WPA?'''&lt;br /&gt;
&lt;br /&gt;
Все новые беспроводные сетевые карты и точки доступа поддерживают как WPA, так и WEP. Если у вас старое устройство, может оказаться, что оно поддерживает только WEP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''А как насчет программ?'''&lt;br /&gt;
&lt;br /&gt;
Вам необходима двухуровневая поддержка WPA на уровне драйвера устройства (большинство драйверов ее уже имеют) и программа, реализующая WPA. Наиболее популярна wpa_supplicant, она должна поставляться с вашим дистрибутивом и доступна по адресу http://hostap.epitest.fi/wpa_supplicant. Это программа, управляющая согласованием ключей и аутентификацией.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Я полагаю, чтобы использовать WPA в Linux, я должен прочесть man-страницы и HOWTO, а также отредактировать файлы конфигурации?'''&lt;br /&gt;
&lt;br /&gt;
Вы, конечно, можете сделать это, если ладите с Vim. Однако существуют графические инструменты настройки, облегчающие жизнь. Самый продвинутый из них – вероятно, NetworkManager из Gnome (www.gnome.org/projects/NetworkManager). Он включен в последние дистрибутивы, например, Fedora Core 5 и SUSE 10.1. Пользователи KDE могут предпочесть KWlan (www.kde-apps.org/content/show.php?content=37041) [или KNetworkManager: http://en.opensuse.org/Projects/KNetworkManager, – прим. ред.].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''КРАТКАЯ СПРАВКА: КОМПИЛЯЦИЯ ПРИЛОЖЕНИЙ'''&lt;br /&gt;
&lt;br /&gt;
Большинство дистрибутивов имеют большие репозитории программ, содержащие готовые пакеты практически на все случаи жизни, но иногда необходимо собрать пакет из исходных текстов. Обычная причина – отсутствие обновленного (или полное отсутствие) пакета для вашего дистрибутива, или необходимость исправить исходный код, добавив функцию или убрав ошибку. Поддержать систему в актуальном состоянии помогает менеджер пакетов вашего дистрибутива, но если вам необходимо собрать пакет из исходных текстов, то процесс милосердно прост.&lt;br /&gt;
&lt;br /&gt;
Во-первых, распакуйте архив с исходными текстами (tarball) одной из двух команд:&lt;br /&gt;
 tar xvzf foo-1.2.3.tar.gz&lt;br /&gt;
 tar xvjf foo-1.2.3.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Поздние версии tar могут определить чем был создан архив (gzip или bzip2), так что аргументы z или j можно опустить. Исходные тексты обычно распаковываются в папку с именем, совпадающим с названием архива; после выполнения команд введите cd foo-1.2.3. Найдите файлы с именами README или INSTALL и прочтите их – обычно там находится инструкция по установке. Стандартная процедура такова:&lt;br /&gt;
 ./configure&lt;br /&gt;
 make&lt;br /&gt;
 su -c “make install”&lt;br /&gt;
&lt;br /&gt;
Первая команда проверяет вашу систему, убеждаясь в соблюдении всех зависимостей и установке оптимальных параметров для программы. Неплохо сначала выполнить команду ./configure --help, чтобы увидеть имеющиеся опции.&lt;br /&gt;
&lt;br /&gt;
Вторая команда компилирует приложение, помещая созданные файлы в текущий каталог. Для конфигурирования и компиляции права root не нужны, но третья стадия – это копирование скомпилированных файлов в системные подкаталоги, а потому требует прав root. Вот почему мы используем su для выполнения только этой команды от имени root. Пользователи Ubuntu должны использовать вместо нее команду&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
Если вы не указывали для ./configure путь, то по умолчанию скомпилированная программа устанавливается в /usr/local/bin. Если вы работаете в RPM-системе, а configure сообщает, что не найдена библиотека, хотя вы точно знаете, что она есть – установите соответствующий библиотеке пакет -devel, т.е. libbar-devel.&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_110_1.png</id>
		<title>Файл:Img 83 110 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_110_1.png"/>
				<updated>2008-04-22T18:00:42Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_109_1.png</id>
		<title>Файл:Img 83 109 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_109_1.png"/>
				<updated>2008-04-22T18:00:32Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_108_2.png</id>
		<title>Файл:Img 83 108 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_108_2.png"/>
				<updated>2008-04-22T18:00:20Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_108_1.png</id>
		<title>Файл:Img 83 108 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_108_1.png"/>
				<updated>2008-04-22T18:00:00Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_107_1.png</id>
		<title>Файл:Img 83 107 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_107_1.png"/>
				<updated>2008-04-22T17:59:39Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_106_1.png</id>
		<title>Файл:Img 83 106 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_106_1.png"/>
				<updated>2008-04-22T17:59:31Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_105_2.png</id>
		<title>Файл:Img 83 105 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_105_2.png"/>
				<updated>2008-04-22T17:58:36Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_105_1.png</id>
		<title>Файл:Img 83 105 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_105_1.png"/>
				<updated>2008-04-22T17:58:26Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_104_2.png</id>
		<title>Файл:Img 83 104 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_104_2.png"/>
				<updated>2008-04-22T17:58:12Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_104_1.png</id>
		<title>Файл:Img 83 104 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_104_1.png"/>
				<updated>2008-04-22T17:58:02Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_102_2.png</id>
		<title>Файл:Img 83 102 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_102_2.png"/>
				<updated>2008-04-22T17:57:52Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_102_1.png</id>
		<title>Файл:Img 83 102 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_102_1.png"/>
				<updated>2008-04-22T17:57:36Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_101_1.png</id>
		<title>Файл:Img 83 101 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_101_1.png"/>
				<updated>2008-04-22T17:57:29Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_100_1.png</id>
		<title>Файл:Img 83 100 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_100_1.png"/>
				<updated>2008-04-22T17:57:13Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_94_2.png</id>
		<title>Файл:Img 83 94 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_94_2.png"/>
				<updated>2008-04-22T17:56:52Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_94_1.png</id>
		<title>Файл:Img 83 94 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_94_1.png"/>
				<updated>2008-04-22T17:56:41Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_93_3.png</id>
		<title>Файл:Img 83 93 3.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_93_3.png"/>
				<updated>2008-04-22T17:56:32Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_93_2.png</id>
		<title>Файл:Img 83 93 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_93_2.png"/>
				<updated>2008-04-22T17:56:25Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_93_1.png</id>
		<title>Файл:Img 83 93 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_93_1.png"/>
				<updated>2008-04-22T17:56:18Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_92_1.png</id>
		<title>Файл:Img 83 92 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_92_1.png"/>
				<updated>2008-04-22T17:56:12Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_90_3.png</id>
		<title>Файл:Img 83 90 3.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_90_3.png"/>
				<updated>2008-04-22T17:56:02Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_90_2.png</id>
		<title>Файл:Img 83 90 2.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_90_2.png"/>
				<updated>2008-04-22T17:55:56Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_90_1.png</id>
		<title>Файл:Img 83 90 1.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_90_1.png"/>
				<updated>2008-04-22T17:55:50Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_6.png</id>
		<title>Файл:Img 83 89 6.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_6.png"/>
				<updated>2008-04-22T17:55:40Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_5.png</id>
		<title>Файл:Img 83 89 5.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_5.png"/>
				<updated>2008-04-22T17:55:34Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_4.png</id>
		<title>Файл:Img 83 89 4.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_4.png"/>
				<updated>2008-04-22T17:55:29Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_3.png</id>
		<title>Файл:Img 83 89 3.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A4%D0%B0%D0%B9%D0%BB:Img_83_89_3.png"/>
				<updated>2008-04-22T17:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;Heeppy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Heeppy</name></author>	</entry>

	</feed>